- int pipe(int p[2])
- 函数作用:生成一个管道,将管道读端的文件标识符存到p[0]中,将管道写端的文件标识符存到p[1]中。
- 返回值:若成功返回0,失败返回-1
- 管道的理解
如图,当创建完管道以后的父进程fork出两个子进程的时候,两个子进程会继承这个父进程创建的管道,而且是同一份管道实例。不同于局部变量x,三个进程各自拥有各自的x且互不干扰。
因此实际上将管道抽象来看可以堪称下面这样:三个进程共享一个管道,完成了进程间的通信
- dup(int a,int b)- 将文件标识符b指向a所指的位置
- 若a无效,则函数返回错误
- 若a有效
- 若b还未被使用,则新建b并完成指向复制
- 若b已经被使用,则关闭已经使用的文件,转指向a的位置(这两步操作为原子性)
- 若b已经和a指向相同位置了,则什么也不做(不会没有意义地关闭再打开一次)
- 补充知识:“标准输入”和“标准输出”也都是文件标识符,是属于进程空间的而非系统空间的,也就是说随着进程的创建这两个文件标识符自动生成,标准输入默认指向键盘,标准输出默认指向屏幕。可以使用dup函数将标准输入和输出重定向,比如
dup(4,STDOUT_FILENO);
可以将标准输出重定向到4这个位置,若4为某管道的读端,则之后的标准输出都会输出到管道的读端而非屏幕上