【发布时间】:2012-09-02 16:00:41
【问题描述】:
有人可以解释一下命令 ls | grep 'xxx' 内部实际发生的情况(调用的系统调用)吗?
【问题讨论】:
-
使用
strace查找系统调用,例如strace -f bash -c 'ls | grep xxx'
标签: linux unix command kernel pipe
有人可以解释一下命令 ls | grep 'xxx' 内部实际发生的情况(调用的系统调用)吗?
【问题讨论】:
strace 查找系统调用,例如strace -f bash -c 'ls | grep xxx'
标签: linux unix command kernel pipe
首先,调用pipe(2,3p) 以创建具有读写端的管道。然后fork(2,3p) 被调用两次,每个命令调用一次。然后dup2(2,3p) 用于用管道的每一端替换每个分叉子项中的适当文件描述符。最后在每个子进程中调用exec(3) 来实际运行命令。
【讨论】:
第一个命令的标准输出作为标准输入馈送到管道中的第二个命令。有几个系统调用您可能有兴趣更详细地了解正在发生的事情,特别是 fork(2)、execve(2)、pipe(2)、dup2(2)、read(2) 和 write (2)。
实际上,shell 将 STDIN_FILENO 和 STDOUT_FILENO 分别安排为管道的读取端和写入端。当管道中的第一个进程执行 write(2) 时,该进程的标准输出被复制为管道的写入端,类似地,当第二个进程对标准输入执行 read(2) 时,它最终从管道的读取端。
当然还有更多细节需要考虑,请查看 Richard Stevens 的《UNIX 环境中的高级编程》等书籍。
【讨论】: