首页 > 代码库 > Linux进程间通信程序设计2----管道通信
Linux进程间通信程序设计2----管道通信
一、无命名管道
1、什么是管道
管道是单向、先进先出的,把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道尾部写入数据,另一个进程(读进程)在管道头部读出数据。
2、管道创建
无名管道:(只)父进程与子进程间的通信。
有名管道:同一系统中任意两个进程间的通信。
无名管道由pipe()函数创建;
int pipe(int filedis[2]);
当一个管道建立时,它会创建两个文件描述符:filedis[0]用于读管道,filedis[1]用于写管道。
管道通信:
关闭管道只需要将文件描述符关闭即可。可以使用close函数逐一关闭。
例如:创建管道yu关闭
int main()
{
int pipe_fd[2];
if(pipe(pipe_fd)<0)
{
printf("pipe create error\n");
return -1;
}
else{
printf("pipe create success\n")
}
close(pipe_fd[0]);
close(pipe_fd[1]);
}
3、管道读写
管道用于不同进程间的通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道。
注意:必须在系统调用fork()前,调用pipe(),否则子进程将不会继承文件描述符。
二、命名管道(FIFO)
无命名管道只能父子进程使用;但是命名管道,不相关的进程也能交换数据。
实质上讲:命名管道就是个文件
1、创建
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char* pathname,mode_t mode)
pathname:FIFO文件名
mode:属性S_IRUSR S_IWUSR S_IXUSR S_IRWXU。
一旦创建了FIFO,就可以用open close read write 操作FIFO。
2、操作
当打开FIFO,非阻塞标志(O_NONBLOCK)将对以后读写产生如下影响:
1)没有使用O_NONBLOCK:访问要求无法满足时进程将阻塞。如试图读取空的FIFO,将导致进程阻塞。
2)使用O_NONBLOCK:访问要求无法满足时不阻塞,立即出错返回,errno是ENXIO。