流水线如何工作?

时间:2012-09-09 16:04:36

标签: linux unix command kernel pipe

有人可以解释命令 ls | grep 'xxx' 内部实际发生的事情(被调用的系统调用)?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

实际上,shell将STDIN_FILENO和STDOUT_FILENO分别排列为管道的读端和写端。当管道中的第一个进程执行write(2)时,该进程的标准输出被复制为管道的写入端,类似地,当第二个进程对标准输入执行read(2)时,它最终会从管道的读端。

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