UNIX命令中的隐式系统调用

时间:2016-04-13 01:09:53

标签: linux bash unix posix

我一直在研究UNIX和系统调用,但我遇到了一个低级且棘手的问题。该问题询问为此命令调用了哪些系统调用:

grep word1 word2 > file.txt

我做了一些研究,但我无法在底层UNIX调用上找到大量资源。但是,在我看来答案是open(打开文件file.txt的文件描述符),然后是dup2(更改STDOUT { {1}}到grep的文件描述符,然后openwrite STDOUT(现在是grep的文件描述符) ,最后file.txt,关闭close()的文件描述符...但是,我不知道我是对的还是正确的路径,有UNIX经验的人能否启发我这个主题?

1 个答案:

答案 0 :(得分:5)

您的研究方向正确。此命令对于跟踪任何程序中的系统调用非常有用:

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)                           = ?