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