日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 进程间通信之pipe

發(fā)布時間:2024/4/17 linux 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 进程间通信之pipe 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

在實際開發(fā)過程中,程序員必須讓擁有依賴關系的進程集協(xié)調,這樣才能達到進程的共同目標。?
  每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數(shù)據(jù)必須通過內核,在內核中開辟一塊緩沖區(qū),進程1把數(shù)據(jù)從用戶空間拷到內核緩沖區(qū),進程2再從內核緩沖區(qū)把數(shù)據(jù)讀走,內核提供的這種機制稱為進程間通信(IPC,InterProcess Communication)。


  管道是一種最基本的IPC機制,由pipe函數(shù)創(chuàng)建:

#include <unistd.h>int pipe(int filedes[2]);

?

  管道作用于有血緣關系的進程之間,即通過fork所創(chuàng)建的進程。?

  調用pipe函數(shù)時在內核中開辟一塊緩沖區(qū)(稱為管道)用于通信,它有一個讀端一個寫端,然后通過filedes參數(shù)傳出給用戶程序兩個文件描述符,filedes[0]指向管道的讀端filedes[1]指向管道的寫端(很好記,就像0是標準輸入1是標準輸出一樣)。所以管道在用戶程序看起來就像一個打開的文件,通過read(filedes[0]);或者write(filedes[1]);向這個文件讀寫數(shù)據(jù)其實是在讀寫內核緩沖區(qū)。pipe函數(shù)調用成功返回0,調用失敗返回-1。?
  所以可以按下面的步驟進行進程間的通信:

