UNIX 命令中的隐式系统调用

Implicit system calls in UNIX commands

我一直在研究 UNIX 和系统调用,我遇到了一个低级和棘手的问题。问题是问这个命令调用了哪些系统调用:

grep word1 word2 > file.txt

我做了一些研究,但无法找到有关底层 UNIX 调用的大量资源。但是,在我看来,答案是 open(打开文件 file.txt 的文件描述符),然后是 dup2(更改 STDOUT grepopen的文件描述符),然后write写入grepSTDOUT(现在是file.txt的文件描述符) ,最后 close(),关闭 file.txt 的文件描述符......但是,我不知道我是否正确或在正确的路径上,任何有 UNIX 经验的人都可以就这个话题启发我?

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

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