首页 > 代码库 > 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。