Linux进程间通信方式二:无名管道

无名管道相对于有名管道而言,它不存在管道文件,它实现进程间通信的一般方式是借助父子进程共享fork之前打开的文件描述符,所以无名管道只能应用于父子进程间通讯。

无名管道有两种局限性

  1. 历史上,无名管道是半双工通信的信道,也就是说,一个进程写的时候,另一个进程只能读,同时只有一个进程进行读,也只有一个进程进行写操作。
  2. 他们只能在具有公共祖先的进程之间使用,也就是我们所说的父子进程。

创建无名管道的系统调用如下:

该系统调用的参数是一个数组,这个数组是用来接受该函数返回的两个文件描述符,f[0]为读而打开,f[1]为写而打开,使用f[1]写进去的数据,就可以使用f[0]读出来。

要知道,单个进程中管道几乎没有任何作用,通常情况下,调用pipe接着调用fork,这样就创建了从父进程到子进程或者从子进程到父进程的IPC(进程间通讯)通道。

当无名管道的一段被关闭之后,下列两条规则会起作用:

  1. 当读一个写端已经被关闭的管道时,在所有数据都被读取后,read返回0,来表示达到了文件结束处。
  2. 如果写一个读端已经被关闭的管道,则会产生一个信号:SIGPIPE,如果忽略或者捕捉该信号并从其处理程序返回,则write函数返回-1.

下面我们利用一个例子说明一下:

子进程写数据,父进程读数据并输出每一个字符所对应的ASCII码。

运行结果如下:

猜你喜欢

转载自blog.csdn.net/Mr_H9527/article/details/83245786