查漏補缺:進程間通信(IPC):管道
阿新 • • 發佈:2017-10-18
文件 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\nView Code"); 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 }
查漏補缺:進程間通信(IPC):管道