linux應用開發中,程序中通訊的使用是不可能避免的,本文介紹常用的程序間通訊方式。有名管道,訊息佇列,域套接字。
管道檔案,可以由任意程序訪問,開啟管道就可以指定讀寫方式
通過檔案io操作,內容在記憶體中,讀寫端全部關閉就釋放,使用時注意,讀端開啟是會阻塞,寫端開啟時才執行,寫端存在但是不寫資料,讀端也會阻塞,可以使用open read write進行讀寫,一但讀到檔案末尾,需要關閉,否則一直讀到「」,返回為0。
**實現:
#include#include#include#includeint main(int argc, const char *ar**)
else
} return 0;
}
實測
執行程式,產生管道檔案,並且阻塞到open之後 讀之前
另外乙個程序寫管道時,讀程序才會取消阻塞
這裡注意**中的描述:
一旦管道 阻塞到讀到資料後,如果讀到檔案末尾不關閉 管道,程式就回一直從管道中讀資料,如果沒有資料就返回0。
1.訊息佇列是訊息的鍊錶,具有特定的格式,存放在記憶體中並由訊息佇列識別符號標識.
2.訊息佇列允許乙個或多個程序向它寫入與讀取訊息.
3.管道和命名管道都是通訊資料都是先進先出的原則。
4.訊息佇列可以實現訊息的隨機查詢,訊息不一定要以先進先出的次序讀取,也可以按訊息的型別讀取.比fifo更有優勢。
目前主要有兩種型別的訊息佇列:posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前被大量使用。系統v訊息佇列是隨核心持續的,只有在核心重起或者人工刪除時,該訊息佇列才會被刪除。
**實現,這裡不寫測試程式了
//初始化兩個訊息佇列
intmsg_queue_init
(void)if
((msgid1 =
msgget
(key_s, ipc_excl)
)<0)
}else
return ret;
}//定義訊息型別
struct msgbuf
;//呼叫介面傳送與接收
傳送介面
msgsnd
(msgid1, msgp, msgsz, msg***)
;接收介面
msgrcv
(msgid1, msgp, msgsz, msgtype, msg***)
;
**實現
關於域套接字,還可以加上select機制,或者epoll機制,後面我抽時間實現後 再做記錄。
IPC通訊小結
各種工具的比較 無名管道 只能用於親緣程序通訊 有名管道 可用於任意兩程序間通訊,但只能傳輸流資料 緩衝區大小受限 訊息佇列 可以傳輸有格式位元組流,但是效率低 系統呼叫產生的使用者空間 核心空間轉換的開銷 共享記憶體 通訊效率最高最快,解決了程序間通訊執行效率低等開銷問題,但是可能會帶來同步問題 ...
程序通訊 IPC
訊號 管道 訊息佇列 共享記憶體 定義 程序間的軟體中斷通知和處理機制 訊號的接收處理 捕獲 catch 忽略 ignore 遮蔽 mask 不足 傳遞的資訊量小,只有乙個訊號型別 程序間基於記憶體檔案的通訊機制 匿名管道只能在父子程序間進行通訊,不能再網路間進行通訊,而且資料傳輸是單向的,只能一端...
linux程序通訊(ipc)
1 管道 半雙工管道是最常用的ipc 只能在有關係的程序間才能使用,shell上常用 2 命名管道 在檔案系統中命名管道式以特殊檔案的形式存在的。不在同一程序組的兩個程序通訊可以使用命名管道。3 訊息佇列 核心空間中的內部鍊錶,通過linux核心在各個程序之間傳遞內容 4 訊號 用於在乙個或多個程序...