2

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

4

2 回答 2

3

首先,pipe(2,3p)调用它是为了创建具有读写端的管道。fork(2,3p)然后被调用两次,每个命令一次。然后dup2(2,3p)用于用管道的每一端替换每个分叉子项中的适当文件描述符。最后exec(3)在每个孩子中调用以实际运行命令。

于 2012-09-09T16:12:56.007 回答
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 环境中的高级编程。

于 2012-09-09T16:14:02.780 回答