程序間通訊 匿名管道

2021-08-17 19:48:15 字數 1687 閱讀 7595

1.程序通訊的目的

(1) 資料傳輸: 乙個程序需要將它的資料傳輸給另乙個程序

(2) 資源共享: 多個程序之間共享同樣的資源

(3) 通知事件: 乙個程序需要向另乙個或一組程序傳送訊息, 通知它們發生了什麼事情

2.管道

管道是一種程序之間通訊的一種方式, 我們把從乙個程序連線到另乙個程序的資料流叫做管道

3.匿名管道

(1) 匿名管道的建立

int pipe(int fd[2]);

fd是乙個檔案描述符陣列, fd[0] 代表讀端, fd[1] 代表寫端

返回值:成功過時返回0, 失敗時返回錯誤**

4.**演示
#include

#include

#include

#include

#include

#include

#include

#include

int main()

pid_t id = fork();

if(id == -1)

if(id == 0)

close(fd[1]);

char buf[100];

int len = read(fd[0], buf, strlen(buf));

if(len == -1)

printf("%s\n", buf);

return

0;}

5.站在檔案描述符角度理解

6.匿名管道的特點

(1) 單向

(2) 有血緣關係的程序才能通訊

(3) 同步互斥機制(管道沒有資料了就不讀了, 管道滿了就不能寫了)

(4) 程序退出管道釋放,管道的生命週期隨程序

(5) 管道提供面向位元組流的服務

7.幾個名詞概念

(1) 位元組流: 由上層決定, 一次讀多少不確定

(2) 資料不一致: 乙個程序讀, 另乙個程序寫

(3) 臨界區: 兩個程序訪問臨界資源的那段**叫做臨界區

(4) 互斥: 在任何乙個時間點臨界區訪問臨界資源時只允許乙個程序訪問

(5) 訪問資源的原子性: 程序在操作某些資源時要麼不做, 要麼做完,中間不會被打擾

(6) 同步: 以相對比較安全的順序訪問資源,這種安全性叫同步(為了防止飢餓現象)

(7) 管道自帶互斥和同步, 當管道裡無資料時, 父程序會等子程序退出

8.管道滿的時候

(1) 所有管道寫端對應的檔案描述符被關閉時, 則read返回0

(2) 如果所有檔案描述符讀端對應檔案描述符被關閉時, 則write 操作會產生乙個sigpipe, 進而可能導致write程序退出

(3) 當要寫的資料不大於pipe_buf時(4096), linux將保證寫入的原子性

(4) 當寫的資料大於pipe_buf時, linux將不再保證寫入的原子性

程序間通訊 匿名管道

最近實現乙個遠端超級終端的功能,通訊模式是這樣的 客戶端 通過網路傳送cmd命令到 伺服器端 通過程序間通訊 管道 將此cmd命令發給 cmd.exe程式,cmd.exe執行此cmd命令 接下來 cmd.exe 程式將執行結果返回 伺服器端 傳送此次結果到 客戶端,客戶端對結果進行顯示 其中伺服器端...

程序間通訊 匿名管道

使用匿名管道做程序通訊,需要用父程序建立乙個子程序,該子程序的標準輸入輸出控制代碼由父程序指定。無論父程序還是子程序,都可以收發資料,這裡僅演示父程序發資料,子程序列印資料。父程序迴圈從控制台讀資料,並傳送給子程序,子程序用對話方塊列印資料,約定子程序收到 quit 後退出。define crt s...

程序間通訊 匿名管道通訊

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