程序間通訊 管道

2021-08-02 15:53:28 字數 3261 閱讀 3787

1.程序間通訊(ipc):

把資料從使用者空間拷到核心緩衝區,另乙個程序再從核心緩衝區將資料讀走,這種由核心提供的機制叫做程序間通訊。

2.管道

管道是一種最基本ipc機制,由pipe函式建立

3.建立管道的函式pipe( )

int pipe( pipefd[2] );

①函式呼叫成功時返回0,失敗返回-1

②函式分別以讀方式和寫方式開啟乙個檔案,使用3,4作為檔案描述符;

③pipefd[0]指向讀管道,儲存讀描述符;

pipefd[1]指向寫管道,儲存寫描述符;

4.使用管道實現程序間通訊的步驟

①父程序建立管道,得到兩個檔案描述符指向管道;

②父程序fork( )出子程序,子程序也會有兩個檔案描述符;

③父程序關閉讀端pipefd[0],子程序關閉寫端pipefd[1],即父子程序指向乙個公共管道;

5.實現**:

#include

#include

#include

int main()

; if(pipe(pipefd)<0)//父程序建立管道

pid_t pid=fork();//父程序fork( )出子程序

if(pid<0)

else

if(pid==0)

}else

j++;}}

}

結果如圖:

子程序向管道中寫「hello,i am child」,父程序從管道中讀取到這句話,列印出來;

6.管道通訊的特點:

①只能進行單向通訊;

②只能為有血緣關係的程序間通訊;

③管道通訊依賴檔案系統,生存週期隨程序,即程序退出時,管道也退出;

④管道進行資料通訊時,按資料流讀寫;

⑤管道自帶同步機制;

7.管道的四種情況

(1)當關閉了管道的所有寫端時,但仍然有程序要從管道的讀端讀資料,所以管道中的剩餘資料都被讀取後,再次讀取時會返回0.

#include

#include

#include

int main()

; if(pipe(pipefd)<0)

pid_t pid=fork();

if(pid<0)

else

if(pid==0)

close(pipefd[1]);

}else

}return

0;}

結果如圖所示:

讀完10次後,返回0

(2)當指向管道的寫端沒關閉,而寫端程序也沒有向管道中寫資料,但此時有程序從管道讀端讀資料,那麼管道中剩餘資料都被讀完時,再次讀取會被阻塞;

#include

#include

#include

int main()

; if(pipe(pipefd)<0)

pid_t pid=fork();

if(pid<0)

else

if(pid==0)

sleep(1);

i++;

}close(pipefd[1]);

}else

}return

0;}

結果如圖所示:

(3)當管道的所有讀端被關閉,此時有程序向寫端寫入資料,此時會收到訊號sigpipe,導致程序異常終止;

#include

#include

#include

int main()

; if(pipe(pipefd)<0)

pid_t pid=fork();

if(pid<0)

else

if(pid==0)

sleep(1);

i++;

}close(pipefd[1]);

}else

close(pipefd[0]);

sleep(10);

}return

0;}

結果如圖所示:

(4)當指向管道的讀端未關閉,而且程序也沒有讀資料,此時有程序向寫端寫資料,那麼管道被寫滿時,再次寫入會被阻塞;

#include

#include

#include

int main()

; if(pipe(pipefd)<0)

pid_t pid=fork();

if(pid<0)

else

if(pid==0)

sleep(1);

i++;

}close(pipefd[1]);

}else

close(pipefd[0]);

sleep(10);

}return

0;}

結果如圖所示:

8.命名管道(fifo)與匿名管道的區別

上面所描述的管道都為匿名管道;

①命名管道可以實現兩個毫不相關的程序間通訊,而匿名管道只能實現有血緣關係的程序間通訊;

② 命名管道允許在硬碟上進行檔案建立,而匿名管道不允許;

③命名管道可以通過命令建立,也可以通過函式mkfifo( )建立,匿名管道通過pipe( )函式建立;

④命名管道是乙個存在於硬碟上的檔案,而匿名管道是存在於記憶體的特殊檔案;

⑤使用命名管道前,必須先呼叫open( )將它開啟;

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...