pipe和fifo二三事

1.管道是什么?node

管道是一种只存在于内存的特殊文件,没有磁盘文件与之对应。管道是经过虚拟文件系统pipefs而实现的,pipefs与proc、sysfs等特殊文件系统同样,只存在于内存中。另外,管道只能用于半双工通讯。shell

2.pipe()一个管道意味着什么?数组

pipe()在pipefs文件系统中建立一个新的索引节点,同时建立两个file对象,一个file对象用于读操做,一个file对象用于写操做。pipe()最终将两个file对象对应的文件描述符返回给用户态进程,也就是向pipe()中传递的fd数组。数据结构

3.子进程execv()后是否还能继续共享父进程的管道?并发

子进程execv()后,不能再继续使用父进程建立的管道,由于子进程当前的上下文已经彻底被可执行文件替换。若是要继续使用管道,子进程能够在execv()以前将两个文件描述符重定向到标准输入和输出。框架

4.描述管道的数据结构与索引节点的关系?对象

管道虽然是一种特殊文件,它仍然经过VFS框架中的inode来描述。因为VFS要对全部不一样的文件进行抽象描述,所以inode只对全部文件的共性进行描述。inode中的i_pipe字段指向pipe_inode_info结构,该结构用于描述管道的特性。索引

5.写管道时写入的字节量与管道大小的关系?进程

管道缓冲区一般为一个单独的页框,所以大小默认为4096字节。若是两个或者多个进程并发的写入一个管道,那么任何少于4096字节的写操做都是原 子的。可是,若是向管道写入大于管道缓冲区大小的数据,则写操做是能够分割的,也就是说多个进程的写操做能够交叉进行,此时应该注意进程的同步。ip

6.有名管道是什么?

有名管道是一种设备文件,有对应的磁盘索引节点。由于存在于磁盘上,所以能够被任何进程打开使用。有名管道是一种半双工通讯方式。

7.ls | more 的大体执行过程?

在终端执行ls | more时,shell进程fork()出一个进程A用来执行上述命令。A进程调用pipe(),返回文件描述符fd1和fd2,分别用于读和写管道。进程A两次调用fork(),产生两个子进程。进程A关闭fd1和fd2。

对于第一个子进程,它调用dup2(fd2,1)将写文件描述符重定向到标准输出。接下来调用execv()系统调用执行ls程序,该程序将本身的输出写入管道。

对于第二个子进程,它调用dup2(fd1,0)将读文件描述符重定向到标准输入。接下来调用execv()系统调用执行more程序,该程序从管道中读取数据。

相关文章
相关标签/搜索