您好,登錄后才能下訂單哦!
這篇文章主要介紹linux中匿名管道的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
linux中進程的一種通信方式——匿名管道
pipe函數建立管道
調用pipe函數時在內核中開辟一塊緩沖區(稱為管道)用于通信,它有一個讀端一個寫端,然后通過_pipe參數傳出給用戶程序兩個文件描述符,_pipe[0]指向管道的讀端,_pipe[1]指向管道的寫端。所以管道在用戶程序看起來就像一個打開的文件,通過read(_pipe[0]);或者write(_pipe[1]);向這個文件讀寫數據其實是在讀寫內核緩沖區。pipe函數調用成功返回0,調用失敗返回-1。
1父進程調用pipe開辟管道,得到兩個文件描述符指向管道的兩端。
2. 父進程調用fork創建?進程,那么子進程也有兩個文件描述符指向同一管道。
3. 父進程關閉管道讀端,子進程關閉管道寫端。父進程可以往管道里寫,子進程可以從管道?讀,管道是用環形隊列實現的,數據從寫端流入從讀端流出,這樣就實現了進程間通信
匿名管道間的通信是單向的,并且是、只能是具有血緣關系的進程間通信
#include<stdio.h> #include<unistd.h> #include<string.h> #include<stdlib.h> int main() { int _pipe[2]; int ret = pipe(_pipe); if (ret < 0) { perror("pipe"); return 1; } pid_t id = fork (); if (id<0) { perror("fork"); return 2; } else if (id == 0) { // child int count =5; close (_pipe[0]); char* msg = "hello bit"; while (count --) { write(_pipe[1],msg,strlen(msg)); sleep(1); } close (_pipe[1]); exit(123); } else { // Father close(_pipe[1]); char buf[128]; while(1) { int count =5; ssize_t s = read ( _pipe[0],buf,sizeof(buf)-1); if (s<0) { perror("read"); } else if(s==0) { printf("write is close\n"); return 2; } else { buf[s] ='\0'; printf ("child >> father: %s\n",buf); } count --; if (count == 0) { close (_pipe[0]); break; } } int status = 0; pid_t _wait = waitpid (id, &status,0); if (_wait > 0) { printf("exit code is %d, signal is %d\n", WIFEXITED(status), status & 0xff); } } return 0; }
以上是“linux中匿名管道的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。