UNIX命令中的隐式系统调用
我一直在研究UNIX和系统调用,并且遇到了一些低级和棘手的问题。 问题是询问该命令需要什么系统调用:
grep word1 word2 > file.txt
我做了一些研究,但无法在底层的UNIX调用中找到大量的资源。 但是,在我看来,答案将会open
(打开文件file.txt
的文件描述符),然后dup2
(将grep
的STDOUT
更改为open
文件描述符),然后write
以写入STDOUT
的grep
(现在是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, "abcn123n321nn", 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, "abcn", 4abc
) = 4
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
munmap(0x7f178568c000, 4096) = 0
close(2) = 0
exit_group(0) = ?
链接地址: http://www.djcxy.com/p/78005.html