管道 程序間通訊的手段

2021-10-04 01:27:38 字數 1610 閱讀 5402

作業系統為使用者所提供的幾種程序間通訊方式

因此需要作業系統來提供程序間通訊的方式,並且因為通訊場景不同,提供的方式也有多種

程序間通訊的方式:

1.管道–用於程序間的資料傳輸

本質:核心當中的一塊緩衝區—通過半雙工通訊實現資料傳輸(半雙工通訊–可以選擇方向的通訊),通過讓多個程序都能訪問同一塊緩衝區,來實現程序間通訊

分類:匿名管道、命名管道

1.匿名管道:這塊核心中的緩衝區沒有標識,因此只能用於具有親緣關係的程序間通訊(父子程序)。

建立管道時,作業系統會提供兩個操作控制代碼(檔案描述符),乙個用於從管道讀資料,乙個用於向管道寫資料,子程序通過複製父程序的方式,獲取到管道的操作控制代碼進而實現訪問同乙個管道進行通訊

介面:

int pipe(int pipefd[2]);

建立乙個匿名管道,向使用者通過引數pipefd返回管道的操作控制代碼

pipefd[0]:用於從管道讀取資料

pipefd[1]:用於向管道寫入資料

返回值:0–成功,-1 — 失敗

特性:若管道中沒有資料,則read會阻塞;若管道寫滿了,則write會阻塞—管道自帶同步與互斥

對管道進行資料操作的大小不大於pipe_buf == 4096的時候,則保證操作的原子性(原子性就是中間不能被打斷)若管道所有哦寫端被關閉,(表示當前沒有程序繼續寫入資料),read讀完管道中當前的資料之後就直接返回0若管道的所有讀端被關閉,(表示沒有程序讀取資料),繼續write就會觸發異常,程式退出2.命名管道

核心中的緩衝區,具有識別符號(識別符號是乙個可見於檔案系統的管道檔案),其他程序可以通過這個識別符號,找到這塊緩衝區(通過開啟同乙個管道檔案,進而訪問到同一塊緩衝區),進而實現通訊

介面:

int mkfifo(const char* pathname,mode_t mode);

pathname:管道檔名稱

mode:檔案許可權

成功返回0,失敗返回-1

開啟特性:

若管道檔案以唯讀的方式開啟,則會阻塞,知道這個管道檔案被以寫的方式開啟

若管道檔案以只寫的方式開啟,則會阻塞,知道這個管道檔案以讀的方式開啟

若管道檔案以讀寫的方式開啟,則不會阻塞

管道的特性:

半雙工通訊

自帶同步與互斥

提供位元組流服務—有序,連線,可靠的位元組流傳輸–傳輸比較靈活

程序間的管道通訊

管道是程序間通訊的一種工具。1 管道是半雙工的,建立管道後,只能由乙個程序向另乙個程序傳資料。2 管道只能在有公共祖先的兩個程序之間使用。父程序建立管道後,fork,這個管道就能在父子程序之間呼叫了。管道通過pipe函式建立。pipe int fd 2 要開啟兩個檔案,檔案描述符放在fd裡面。寫資料...

程序間通訊 匿名管道通訊

將關於匿名管道通訊過程中遇到的問題以及心得總結一下 使用場合 匿名管道通訊對執行緒間通訊和父子程序之間的通訊非常有用 一下 分三部分 1.建立匿名管道 2.建立子程序 1 使用getstdhandle函式獲取標準輸出裝置的控制代碼 2 使用setstdhandle函式將標準輸出到寫匿名管道 3 使用...

程序間通訊方式 管道通訊

c語言中的管道通訊是通過在核心中開闢一塊空間,使用者通過檔案io介面來訪問這塊空空間實現通訊目的。管道的優點是直接訪問記憶體,通訊速度較快。缺點是一方面管道屬於半雙工的通訊,即同一程序只能讀或者寫,無法同時讀寫同一管道。另一方面管道中的資料只能讀一次,無法重複讀取。程序通過檔案io來操作管道,但是不...