▋1. 管道的概念程序員
管道,又名「無名管理」,或「匿名管道」,管道是一種很是基本,也是使用很是頻繁的IPC方式。面試
1.1 管道本質架構
1.2 管道原理函數
管道是內核的一塊緩衝區,更具體一些,是一個環形隊列。數據從隊列的一端寫入數據,另外一端讀出,以下圖示:學習
1.3 管道的優勢網站
簡單人工智能
1.4 管道的缺點spa
▋2. 管道的建立code
管道建立三步曲:blog
a. 父進程調用pipe函數建立管道;
b. 父進程調用fork函數建立子進程;
c. 父進程關閉fd[0],子進程關閉fd[1];
具體以下圖所示:
▋3. 管道的讀寫行爲
a. 管道的緩衝區大小固定爲4k,因此若是管道內數據已經寫滿,則沒法再寫入數據,進程的write調用將阻塞,直到有足夠的空間再寫入數據;
b. 管道的讀動做比寫動做要快,數據一旦被讀走了,管道將釋放相應的空間,以便後續數據的寫入。當全部的數據都讀完以後,進程的read()調用將阻塞,直到有數據再次寫入。
▋4. 例程
父子間通訊:
1#include <stdio.h> 2#include <sys/types.h> 3#include <unistd.h> 4#include <string.h> 5 6int main() 7{ 8 int fd[2]; 9 pid_t pid; 10 char buf[1024]; 11 char *data = "hello world!"; 12 13 /* 建立管道 */ 14 if (pipe(fd) == -1) { 15 printf("ERROR: pipe create failed!\n"); 16 return -1; 17 } 18 19 pid = fork(); 20 if (pid == 0) { 21 /* 子進程 */ 22 close(fd[1]); // 子進程讀取數據,關閉寫端 23 read(fd[0], buf, sizeof(buf)); // 從管道讀數據 24 printf("child process read: %s\n", buf); 25 close(fd[0]); 26 } else if (pid > 0) { 27 /* 父進程 */ 28 close(fd[0]); //父進程寫數據,關閉讀端 29 write(fd[1], data, strlen(data)); // 向管道寫數據 30 printf("parent process write: %s\n", data); 31 close(fd[1]); 32 } 33 34 return 0; 35}
兄弟間通訊:
1#include <stdio.h> 2#include <sys/types.h> 3#include <unistd.h> 4#include <string.h> 5#include <sys/wait.h> 6 7int main () 8{ 9 int fd[2]; 10 int i = 0; 11 pid_t pid; 12 char buf[1024]; 13 char *data = "hello world!"; 14 15 /* 建立管道 */ 16 if (pipe(fd) == -1) { 17 printf("ERROR: pipe create failed!\n"); 18 return -1; 19 } 20 21 for (i = 0; i < 2; i++) { 22 pid = fork(); 23 if (pid == -1) { 24 printf("ERROR: fork error!\n"); 25 return -1; 26 } else if (pid == 0) { 27 break; 28 } 29 } 30 31 /* 經過i來判斷建立的子進程及父進程 */ 32 if (i == 0) { 33 /* 第一個子進程,兄進程 */ 34 close(fd[0]); // 兄進程向弟進程寫數據,關閉讀端 35 write(fd[1], data, strlen(data)); 36 printf("elder brother send: %s\n", data); 37 close(fd[1]); 38 } else if (i == 1) { 39 /* 第二個子進程,弟進程 */ 40 close(fd[1]); 41 read(fd[0], buf, sizeof(buf)); 42 printf("younger brother receive: %s\n", buf); 43 close(fd[0]); 44 } else { 45 /* 父進程 */ 46 close(fd[0]); 47 close(fd[1]); 48 for (i = 0; i < 2; i++) { 49 wait(NULL); 50 } 51 } 52 53 return 0; 54}
更多精彩內容,請關注公衆號良許Linux,公衆內回覆1024可免費得到5T技術資料,包括:Linux,C/C++,Python,樹莓派,嵌入式,Java,人工智能,等等。公衆號內回覆進羣,邀請您進高手如雲技術交流羣。
最後,最近不少小夥伴找我要Linux學習路線圖,因而我根據本身的經驗,利用業餘時間熬夜肝了一個月,整理了一份電子書。不管你是面試仍是自我提高,相信都會對你有幫助!
免費送給你們,只求你們金指給我點個贊!
也但願有小夥伴能加入我,把這份電子書作得更完美!
推薦閱讀: