目录
管道由pipe函数创建,提供一个单向半双工数据流,它没有名字,只能在父子进程间使用。
#include <unistd.h> //成功返回0,失败返回-1 int pipe(int fd[2]);
pipe通过参数fd[2]返回两个文件描述符:fd[0]用于读,fd[1]用于写,管道的典型的用法如下:
这样,就实现了一个从父进程——>子进程的单向数据通道,如下图所示。
当然,上述用法还可以再进一步,父进程fork前再创建一个管道,按相同的方法实现一个从子进程——>父进程的单向数据通道。
两个管道结合,就实现了父子进程之间的双向数据通道,如下图所示。
作为一个关于管道的例子,标准io库提供了popen函数,它创建一个管道并启动另外一个进程,该进程要么通过该管道从标准输入读,要么通过该管道向标准输出写。
#include <stdio.h> //成功返回文件指针,失败返回null file *popen(const char *command, const char *type); //成功返回shell终止状态,失败返回-1 int pclose(file *fp);
其中command必须是一个shell命令行,由popen返回的file指针fp,要么用于输入,要么用于输出,取决于type的值:
pclose关闭由popen创建的标准io流。
fifo也是一个单向半双工数据流,但每个fifo都有一个路径名与之关联,因此可以用于无亲缘关系的进程之间,fifo也称为有名管道。
#include <sys/types.h> #include <sys/stat.h> //成功返回0,失败返回-1 int mkfifo(const char *pathname, mode_t mode);
pathname是用于标识fifo的路径名,mode含义与可设的值同posix ipc创建函数,即6个s_irxxx常值,具体细节在posix信号量一文中有讲过。
如对本文有疑问, 点击进行留言回复!!
linux下文本编辑器vim的使用方法(复制、粘贴、替换、行号、撤销、多文件操作)
网友评论