色偷偷91综合久久噜噜-色偷偷成人-色偷偷尼玛图亚洲综合-色偷偷人人澡久久天天-国内精品视频一区-国内精品视频一区二区三区

Hello! 歡迎來到小浪云!


【Linux】進程間通信:匿名管道與進程池


avatar
小浪云 2025-04-17 17

01.進程通信

進程之間需要某種協同,所以如何協同的前提條件就是進程直接需要進行通信,傳遞有效數據

前面提到過,進程是具有獨立性的,進程=內核數據結構+代碼和數據

前面講到子進程創建會繼承父進程的信息,后面會發生寫時拷貝,不屬于進程間通信,我們提到的進程間通信,是讓其一直通信

進程如何通信呢?

因為進程具有獨立性,所以一個進程開辟的資源另一個進程是看不到的,所以進程間通信的前提,先讓不同的進程,看到同一份(操作系統)資源(“一段內存”)

【Linux】進程間通信:匿名管道與進程池

一定是某一個進程先需要通信,讓OS創建一個共享資源

OS必須提供很多系統調用

OS創建的共享資源的不同,系統調用接口的不同,進程間通信會有不同的種類

進程通信的常見方式:

System V IPC:System V 消息隊列,System V 共享內存,System V 信號量

POSIX IPC:消息隊列,共享內存,信號量,互斥量,條件變量,讀寫鎖

管道:匿名管道pipe,命名管道

02.管道

【Linux】進程間通信:匿名管道與進程池

操作系統打開一個文件,屬性初始化struct file,內容寫到內核級文件緩沖區

當以讀和寫兩種方式分別打開同一個文件時,操作系統為其分配文件描述符fd 3 4 ,當第二次打開同一個文件的時候,操作系統不需要再將文件的屬性,操作方法集,緩沖區再加載一次,只有struct file會被單獨創建兩次

創建子進程以父進程模版copy一份,子進程文件描述符表也創建一份

【Linux】進程間通信:匿名管道與進程池

創建子進程,還需要為3,4描述符再拷貝兩個Struct file嗎?答案是不用的,進程的獨立性跟文件沒有關系

這里的拷貝類似淺拷貝的過程,子進程的3,4號指針也會指向文件系統中父進程指向的同一個struct file

所以為什么父子進程會向同一個顯示器終端打印數據?就是因為文件描述符指向同一個文件

進程默認會打開三個標準輸入輸出:0,1,2,怎么做到的?bash的子進程–bash打開了,所有的子進程默認也就打開了,我們只要做好約定即可

我們子進程主動close(0/1/2),不影響父進程繼續使用顯示器文件

前面也提到,文件會記錄自己的硬鏈接數,這里struct file也會記錄指向自己的文件描述符個數,當ref_count等于0時釋放文件資源

進程間通信的本質,先讓兩個不同的進程看到一份公共的資源,這里父子進程看到了同一塊文件內核級緩沖區,這里的公共資源,我們就將它叫做管道文件

管道只允許單向通信,不需要刷新到磁盤,所以需要重新設計通信接口

【Linux】進程間通信:匿名管道與進程池

#include 功能:創建一無名管道 原型

代碼語言:JavaScript代碼運行次數:0運行復制

int pipe(int fd[2]);

參數 fd:文件描述符數組,其中fd[0]表示讀端, fd[1]表示寫端 返回值:成功返回0,失敗返回錯誤代碼

本質是對open的封裝,不需要文件路徑和文件名,所以叫做匿名管道

【Linux】進程間通信:匿名管道與進程池
【Linux】進程間通信:匿名管道與進程池

如果想雙向通信,就構建兩個管道

測試管道接口代碼語言:javascript代碼運行次數:0運行復制

#include<iostream>#include<string>#include<cerrno>#include<unistd.h>#include<sys>#include<cstring>#include<sys>using namespace std;string getOtherMessage(){    static int cnt=0;    string messageid=to_string(cnt);    cnt++;    pid_t self_id =getpid();    string stringpid =to_string(self_id);    string message = "messageid: ";    message+=messageid;    message+="my pid is: ";    message+=stringpid+"n";    return message;}void SubProcessWrite(int wfd){    string message="I am chile process";    while(true)    {        string info=message+ getOtherMessage();        write(wfd,info.c_str(),info.size());//寫入管道的時候,沒必要寫入

主站蜘蛛池模板:
精品国产一区二区三区久久久蜜臀
|
成人精品视频在线
|
四虎在线精品免费高清在线
|
色婷婷中文字幕
|
亚洲伊人久久大香线蕉综合图片
|
久久久国产99久久国产一
|
天天爽夜夜爽
|
在线播放一区二区精品产
|
久久青草精品一区二区三区
|
日韩久久综合
|
最新激情网
|
国产精品麻豆久久久
|
99热这里只有精品久久免费
|
9久久99久久久精品齐齐综合色圆
|
久国产精品久久精品国产四虎
|
国产精品天堂
|
国内外一级毛片
|
欧美日韩性猛交xxxxx免费看
|
久久黄色免费
|
婷婷综合网站
|
日韩精品视频美在线精品视频
|
精品国产一区二区三区四
|
一级毛片不卡片免费观看
|
国产成人综合久久亚洲精品
|
亚洲伊人tv综合网色
|
中国国产一国产一级毛片视频
|
一级特级女人18毛片免费视频
|
色噜噜狠狠狠狠色综合久一
|
黄色免费一级片
|
日日日日干
|
黄色片一级毛片
|
国产操比|
伊人久久大线蕉香港三级
|
日韩欧美一区二区在线
|
国产在线精品一区二区三区
|
日韩男女做性高清在线观看
|
在线观看免费黄色小视频
|
国产极品久久
|
欧美激情在线精品一区二区
|
亚洲精品国产综合久久一线
|
国产性大片黄在线观看在线放
|