我一直在研究UNIX和系统调用,但我遇到了一个低级且棘手的问题。该问题询问为此命令调用了哪些系统调用:
grep word1 word2 > file.txt
我做了一些研究,但我无法在底层UNIX调用上找到大量资源。但是,在我看来答案是open
(打开文件file.txt
的文件描述符),然后是dup2
(更改STDOUT
{ {1}}到grep
的文件描述符,然后open
写write
STDOUT
(现在是grep
的文件描述符) ,最后file.txt
,关闭close()
的文件描述符...但是,我不知道我是对的还是正确的路径,有UNIX经验的人能否启发我这个主题?
答案 0 :(得分:5)
您的研究方向正确。此命令对于跟踪任何程序中的系统调用非常有用:
在我的电脑上显示输出(没有流重定向):
$ 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) = ?