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,用於保存建立的套接字對。

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