Linux下程序間通訊方式 pipe(管道)

2022-09-16 03:00:15 字數 3084 閱讀 4761

每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序a把資料從使用者空間拷到核心緩衝區,程序b再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊。

不同程序間的通訊本質:程序之間可以看到乙份公共資源;而提供這份資源的形式或者提供者不同,造成了通訊方式不同,而 pipe就是提供這份公共資源的形式的一種。

管道是由呼叫pipe函式來建立

#include int pipe (int fd[2]);

//返回:成功返回0,出錯返回-1

fd引數返回兩個檔案描述符,fd[0]指向管道的讀端,fd[1]指向管道的寫端。fd[1]的輸出是fd[0]的輸入。

(1)父程序建立管道,得到兩個件描述符指向管道的兩端

(2)父程序fork出子程序,子程序也有兩個檔案描述符指向同管道。

(3)父程序關閉fd[0],子程序關閉fd[1],即子程序關閉管道讀端,父程序關閉管道寫端(因為管道只支援單向通訊)。子程序可以往管道中寫,父程序可以從管道中讀,管道是由環形佇列實現的,資料從寫端流入從讀端流出,這樣就實現了程序間通訊。

}執行結果:每隔2秒列印一次i am child! 並且列印了五次。

(1)讀端不讀(fd[0]未關閉),寫端一直寫 

(2)寫端不寫(fd[1]未關閉),但是讀端一直讀 

(3)讀端一直讀,且fd[0]保持開啟,而寫端寫了一部分資料不寫了,並且關閉fd[1]。 

如果乙個管道讀端一直在讀資料,而管道寫端的引⽤計數⼤於0決定管道是否會堵塞,引用計數大於0,唯讀不寫會導致管道堵塞。

(4)讀端讀了一部分資料,不讀了且關閉fd[0],寫端一直在寫且f[1]還保持開啟狀態。

}//寫方還在繼續,而讀方已經關閉它的讀端

close(fd[0]);

pid_t ret=waitpid(id,&status,0);

printf("exitsingle(%d),exit(%d)\n",status&0xff,(status>>8)&0xff);

//低八位存放該子程序退出時是否收到訊號

//此低八位子程序正常退出時,退出碼是多少

}else

return 0;

}執行結果:

使用kill -l 檢視13號訊號,可以知道13號訊號代表sigpipe。

總結:

如果乙個管道的寫端一直在寫,而讀端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,只寫不讀再次呼叫write會導致管道堵塞;

如果乙個管道的讀端一直在讀,而寫端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,唯讀不寫再次呼叫read會導致管道堵塞;

而當他們的引用計數等於0時,只寫不讀會導致寫端的程序收到乙個sigpipe訊號,導致程序終止,只寫不讀會導致read返回0,就像讀到件末尾樣。

1.管道只允許具有血緣關係的程序間通訊,如父子程序間的通訊。

2.管道只允許單向通訊。

3.管道內部保證同步機制,從而保證訪問資料的一致性。

4.面向位元組流

5.管道隨程序,程序在管道在,程序消失管道對應的埠也關閉,兩個程序都消失管道也消失。

測試管道容量大小只需要將寫端一直寫,讀端不讀且不關閉fd[0],即可。 

測試**:

#include #include #include #include int main()

pid_t id = fork();

if (id == 0)

close(fd[1]);

}else if (id>0)

else

return 0;

}

可以看到寫到65520之後管道堵塞了,而65536即為64k大小即為管道的容量

原理是:我們寫端每次寫入的資料大小是13,統計我們可以進行多少次寫入,寫入次數*13就是管道容量,因為65533+13=65546>65536所以就不能繼續輸入了,有因為記憶體對齊問題,所以我們可以知道容量一定是64k

Linux下程序間通訊方式 管道

管道 pipe 是 一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描符,filedes 0 指向管道的讀端...

linux 程序間通訊方式

1 無名管道通訊 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 高階管道通訊 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式...

Linux程序間通訊方式

目錄前言 一 程序間通訊的目的 二 linux程序間通訊方式簡介 程序間的通訊就是在不同程序之間傳播或者交換資訊。程序的使用者空間是相互獨顯然可以體用這幾樣的立的,一般而言是不能互相訪問的,唯一的例外是共享空間。但是系統空間卻是 公共場所 所以核心顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪...