有人可以解释命令内部实际发生了什么(系统调用称为)ls | grep 'xxx'
?流水线如何工作?
Q
流水线如何工作?
2
A
回答
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)
以实际运行命令。
相关问题
- 1. 流水线工作流程和变量
- 2. 无法获得Scrapy流水线工作
- 3. Jenkins使用Groovy流水线脚本的多流水线工程
- 4. 流水线中ForEach-Object cmdlet的执行顺序如何工作?
- 5. mongodb聚合框架流水线如何工作?
- 6. 如何强制流水线
- 7. Redis流水线
- 8. 在流水线
- 9. 与流水线
- 10. 流水线vs
- 11. Bitbucket流水线
- 12. 流到mysql的流水线
- 13. 如何在MailKit中启用流水线
- 14. 如何用perl建立流水线
- 15. 如何在Redis中插入(替换)操作? (如流水线)
- 16. 装配流水线
- 17. WebServices流水线(Springboot)
- 18. 是68HC11流水线?
- 19. 流水线功能
- 20. 并行流水线
- 21. Android HTTP流水线
- 22. 流水线架构
- 23. DataTables,Ajax流水线
- 24. CacheManager.Net - Redis流水线
- 25. 多枝流水线作业请求
- 26. 作为原子的Redis流水线
- 27. Galleria JS不能在Rails流水线生产中工作
- 28. 为什么du或echo流水线不工作?
- 29. Redis客户端如何实现流水线操作?
- 30. 与詹金斯工作流程/流水线并行运行的阶段
使用'strace'来查找系统调用,例如'strace -f bash -c'ls | grep xxx'' –