2012-09-09 60 views
2

有人可以解释命令内部实际发生了什么(系统调用称为)ls | grep 'xxx'流水线如何工作?

+4

使用'strace'来查找系统调用,例如'strace -f bash -c'ls | grep xxx'' –

回答

2

第一个命令的标准输出作为标准输入输入到管道中的第二个命令。有几个系统调用,您可能有兴趣了解更多详细信息,特别是fork(2),execve(2),pipe(2),dup2(2),read(2)和write (2)。

实际上,shell将STDIN_FILENO和STDOUT_FILENO分别设置为管道的读端和写端。当流水线中的第一个进程执行写操作(2)时,该进程的标准输出被复制为管道的写端,类似地,当第二个进程对标准输入进行读(2)时,它最终从管道的读取结束。

当然还有更多细节需要考虑,请查看Richard Stevens在UNIX环境下的高级编程等书籍。

3

首先,调用pipe(2,3p)以创建具有读写结束的管道。然后调用fork(2,3p)两次,每次命令一次。然后使用dup2(2,3p)来替换管道每端的每个分叉子节点中的相应文件描述符。最后在每个孩子中调用exec(3)以实际运行命令。