39 | 管道:项目组A完成了,如何交接给项目组B?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
匿名管道和命名管道是进程间通信的重要方式,本文深入介绍了它们的原理和实现方式。文章首先详细解释了管道的创建过程,包括系统调用创建管道、内核中管道的逻辑实现以及管道文件系统的创建和挂载过程。接着分析了匿名管道和命名管道的创建过程,包括创建管道文件、inode和文件描述符等操作。此外,文章还讲解了父子进程之间的通信和在shell中使用管道的原理。通过代码示例演示了如何在父子进程和shell中使用管道进行通信,以及如何使用系统调用将管道的两端和输入输出关联起来。 总的来说,本文内容深入浅出,适合读者快速了解匿名管道和命名管道的实现原理和使用方式。文章通过对管道的创建过程和使用方法进行详细解释,帮助读者理解了管道在进程间通信中的重要作用。此外,文章还提供了课堂练习建议,鼓励读者通过实际操作和系统调用比较来加深对管道的理解。整体而言,本文为读者提供了全面而实用的关于匿名管道和命名管道的知识,对于想要深入了解进程间通信的读者来说,是一篇不可多得的好文。 文章中还介绍了特殊的inode、字符设备和块设备,以及管道特殊的pipefifo_fops,通过对这些技术细节的讲解,读者可以更深入地理解管道在内核中的实现原理。最后,文章鼓励读者留言分享疑惑和见解,以及与朋友一起学习进步,为读者提供了更多学习交流的机会。 总之,本文内容丰富,涵盖了匿名管道和命名管道的原理、创建过程和使用方法,同时通过技术细节的讲解和实际操作的建议,帮助读者更好地理解和掌握了这一重要的进程间通信方式。
《趣谈 Linux 操作系统》,新⼈⾸单¥68
全部留言(16)
- 最新
- 精选
- 欢乐小熊- 匿名管道: 只能在管道创建进程及其后代之间通信 - 通过 pipe 系统调用创建 - **inode 由特殊的文件系统 pipefs 创建** - **inode 关联的 fos 为 pipefifo_fops** - 命名管道: 通过管道文件名, 可以在任意进程之间通信 - 通过 mkfifo Glibc 库函数创建 - 内部调用 mknodat 系统调用 - **inode 由普通文件系统创建, 真实存在于磁盘中** - **inode 关联的 fos 与匿名管道一致, 为 pipefifo_fops** 老师, 在阅读的过程中产生了一个疑问, 匿名管道创建 inode 使用到的文件系统 pipefs, 也是属于内存文件系统吗? 这个 inode 是否会写到磁盘上呢?
作者回复: 不会到磁盘上,假的inode
2019-06-278 - 海军上校管道代码是不是写错啦?pid=0应该是子进程 close fd1吧 我理解的
作者回复: 不是的,留着fd1
2019-07-2933 - 八台上请问 管道是特殊的inode 这个inode也会占用磁盘吗 不然机器重启的时候不就没了吗?
作者回复: 管道重启就没了
2020-06-112 - 石维康在ext4_mknod函数里调用init_special_inode时传入的是上一步ext4_new_inode_start_handle返回的inode。为什么文中还会说"但是会调用 init_special_inode,创建一个内存中特殊的 inode"? 在init_special_inode中也没有看到创建虚拟inode的地方?
作者回复: 参数不是struct inode *inode
2019-06-261 - cuikt老师你好,我在shell中执行echo 'aaa' | > a.txt ,为什么a.txt文件被创建了,但是a.txt是空的呢?
作者回复: 命令写的有问题,echo 'aaa'的输出,是后面的输入,而>的意思是输出导向a.txt,和输入没有关系呀
2019-07-082 - 有铭管道更像是流处理,还是批处理?
作者回复: 都不像吧
2019-06-26 - shangyu请问下老师pipe的缓存大小是多少呢 如果进程a的输出太大会有什么影响呢2019-12-2213
- xavier好奇想问,在举例中的那个shell创建A和B进程的时候,在fork生成 B进程的时候,是保留了B进程的管道输出的部分,而将shell父进程的管道输出关闭掉了,那如果shell紧接着再去fork一个C进程,岂不是管道的输入和输出都没有了?2020-12-1932
- 奔跑的码仔strace -f -o file ./npipe 可以看到咱们父、子进程的整个执行过程。 strace -f -o file1 ps -ef | grep systemd只可以看到ps -ef命令的execv,看不到grep命令的。2019-09-292
- 静✨看了三遍 居然看懂了。 这个创建管道的实现真是牛皮2021-05-211