2016-04-13 48 views
2

UNIX ve sistem çağrıları üzerinde çalışıyorum ve düşük düzeyli ve zor sorularla karşılaştım. sorusu sistem çağrıları bu komut için ne denir sorar:UNIX komutlarında örtülü sistem çağrıları

grep word1 word2 > file.txt

biraz araştırma yaptım ve aramaları altında yatan UNIX kaynakların çok sayıda bulamadı. Ancak, cevap open olacağını geliyor bana (açmak ve dosyanın file.txt için dosya tanıtıcı), sonra dup2STDOUTgrep ait yazmak için, sonra write (open dosya tanımlayıcısı grep arasında STDOUT değiştirmek için) (şimdi file.txt dosya tanıtıcısı olan) ve son olarak dosya tanımlayıcısını kapatmak için close() ... Ancak, doğru veya doğru yolda olup olmadığımı bilmiyorum, UNIX'teki deneyimi olan herkes beni aydınlatsın bu konu?

+1

Burada sorunuzun yanıtını bulmak umut Bu komut herhangi bir programa sistem İz çok yararlıdır Ancak, [bu yığının] (http://unix.stackexchange.com/) yanıtlamak için daha uygun olduğunu görebilirsiniz. İyi şanslar! – Vandal

+0

Sen (http://git.savannah.gnu.org/cgit/grep.git) [GNU grep kaynak koduna] bir göz olabilir. –

+3

'STDOUT' yönlendirme kabuk tarafından yapılır,' grep' hatta bir yönlendirme oluyor bilmiyor, bu tamamen şeffaf bu. –

cevap

5

Araştırmanızda doğru yönde ilerliyorsunuz.

benim PC'de strace

o (akış yönlendirme olmadan) çıkış gösterir:

$ strace grep abc ss.txt 
execve("/bin/grep", ["grep", "abc", "ss.txt"], [/* 237 vars */]) = 0 
brk(0)         = 0x13de000 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1785694000 
close(3)        = 0 
ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 
stat("ss.txt", {st_mode=S_IFREG|0644, st_size=13, ...}) = 0 
open("ss.txt", O_RDONLY)    = 3 
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffa0e4f370) = -1 ENOTTY (Inappropriate ioctl for device) 
read(3, "abc\n123\n321\n\n", 32768)  = 13 
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f178568c000 
write(1, "abc\n", 4abc 
)     = 4 
read(3, "", 32768)      = 0 
close(3)        = 0 
close(1)        = 0 
munmap(0x7f178568c000, 4096)   = 0 
close(2)        = 0 
exit_group(0)       = ? 
+1

Ama bu Linux'a özgü bir araçtır. Genel olarak Unix için normalde 'dtrace' kullanabilirsiniz. (Bence yakında Linux'a da taşınacağını düşünüyorum.) –

+3

@DavidOngaro: Unix için dtrace'in normal olduğunu iddia etmek abartı olurdu, bence. Solaris'te 'dtrace 'kullanabilirsiniz (truss'un kullanıcı için daha basit olmasına rağmen); Mac’de bir dtrace’in varyantı vardır; ancak diğer sistemler (HP-UX, AIX,…) diğer komutları kullanır (“dtrace” veya “strace” veya “truss”). –