1. 程式人生 > >查漏補缺:進程間通信(IPC):管道

查漏補缺:進程間通信(IPC):管道

文件 lap ipc spl ont unix aps class std

  管道是UNIX系統IPC的最古老形式,所有UNIX系統都提供此種通信機制。管道有以下兩種局限性:

  (1)歷史上,管道是半雙工的(即數據只能在一個方向上流動)。

  (2)管道只能在具有公共先祖的兩個進程之間使用。通常,一個管道有一個進程創建,在進程調用fork之後,這個管道就能在父子進程間使用。

  管道的創建:

  管道通過調用pipe函數創建。

  頭文件:#include <unistd.h>

  原型:int pipe(int fd[2])

  返回值:成功,返回0;失敗,返回-1.

  經由參數fd返回兩個文件描述符:fd[0]為 讀而打開,fd[1]為寫而打開。fd[1]的輸出是fd[0]的輸入。

  圖解如下:

  技術分享

  測試程序:

技術分享
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 
 5 int main(int argc,char* argv[])
 6 {
 7     int n;
 8     int fd[2];
 9     pid_t pid;
10     char buf[128] = {0};
11 
12     if(pipe(fd) < 0)
13     {
14         printf("pipe error\n
"); 15 return -1; 16 } 17 18 if((pid = fork()) < 0) 19 { 20 printf("fork error\n"); 21 return -1; 22 } 23 else if(pid > 0) 24 { 25 close(fd[0]); 26 printf("父進程ID:%d,子進程ID:%d\n",getpid(),pid); 27 write(fd[1],"hello world\n",sizeof
("hello world\n")); 28 } 29 else 30 { 31 close(fd[1]); 32 n = read(fd[0],buf,sizeof(buf)); 33 printf("子進程ID:%d\n",getpid()); 34 write(STDOUT_FILENO,"子進程:",sizeof("子進程:")); 35 write(STDOUT_FILENO,buf,n); 36 } 37 38 return 0; 39 40 }
View Code

查漏補缺:進程間通信(IPC):管道