2016-04-13 4 views
2

私はUNIXとシステムコールを研究していましたが、私は低レベルで難しい質問に遭遇しました。質問は、システムコールは、このコマンドのために呼ばれているものを尋ねる:UNIXコマンドの暗黙のシステムコール

grep word1 word2 > file.txt

私はいくつかの研究を行なったし、私が呼び出して、基礎となるUNIX上のリソースの膨大な数を見つけることができませんでした。しかし、答えがgrepSTDOUTを書くために、その後、その後open(開いてファイルfile.txtのためのファイル記述子へ)、dup2openのファイルディスクリプタにgrepSTDOUTを変更する)、writeだろうと私には思えます(今はファイル記述子がfile.txt)、そして最後にclose()というファイル記述子を閉じてfile.txtというファイル記述子を閉じます。しかし、正しいパスかどうかはわかりませんが、UNIXでの経験があれば誰でも私を啓発できますこのトピック?

+1

私はあなたがここにあなたの質問に対する答えを見つけることを願ってしかし、あなたは[このスタック](http://unix.stackexchange.com/)がそれに答えるのに適しているかもしれません。運が良かった! – Vandal

+0

[GNU grepのソースコード](http://git.savannah.gnu.org/cgit/grep.git)を見ることができます。 –

+3

'STDOUT'リダイレクトはシェルによって行われ、' grep'はリダイレクトが起こっていることさえ知らず、完全に透過的です。 –

答えて

5

研究の方向性は正しいですか。このコマンドは、システムを追跡するために非常に有用である任意のプログラムで呼び出します。私のPC上で

strace

それは(ストリームのリダイレクトなし)の出力を示しています

$ 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

それはLinux固有のツールです。一般的に、Unixの場合、通常はdtraceを使うことができます。 (これはまもなくLinuxに移植されるだろうと思う。) –

+3

@DavidOngaro:Unixでは 'dtrace'が正常だと主張するのは誇張だと思います。 Solaris上で 'dtrace'を使うことができます(しかし、' truss'はユーザにとっては簡単です)。 Macには 'dtrace'の変種が存在します。他のシステム(HP-UX、AIXなど)では 'dtrace'や' strace'や 'truss'以外のコマンドを使用します。 –