管道傳輸資料時單向的。也是以檔案的方式存在。
匿名管道: 函式int pipe(int fd[2]) 返回0成功 unistd.h
管道:是核心快取的一段資料。 mkfifo sys/types.h sys/stat.h
缺點:效率低,不適合程序間頻繁額交換資料。
優點:邏輯簡單,能更容易知道資料更新
pip_buf通常在1024到5120之間
fifo管道:fifowrite具有原子性
生命週期:程序結束,管道結束。
優點:解決管道的缺點
缺點:通訊不及時,二是附件也有大小限制。不適合較大資料的傳輸。
訊息佇列:儲存在核心中的訊息鍊錶。每個訊息題有固定大小的儲存塊。讀了訊息題就會刪除訊息體。
放在核心的堆裡,需要手動釋放。
生命週期:與作業系統一樣。凌駕於程序之上。
大小:乙個佇列1024個訊息,每個訊息8192位元組。
在開銷上,需要複製4次:
1,由使用者空間緩衝區中將資料拷貝到核心空間緩衝區中
2,核心空間緩衝區將資料拷貝到記憶體中
3,記憶體將資料拷貝到到核心緩衝區
4,核心空間緩衝區到使用者空間緩衝區.
資料複製兩次
1,使用者空間到記憶體
2,記憶體到使用者空間。
優點:大資料傳輸,通訊及時。
缺點:**多一點點複雜,但還需訊號量一起配合,保護臨界資源。
優點:保護臨界資源。
本質:整型的計數器,主要用於實現程序間的互斥和同步,而不是用於快取程序間通訊的資料。
訊號量表示資源的數量:
1.p操作:sem -=1 if(sem<0) 表明資源已被占用,程序阻塞等待;else 資源可使用,程序繼續執行 lock_the_mutex() sem_wait()
2.v操作:sem +=1 if(sem<=0) 表明當前有阻塞的程序,於是會將該程序喚醒執行;else 表明當前沒有阻塞的程序。 lock_the_mutex() sem_post()
訊號量初始化為1,代表互斥訊號量,為0,代表同步訊號量
對於異常情況下的工作模式,就需要該方式通知程序
唯一的非同步通訊機制。訊號產生後,有幾種處理方式
1. 執行預設操作
2.捕捉訊號,已定義對應的訊號處理函式
3. 忽略訊號。sigkill與sigstop,這是無法捕捉和忽略的。
優點:跨網路,不同主機之間的程序。 int socket(int domain, int type, int protocal)
domain 引數用來指定協議族,比如 af_inet 用於 ipv4、af_inet6 用於 ipv6、af_local/af_unix 用於本機;
type 引數用來指定通訊特性,比如 sock_stream 表示的是位元組流,對應 tcp、sock_dgram 表示的是資料報,對應 udp、sock_raw 表示的是原始套接字;
protocal 引數原本是用來指定通訊協議的,但現在基本廢棄。因為協議已經通過前面兩個引數指定完成,protocol 目前一般寫成 0 即可;
程序間通訊方式對比
unix 為實現這樣的程序間通訊 提供了多種技術。一些技術提供同一主機上的程序間通訊,其他技術可以實現主機到主機的資訊交換。另外,各種技術的速度不同,所以必須選擇最合適自己需求的技術。還必須進行協調 實施時間控制和排他控制 例如,如果乙個應用程式產生資料,另乙個應用程式消費資料,那麼當讀完共享池時消...
程序的通訊方式
管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對...
程序通訊方式
unix中有如下的通訊方式 1 檔案和記錄鎖定。為避免兩個程序間同時要求訪問同一共享資源而引起訪問和操作的混亂,在程序對 共享資源進行訪問前必須對其進行鎖定,該程序訪問完後再釋放。這是unix為共享 資源提供的互斥性保障。2 管道。管道一般用於兩個不同程序之間的通訊。當乙個程序建立乙個管道,並呼叫f...