《unix高级环境编程》进程间通信——管道和FIFO

        管道是早期 UNIX 系统的 IPC 机制,并且所有的 UNIX 系统都提供了管道通信机制。管道的一个显著性特点就是:当一个管道建立后,将获的两个文件描述符,分别用于对管道读取和写入,通常将其称为管道的写入端和管道的读取端,从写入端写入管道的任何数据都可以从读取端读取。对于一个进程来说,管道的写入和读取操作与写入和读取一个普通文件没有区别,只是在内核中通过这种机制来实现进程间通信。

管道 IPC 有以下两个特性:

  1. 管道只提供半双工数据通信方式,即只允许单方向传输数据;
  2. 管道只能在具有亲缘关系的进程间通信(只能用于两个进程间通信,而不能用于多个进程),由于管道没有名字,所以不能跨进程的地址空间进行使用;

管道的操作

        创建一个管道的系统调用函数如下:

/* 管道 */
/*
 * 函数功能:创建一个管道;
 * 返回值:若成功则返回0,若出错则返回-1;
 * 函数原型:
 */
#include 
int pipe(int filedes[2]);
/*
 * 说明:
 * 该函数的参数是一个二元整数数组,用于存放调用该函数所创建管道的两个文件描述符;
 * filedes[0]为读而打开,存放管道的读取端的文件描述符;
 * filedes[1]为写而打开,存放管道的写入端的文件描述符;
 * filedes[1]的输出是filedes[0]的输入;
 * 内核对于管道的filedes[0]以只读方式打开的,filedes[1]是以只写方式打开的,所以管道只能保证单向的数据通信;
 */
        调用 pipe 函数创建一个管道后,还不能实现通过管道在两个进程间通信,因为此时管道的读取端和写入端的文件描述符同属于一个进程。通常是在调用 pipe 函数完成后,调用 fork 函数创建一个子进程,需要时调用 exec 函数族使子进程执行所需程序。然后根据数据传输的方向分别关闭父进程和子进程中的一个文件描述符。例如:要实现父进程向子进程的数据传输,则需要关闭父进程的读取端文件描述符和子进程的写入端文件描述符。下面是进程之间的管道关系:

《unix高级环境编程》进程间通信——管道和FIFO_第1张图片          

你可能感兴趣的:(Unix,高级环境编程,UNIX高级环境编程,进程间通信,管道,popen,函数,pclose,函数)