APUE 程序間通訊

2021-07-11 23:19:33 字數 1474 閱讀 7299

現在,某些系統提供全雙工管道,但是為了最佳的可移植性,我們決不應預先假定系統支援全雙工管道。

管道只能在具有公共祖先的兩個程序之間使用。通常,乙個管道由乙個程序建立,在程序呼叫fork之後,這個管道就能在父程序和子程序之間使用了。

每當在管道中鍵入乙個命令序列,讓shell執行時,shell都會為每一條命令單獨建立乙個程序,然後用管道將前一條命令程序的標準輸出與後一條命令的標準輸入相連線

管道是通過呼叫pipe函式建立的。

#include 

int pipt(int fd[2]);

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

經由引數fd返回兩個檔案描述符:fd[0]為讀而開啟,fd[1]為寫而開啟。fd[1]的輸出是fd[0]的輸入。

對於從父程序到子程序的管道,父程序關閉管道的讀端(fd[0]),子程序關閉管道的寫端(fd[1])。

對於乙個從子程序到父程序的管道,父程序關閉fd[1],子程序關閉fd[0]。

當管道的一段被關閉後,下列兩條規則起作用。

1. 當讀(read)乙個寫端已被關閉的管道時,在所有資料都被讀取後,read返回0,表示檔案結束。

2. 如果寫(write)乙個讀端已被關閉的管道,則產生訊號sigpipe。如果忽略該訊號或者捕捉該訊號並從其處理程式返回,則write返回-1,errno設定為epipe

常量pipe_buf規定了核心的管道緩衝區大小。

用pathconf或fpathconf函式可以確定pipe_buf的值。

#include "apue.h"

int main(void)

else

if(pid > 0)else

exit(0);

}

標準i/o庫提供了兩個函式popen和pclose。這兩個函式實現的操作是:建立乙個管道,fork乙個子程序,關閉未使用的管道端,執行乙個shell執行命令,然後等待命令終止

#include 

file *popen(const

char *cmdstring, const

char *type);

//返回值:若成功,返回檔案指標;若出錯,返回null

int pclose(file *fp);

//返回值:若成功,返回cmdstring的終止狀態;若出錯,返回-1

函式popen先執行fork,然後呼叫exec執行cmdstring,並且返回乙個標準i/o檔案指標。如果type是「r」,則檔案指標連線到cmdstring的標準輸出。

如果type是「w」,則檔案指標連線到cmdstring的標準輸入

pclose函式關閉標準i/o流。等待命令終止,然後返回shell的終止狀態。如果shell不能被執行,則pclose返回的終止狀態與shell已執行exit一樣

協同程序有連線到另乙個程序的兩個單項管道:乙個接到其標準輸入,另乙個則來自其標準輸出。

APUE筆記 程序間通訊

管道 include int pipe int fds 2 fd返回兩個檔案描述符,fd 0 讀,fd 1 寫!管道是單雙工的,只能一端寫,另一端讀,不能兩邊同時讀寫 管道實際上是在,核心中開闢了乙個迴圈佇列,當佇列寫滿 隊空 時,繼續寫 讀 管道會阻塞當前程序!當寫端關閉,繼續讀時返回eof 當讀...

APUE筆記 高階程序間通訊

unix 域套接字 unix域套接字,使用socket相同的介面,用於程序間通訊 但它僅僅進行資料複製,不新增報頭,不計算校驗和 unix域套接字,在系統中建立兩個檔案,檔案不實際儲存資料,指向核心空間中相應位址 使用socketpair建立乙個類似於管道的socketfd fd 2 不同於管道,此...

APUE學習筆記 23 程序間通訊之管道

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 15章。2.總結了程序間通訊的一種機 制 管道的基本概念和使用方法。3.管道 管道是unix 系統ipc 的最古老形式,在 shell 下的表現形式為管道線。每當在管道線中...