?

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h>int main(void) {int fd[2];char str[1024] = "hello it is a test\n";char buf[1024] = {0};pid_t pid;//fd[0]讀端//fd[1]寫端if(pipe(fd) < 0){perror("pipe");exit(1);}pid = fork();if(pid > 0){//父進程里,關閉父讀close(fd[0]);sleep(3);//通過這個sleep可以知道管道的讀是一個堵塞函數(shù)write(fd[1], str, strlen(str));//當管道滿的時候,再寫就會阻塞 wait(NULL);close(fd[1]);//用完管道要關閉讀端和寫端 }else if(pid == 0){int len = 0;//子進程里,關閉子寫close(fd[1]);len = read(fd[0], buf, sizeof(buf));write(STDOUT_FILENO, buf, len);close(fd[0]);//用完管道要關閉讀端和寫端 }else{perror("fork");exit(1);}return 0; }運行結果: 運行后過3秒輸出 hello it is a test

?

 所以使用管道會有一些限制:?
  兩個進程通過一個管道只能實現(xiàn)單向通信,比如上面的例子,父進程寫子進程讀,如果有時候也需要子進程寫父進程讀,就必須另開一個管道。?
  管道的讀寫端通過打開的文件描述符來傳遞,因此要通信的兩個進程必須從它們的公共祖先那里繼承管道文件描述符。上面的例子是父進程把文件描述符傳給子進程之后父子進程之間通信,也可以父進程fork兩次,把文件描述符傳給兩個子進程,然后兩個子進程之間通信,總之需要通過fork傳遞文件描述符使兩個進程都能訪問同一管道,它們才能通信


  使用管道需要注意以下4種特殊情況(假設都是阻塞I/O操作,沒有設置O_NONBLOCK標志):

  • 如果所有指向管道寫端的文件描述符都關閉了(管道寫端的引用計數(shù)等于0),而仍然有進程從管道的讀端讀數(shù)據(jù),那么管道中剩余的數(shù)據(jù)都被讀取后,再次read會返回0,就像讀到文件末尾一樣。
  • 如果有指向管道寫端的文件描述符沒關閉(管道寫端的引用計數(shù)大于0),而持有管道寫端的進程也沒有向管道中寫數(shù)據(jù),這時有進程從管道讀端讀數(shù)據(jù),那么管道中剩余的數(shù)據(jù)都被讀取后,再次read會阻塞,直到管道中有數(shù)據(jù)可讀了才讀取數(shù)據(jù)并返回。
  • 如果所有指向管道讀端的文件描述符都關閉了(管道讀端的引用計數(shù)等于0),這時有進程向管道的寫端write,那么該進程會收到信號SIGPIPE,通常會導致進程異常終止
  • 如果有指向管道讀端的文件描述符沒關閉(管道讀端的引用計數(shù)大于0),而持有管道讀端的進程也沒有從管道中讀數(shù)據(jù),這時有進程向管道寫端寫數(shù)據(jù),那么在管道被寫滿時再次write會阻塞,直到管道中有空位置了才寫入數(shù)據(jù)并返回。
  • 以上情況具有普遍性,設計的時候需要注意。

    ?

    管道的局限性

    管道的主要局限性正體現(xiàn)在它的特點上:

    • 只支持單向數(shù)據(jù)流;
    • 只能用于具有親緣關系的進程之間;
    • 沒有名字;
    • 管道的緩沖區(qū)是有限的(管道制存在于內存中,在管道創(chuàng)建時,為緩沖區(qū)分配一個頁面大小);
    • 管道所傳送的是無格式字節(jié)流,這就要求管道的讀出方和寫入方必須事先約定好數(shù)據(jù)的格式,比如多少字節(jié)算作一個消息(或命令、或記錄)等等;

    注:阻塞管道, 使用fcntl函數(shù)設置O_NONBLOCK標志(fcntl的使用方法)?
    舉例:

    ?

    #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h>int main(void) {int fd[2];char str[1024] = "hello it is a test\n";char buf[1024] = {0};pid_t pid;//fd[0]讀端//fd[1]寫端if(pipe(fd) < 0){perror("pipe");exit(1);}pid = fork();if(pid > 0){//父進程里,關閉父讀close(fd[0]);sleep(5);write(fd[1], str, strlen(str));//當管道滿的時候,再寫就會阻塞 wait(NULL);close(fd[1]);//用完管道要關閉讀端和寫端 }else if(pid == 0){int len = 0, flags;//子進程里,關閉子寫close(fd[1]);//使其非阻塞---------------------------------------flags = fcntl(fd[0],F_GETFL);flags |= O_NONBLOCK;fcntl(fd[0],F_SETFL,flags);while(1){len = read(fd[0], buf, sizeof(buf));if(len == -1){perror("read");}else{write(STDOUT_FILENO, buf, len);break;}sleep(1);}close(fd[0]);//用完管道要關閉讀端和寫端 }else{perror("fork");exit(1);}return 0; }運行結果: read: Resource temporarily unavailable read: Resource temporarily unavailable read: Resource temporarily unavailable read: Resource temporarily unavailable read: Resource temporarily unavailable hello it is a test

    ?

    轉載于:https://www.cnblogs.com/13224ACMer/p/6390351.html

    總結

    以上是生活随笔為你收集整理的linux 进程间通信之pipe的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 福利视频免费 | 国产精品视频www | 少妇一级淫片免费播放 | 精品99久久久 | 不卡影院 | 奇米影视亚洲 | 完全免费在线视频 | 手机在线永久免费观看av片 | 日本在线观看视频网站 | 国产亚洲综合av | 99热国产 | 久久国产精品免费视频 | 夫妻性生活黄色片 | 在线播放av网站 | 天天摸天天操 | 婷婷成人综合网 | 天天操狠狠干 | 国产福利视频网站 | 国产精品探花一区二区三区 | 日本免费在线视频观看 | 久久久久久久久久av | 女人性高潮视频 | 午夜精品三级久久久有码 | 国产一区二区三区四区视频 | 中文字幕乱码在线人视频 | 日韩精品在线观看网站 | 亚洲天堂手机在线 | 色版视频在线观看 | 可以直接看的无码av | 激情xxxx| 国产香蕉视频在线 | 国产欧美一区二区精品忘忧草 | 清清草免费视频 | 久久久精品 | 国产精品扒开做爽爽爽的视频 | 中文字幕日韩一区二区 | 欧美人与动物xxxx | 美女在线国产 | 久久精品国产亚洲av麻豆蜜芽 | 国产精品自拍视频 | av免费福利 | 成人做爰69片免费看 | 中国黄色一级片 | 中文一级片| 日韩精品国产AV | 毛片资源 | 日韩视频网址 | 成人综合网站 | 狼人综合伊人 | 一二三区精品视频 | 日本55丰满熟妇厨房伦 | 国产97在线观看 | 神马午夜dy888 | 亚洲欧美日韩在线不卡 | 91吃瓜在线 | 久草五月 | 播播开心激情网 | 8050午夜一级毛片久久亚洲欧 | 亚洲天堂黄 | 国产美女自拍视频 | 91麻豆精品国产91久久久更新时间 | 日批毛片 | 伊人国产在线视频 | 又大又硬又爽免费视频 | 午夜国产小视频 | 成年人av网站 | 91视频xxx | 小早川怜子久久精品中文字幕 | 日韩一区二区三区视频在线观看 | 亚洲黄色一区二区 | www.日本在线 | 国产精品三级久久久久久电影 | 久久精品国产亚洲AV成人雅虎 | 欧美成人视屏 | 夜夜操天天操 | 亚洲日本综合 | 又大又硬又爽免费视频 | 欧美成人久久 | 成熟了的熟妇毛茸茸 | 日日碰狠狠添天天爽无码 | 131美女爱做视频 | av视屏在线 | 极品福利视频 | 操操综合 | 久久久久久久久久久久久久久久久久久久 | 日本中文字幕在线免费观看 | 青青草视频免费 | 国产精品第五页 | 禁网站在线观看免费视频 | 欧美成人黄色小说 | 热99视频 | 97在线观看免费视频 | 电家庭影院午夜 | 伊人开心网 | 在线中文字幕日韩 | 国产成人精品无码免费看81 | 自拍偷拍第5页 | 欧美日韩国产在线播放 | 美女露出粉嫩尿囗让男人桶 |