Unix程序間通訊程式設計經驗總結

2021-04-01 20:54:15 字數 1136 閱讀 3743

1. 非阻塞socket

網路上程序通訊方法。

1)使用描述  socket建立時使用fcntl設定o_nonblock標誌, 判斷連線成功需要在connect後呼叫一下select看埠是否可以讀寫。讀、寫socket前需用select判斷,如果讀、寫不到資料(read、write返回0)則認為出錯

2)訊息處理  socket讀取資料之後,要根據程式的應用層協議拼裝為訊息物件使用。使用訊息緩衝區以及長度字段進行訊息解碼。(讀緩衝區時須注意,讀取的部分位元組可能不能拼裝乙個完整的訊息,要根據訊息長度欄位來判斷)

3)出錯處理 如果讀、寫socket出錯,或者select出錯, 在設定為非阻塞的情況下,無需判斷是否被中斷(?自動重連)。判斷出錯後,需要根據情況處理,一般清理socket和緩衝區、進行重連。

4)心跳機制 為了判斷對端沒有斷線應用層使用自定義的簡單訊息進行定時互動。使用select <1不能斷定對方斷連,需要檢視錯誤碼

2. 命名管道fifo

同一臺機器上程序通訊方法。與socket特點相同

1)使用描述 建立fifo時指定檔案的屬性和開啟方式(使用者可讀寫),需要處理同名管道存在的情況。

2)資料讀寫 設定fd為非阻塞,使用多路轉接select的方式, 如果有資料讀寫但是讀寫不到資料(read、write返回0)認為出錯,如果讀寫結果為-1,需要判斷錯誤碼是否為eagain(寫3)資料處理和心跳與socket類似

3 系統v共享記憶體 (使用記憶體對映)

程序間資料共享的方法

1)使用描述 建立時設定ftok關鍵字,一般以path和'a'為引數,設定訪問模式, 如果建立失敗,判斷是否已經有其他程序建立好。關聯程序與shm。

2)  記憶體對映 所使用的記憶體**。 建立一檔案使用ftruncate設定大小,然後用fstat判斷檔案大小是否合適,建立的檔案使用mmap建立記憶體對映

3)空閒記憶體管理 參考stl的方法,對一大塊對映的共享記憶體進行分塊(2^ n n>=0 && n < 12 ), 使用空閒連標和使用鍊錶管理,實際的記憶體占用在共享記憶體的其他地方。中心思想就是一次性申請大塊記憶體,不每次malloc

4)同步 程序間使用讀寫鎖機制同步對共享記憶體的使用

4 訊號處理

5 日誌管理 大型應用軟體需要完善的日誌功能。首先要分級別,其次要有大小限制,還要可配置列印模組、風格和級別等。

UNIX 程序間通訊

linux繼承了at t和bsd以及早期的程序間的通訊 一般常用的通訊方式有 1 傳統的通訊方式 無名管道,有名管道和訊號。2 對於sys 5 的程序間通訊採用了共享記憶體,訊息佇列和訊號燈的形式。3 bsd,對於一般網路間的通訊採用來套接字的方式實現。1 無名管道的機制以及建立 對於無名管道只是用...

unix程序間通訊

程序間通訊主要可以分為兩大類 1.傳遞控制資訊 程序間的低階通訊 2.傳送大批量資料 程序間的高階通訊 主要的通訊方式主要有 1.主從式通訊方式 master servant communication 通訊的程序雙方存在一種主從式的隸屬關係。主程序是程序的控制者,從程序是程序的從屬者。主要有以下特...

UNIX高階程式設計總結 程序間通訊(管道)

管道是unix 系統中比較古老的一種,他有兩個比較大的侷限性 缺點 1 歷史上的通道都是半雙工的 即資料只能往乙個方向流 某些系統是全雙工的,但是由於大多數系統都是半雙工的,為了提高可移植性,應該將通道視作半雙工去使用。2 管道的只能使用在有公共祖先的程序之間。一般情況下,乙個程序由程序建立,在呼叫...