程序間通訊 管道

2021-09-19 10:50:02 字數 1254 閱讀 2692

1.為什麼要進行多程序程式設計

為了解決乙個複雜問題,這個任務需要同時處理幾件事,乙個任務有多個子任務

例如:瀏覽器後台需要處理流量監控,安全監控等接收使用者輸入。

2.乙個程序的資料怎麼從乙個程序到另乙個程序

程序間通訊,方式有:管道,訊號量, 共享記憶體 、訊息佇列、socket

網路通訊實質上也是程序間通訊。

3.管道(程序間傳遞資料的)

無論是有名管道還是無名管道:在同一時刻只能是一端讀一端寫,是半雙工通訊。

管道借助pcb----》struct file ---->struct inode

有名管道:在磁碟上存在乙個管道檔案的標識,但是管道檔案並不占用磁碟空間,資料會快取在記憶體上。有名管道可以應用於同一臺主機上有訪問許可權的任意n個程序間通訊。

無名管道:不會存在管道檔案的標識,其原理是借助父子程序之間共享fork之前開啟的檔案描述符,無名管道的資料內容也是在記憶體上儲存的。僅限於父子程序間通訊。

4.有名管道的使用(p 代表管道檔案)

(1)建立管道檔案:命名 mikefifo 檔名

函式;int mkfifo(const char *pathname, int mode);(僅用於建立)

開啟:int open();

寫資料:int read();

讀資料:int write();

(2)如果所有的讀端關閉,則寫端也會退出,反之亦然

(3)讀寫的次數沒有直接聯絡----》位元組流服務

(4)如果寫端保持但是並沒有寫資料,則讀端阻塞,如果讀端保持但是並沒有獲取資料寫端在將管道記憶體寫滿時,阻塞。

5.無名管道的使用

(1)建立&開啟管道檔案:

函式;int pipe(int fd[2]);(建立無名管道並開啟,使得fds[0]為讀端,fds[1]為寫端)

fork()之後。

父程序寫端寫資料:int write();

子程序讀端讀資料:int read();(父子程序必須關閉一對讀寫,並且不能同乙個程序關。)

(2)邏輯上保持管道的半雙工通訊

(3)防止一端關閉對於的讀或寫,而另一端無法感知

6.管道是半雙工的,如何實現全雙工管道

通過函式sockpair

程序間通訊 管道

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 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...