进程——管道

来源:互联网 发布:js裁剪上传图片的插件 编辑:程序博客网 时间:2024/06/06 02:21
管道是一个进程连接数据流到另一个进程的通道, 它通常是用作把一个进程的输出通过
管道连接到另一个进程的输入。在 Linux 命令中通常通过符号“ |”来使用管道,
例如:

$ ps -ef | grep init

此命令中 ps 是一个独立的进程, grep 也是一个独立的进程,中间的管道把本来要输出
到屏幕的数据输出到 grep 这个进程中,作为 grep 这个进程的输入。


管道分为匿名管道命名管道两种;
匿名管道主要用于两个进程间有父子关系的进程间通信;
命名管道主要用于没有父子关系的进程间通信;

1. 匿名管道
匿名管道是不能在文件系统中以任何方式看到的半双工管道。半双工管道意味着管道的
一端只读或只写。

pipe()函数可以用来创建一条匿名管道,它的原型如下:

#include <unistd.h>
int pipe(int pipefd[2]);

函数成功返回 0,否则返回-1。
参数 pipefd 是一个文件描述符数组,对应着打开管道的两端,
其中 pipefd[0]为读端,pipefd[1]为写端,往写端写的数据会被内核缓存起来,直到读端将数据读完。


2. 命名管道
命名管道也被称为 FIFO 文件, 它突破了匿名管道无法在无关进程之间通信的限制,使
得同一主机内的所有的进程都可以通信。
同时命名管道是一个特殊的文件类型,它在文件系统中以文件名的形式存在,在 stat结构中 st_mode 指明一个文件结点是不是命名管道。

mkfifo()函数用来创建一个命名管道,它的原型如下:

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

mkfifo()创建一个真实存在于文件系统中的命名管道文件,
参数 pathname指定了文件名
参数 mode 则指定了文件的读写权限。 
函数成功返回 0,否则返回-1 并设置 errno

mkfifo()创建命名管道文件后,需要通过命名管道通信的进程需要打开该管道文件,然后通过 read、 write 函数像操作普通文件一样进行通信。
0 0
原创粉丝点击