趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

39 | 管道:项目组A完成了,如何交接给项目组B?

init_special_inode
ext4_mknod
get_pipe_inode
create_pipe_files
__do_pipe_flags
SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags)
SYSCALL_DEFINE1(pipe, int __user *, fildes)
文件描述符操作
内核缓存
内核实现
系统调用:SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev)
Glibc函数:int mkfifo(const char *path, mode_t mode)
父子进程通信
文件描述符操作
内核缓存
内核实现
系统调用:int pipe(int fd[2])
使用strace查看系统调用
运行匿名管道程序
文件操作
特殊inode
管道与文件
管道操作
创建管道
管道操作
创建管道
课堂练习
总结时刻
命名管道
匿名管道
管道

该思维导图由 AI 生成,仅供参考

在这一章的第一节里,我们大致讲了管道的使用方式以及相应的命令行。这一节,我们就具体来看一下管道是如何实现的。
我们先来看,我们常用的匿名管道(Anonymous Pipes),也即将多个命令串起来的竖线,背后的原理到底是什么。
上次我们说,它是基于管道的,那管道如何创建呢?管道的创建,需要通过下面这个系统调用。
int pipe(int fd[2])
在这里,我们创建了一个管道 pipe,返回了两个文件描述符,这表示管道的两端,一个是管道的读取端描述符 fd[0],另一个是管道的写入端描述符 fd[1]。
我们来看在内核里面是如何实现的。
SYSCALL_DEFINE1(pipe, int __user *, fildes)
{
return sys_pipe2(fildes, 0);
}
SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags)
{
struct file *files[2];
int fd[2];
int error;
error = __do_pipe_flags(fd, files, flags);
if (!error) {
if (unlikely(copy_to_user(fildes, fd, sizeof(fd)))) {
......
error = -EFAULT;
} else {
fd_install(fd[0], files[0]);
fd_install(fd[1], files[1]);
}
}
return error;
}
在内核中,主要的逻辑在 pipe2 系统调用中。这里面要创建一个数组 files,用来存放管道的两端的打开文件,另一个数组 fd 存放管道的两端的文件描述符。如果调用 __do_pipe_flags 没有错误,那就调用 fd_install,将两个 fd 和两个 struct file 关联起来。这一点和打开一个文件的过程很像了。
我们来看 __do_pipe_flags。这里面调用了 create_pipe_files,然后生成了两个 fd。从这里可以看出,fd[0]是用于读的,fd[1]是用于写的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
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-27
    8
  • 海军上校
    管道代码是不是写错啦?pid=0应该是子进程 close fd1吧 我理解的

    作者回复: 不是的,留着fd1

    2019-07-29
    3
    3
  • 八台上
    请问 管道是特殊的inode 这个inode也会占用磁盘吗 不然机器重启的时候不就没了吗?

    作者回复: 管道重启就没了

    2020-06-11
    2
  • 石维康
    在ext4_mknod函数里调用init_special_inode时传入的是上一步ext4_new_inode_start_handle返回的inode。为什么文中还会说"但是会调用 init_special_inode,创建一个内存中特殊的 inode"? 在init_special_inode中也没有看到创建虚拟inode的地方?

    作者回复: 参数不是struct inode *inode

    2019-06-26
    1
  • cuikt
    老师你好,我在shell中执行echo 'aaa' | > a.txt ,为什么a.txt文件被创建了,但是a.txt是空的呢?

    作者回复: 命令写的有问题,echo 'aaa'的输出,是后面的输入,而>的意思是输出导向a.txt,和输入没有关系呀

    2019-07-08
    2
  • 有铭
    管道更像是流处理,还是批处理?

    作者回复: 都不像吧

    2019-06-26
  • shangyu
    请问下老师pipe的缓存大小是多少呢 如果进程a的输出太大会有什么影响呢
    2019-12-22
    1
    3
  • xavier
    好奇想问,在举例中的那个shell创建A和B进程的时候,在fork生成 B进程的时候,是保留了B进程的管道输出的部分,而将shell父进程的管道输出关闭掉了,那如果shell紧接着再去fork一个C进程,岂不是管道的输入和输出都没有了?
    2020-12-19
    3
    2
  • 奔跑的码仔
    strace -f -o file ./npipe 可以看到咱们父、子进程的整个执行过程。 strace -f -o file1 ps -ef | grep systemd只可以看到ps -ef命令的execv,看不到grep命令的。
    2019-09-29
    2
  • 静✨
    看了三遍 居然看懂了。 这个创建管道的实现真是牛皮
    2021-05-21
    1
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部