基於TLS FIFO的程序間通訊模型
阿新 • • 發佈:2018-12-22
眾所周知,TLS是指執行緒區域性儲存,FIFO是Unix中的命名管道,可用於無關程序間的通訊,而本文描述的TLS FIFO是指這樣一種機制:如果一個執行緒在每次IO操作時,若沒有連線,則先連線到FIFO服務端,再將連線關聯到這個執行緒的TLS中,這裡的連線即建立並開啟唯一的FIFO,之後的讀寫就在這個FIFO連線上進行;當FIFO連線斷開時,在下次IO操作時會自動重連。這樣一來,使用者程式就只要呼叫相關的IO操作,而不必管理連線,極大地簡化了程式。使用FIFO通訊前先要建立FIFO再開啟它,其中建立是最重要的操作,結果有3種情況:成功、失敗和已存在。
結構定義 typedef struct
{
int fd;
char *name;
}ipc_fifo_t; fd儲存FIFO檔案描述符,name儲存FIFO檔案系統路徑名。
介面函式
●建立FIFO ipc_fifo_t* ipc_fifo_make(constchar *path,mode_t mode); path指定FIFO路徑,可以是絕對路徑或相對路徑,mode指定訪問許可權,若成功則返回一個FIFO結構,否則為NULL;通常被ipc_fifo_open呼叫。
● 開啟FIFO int ipc_fifo_open(ipc_fifo_t **f,constchar*path,int flag,mode_t mode);
flag指定開啟標誌,如果包含了O_CREAT標誌,那麼呼叫ipc_fifo_make建立新的FIFO物件並在開啟成功後替換*f,否則如果*f為空,就分配並初始化一個fifo結構;mode指定訪問許可權,僅當建立時生效。雖然f為輸入輸出引數,但操作失敗時不會影響它,也就是說沒有副作用。
● 傳送資料 ssize_t ipc_fifo_write(ipc_fifo_t *f,constvoid*data,size_t size);
如果成功則返回已傳送的位元組數,否則返回-1,errno表示出錯程式碼。
● 接收資料 ssize_t ipc_fifo_read(ipc_fifo_t *f,void*data,size_t size); 如果成功則返回已傳送的位元組數,否則返回-1,errno表示出錯程式碼。
● 關閉FIFO void ipc_fifo_close(ipc_fifo_t *f); 當通訊結束的時候,應該呼叫此函式來關閉FIFO,它會先刪除FIFO檔案和關閉檔案描述符,最後釋放fifo結構。
● 獲取TLS FIFO ipc_fifo_t* ipc_fifo_tls_get();
該函式一般被髮送資料介面呼叫,若成功則返回一個FIFO結構,否則為NULL;每個執行緒對應一個FIFO物件,對於同一執行緒,獲取的是同一個FIFO物件,而後便可呼叫ipc_fifo_write來發送資料。
工作流程 建立FIFO 適用於FIFO客戶端和服務端,但服務端由於要非同步處理眾多FIFO客戶端,因此要注意以下2個問題,這也是使用FIFO技術通訊的一些細節。 1)必須以非阻塞讀寫方式開啟知名FIFO,即以O_CREAT|O_RDWR|O_NONBLOCK標誌來呼叫ipc_fifo_open,這樣才不會阻塞等待某個客戶端以同步寫方式開啟知名FIFO而返回,因為它使用O_RDWR標誌,這樣自己既讀又寫,加上O_NONBLOCK,就立即返回了。 2)必須以非阻塞只讀方式開啟對應客戶端FIFO,即以O_RDONLY|O_NONBLOCK標誌呼叫ipc_fifo_open,這樣就不會阻塞接受客戶端建立連線而返回。
建立FIFO連線 適用於FIFO客戶端,被髮送資料介面呼叫,考慮到服務端可能事先沒有開啟知名FIFO來監聽連線,所以這裡先以非同步方式寫開啟知名FIFO,如果成功則改以阻塞方式傳送唯一路徑名到服務端,如果傳送完全後,接著以同步方式寫開啟唯一FIFO,這是為了等待服務端打開了對應的唯一FIFO。
傳送資料 適用於FIFO客戶端,當TLS中沒有關聯對應的FIFO時,則先呼叫fifo_tls_get進入建立FIFO連線流程,而後再發資料。 posted on 2014-12-01 00:13 春秋十二月 閱讀(938) 評論(2) 編輯 收藏 引用 所屬分類: System
結構定義 typedef struct
{
int fd;
char *name;
}ipc_fifo_t; fd儲存FIFO檔案描述符,name儲存FIFO檔案系統路徑名。
介面函式
●建立FIFO ipc_fifo_t* ipc_fifo_make(constchar *path,mode_t mode); path指定FIFO路徑,可以是絕對路徑或相對路徑,mode指定訪問許可權,若成功則返回一個FIFO結構,否則為NULL;通常被ipc_fifo_open呼叫。
● 開啟FIFO
● 傳送資料 ssize_t ipc_fifo_write(ipc_fifo_t *f,constvoid*data,size_t size);
● 接收資料 ssize_t ipc_fifo_read(ipc_fifo_t *f,void*data,size_t size); 如果成功則返回已傳送的位元組數,否則返回-1,errno表示出錯程式碼。
● 關閉FIFO void ipc_fifo_close(ipc_fifo_t *f); 當通訊結束的時候,應該呼叫此函式來關閉FIFO,它會先刪除FIFO檔案和關閉檔案描述符,最後釋放fifo結構。
● 獲取TLS FIFO
工作流程 建立FIFO 適用於FIFO客戶端和服務端,但服務端由於要非同步處理眾多FIFO客戶端,因此要注意以下2個問題,這也是使用FIFO技術通訊的一些細節。 1)必須以非阻塞讀寫方式開啟知名FIFO,即以O_CREAT|O_RDWR|O_NONBLOCK標誌來呼叫ipc_fifo_open,這樣才不會阻塞等待某個客戶端以同步寫方式開啟知名FIFO而返回,因為它使用O_RDWR標誌,這樣自己既讀又寫,加上O_NONBLOCK,就立即返回了。 2)必須以非阻塞只讀方式開啟對應客戶端FIFO,即以O_RDONLY|O_NONBLOCK標誌呼叫ipc_fifo_open,這樣就不會阻塞接受客戶端建立連線而返回。
建立FIFO連線 適用於FIFO客戶端,被髮送資料介面呼叫,考慮到服務端可能事先沒有開啟知名FIFO來監聽連線,所以這裡先以非同步方式寫開啟知名FIFO,如果成功則改以阻塞方式傳送唯一路徑名到服務端,如果傳送完全後,接著以同步方式寫開啟唯一FIFO,這是為了等待服務端打開了對應的唯一FIFO。
傳送資料 適用於FIFO客戶端,當TLS中沒有關聯對應的FIFO時,則先呼叫fifo_tls_get進入建立FIFO連線流程,而後再發資料。 posted on 2014-12-01 00:13 春秋十二月 閱讀(938) 評論(2) 編輯 收藏 引用 所屬分類: System