Linux上实现双向进程间通信管道(socketpair)

Linux 提供了 popen 和 pclose 函数,用于创建和关闭管道与另外一个进程进行通信。其接口如下:

  1. FILE *popen(const char *command, const char *mode);  
  2. int pclose(FILE *stream);  
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);

遗憾的是,popen 创建的管道只能是单向的 – mode 只能是 “r” 或 “w” 而不能是某种组合–用户只能选择要么往里写,要么从中读,而不能同时在一个管道中进行读写。实际应用中,经常会有同时进行读写的要求。

使用pipe就只能如此了。不过,Linux实现了一个源自BSD的socketpair调用,可以实现上述在同一个文件描述符中进行读写的功能。该系统调用能创建一对已连接的UNIX族socket。在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写,函数原型如下:

  1. int socketpair(int d, int type, int protocol, int sv[2]);   
int socketpair(int d, int type, int protocol, int sv[2]); 
参数介绍:
socketpair()函数建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。
第1个参数d,表示协议族,只能为AF_LOCAL或者AF_UNIX;
第2个参数type,表示类型,只能为0。
第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数sv,用于保存建立的套接字对。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章