本文**:
(9)程序間通訊
1. 本文所介紹的程式平台
開發板:arm9-mini2440
虛擬機器為:red hat enterprise linux 5
開發板上系統核心版本:linux-2.6.32.2
2. unix系統主要程序間通訊機制(ipc)管道
fifo(命名管道)
訊息佇列
共享記憶體
訊號量套接字
3. 管道
詳細請見:
管道是最常見的ipc機制,是單工的,如果要兩個程序實現雙向傳輸則需要兩個管道,管道建立的時候既有兩端,乙個讀端和乙個寫端。兩個程序要協調好,乙個程序從讀的方向讀,乙個程序從寫的方向寫,並且只能在關係程序間進行,比如父子程序,通過系統呼叫pipe()函式實現。
#include
int pipe(int fd[2]);
fd[0]:檔案描述符,用於讀操作
fd[1]:檔案描述符,用於寫操作
返回值:成功返回0,如果建立失敗將返回-1並記錄錯誤碼
4. fifo
詳細請見:
fifo又稱命名管道,通過fifo的通訊可以發生在任何兩個程序之間,且只需要對fifo有適當的訪問許可權,對fifo的讀寫操作與普通檔案類似,命名管道的建立是通過mkfifo()函式建立的。
#include
int mkfifo(const char *filename, mode_t mode)
filename:命名管道的檔名
mode:訪問許可權
返回值:若成功則返回0,否則返回-1,錯誤原因存於errno中。
4.1 fifo伺服器例項
#include #include #include #include #include #include #include #include #include #define server_fifo_name "./serv_fifo"
#define client_fifo_name "./cli_%d_fifo"
#define buffer_size 20
struct data_to_pass_st ;
int main()
sleep(10); /* lets clients queue for demo purposes */
do sprintf(client_fifo, client_fifo_name, my_data.client_pid);
client_fifo_fd = open(client_fifo, o_wronly);
if (client_fifo_fd != -1)
}} while (read_res > 0);
close(server_fifo_fd);
unlink(server_fifo_name);
exit(exit_success);
}
4.2 fifo客戶例項
#include #include #include #include #include #include #include #include #include #include #define server_fifo_name "./serv_fifo"
#define client_fifo_name "./cli_%d_fifo"
#define buffer_size 20
struct data_to_pass_st ;
int main()
my_data.client_pid = getpid();
sprintf(client_fifo, client_fifo_name, my_data.client_pid);
if (mkfifo(client_fifo, 0777) == -1)
for (times_to_send = 0; times_to_send < 5; times_to_send++)
close(client_fifo_fd);}}
close(server_fifo_fd);
unlink(client_fifo);
exit(exit_success);
}
5. 訊息佇列
詳細請見:
訊息佇列有如下特點:
(1) 通過訊息佇列key值來定義和生成訊息佇列
(2) 任何程序只要有訪問許可權並且知道key就可以訪問訊息佇列
(3) 訊息隊列為記憶體塊方式資料段
(4) 訊息佇列的訊息長度可為系統引數限制內的任何長度
(5) 訊息佇列有訊息型別,訪問可以按型別訪問
(6) 在一次讀寫操作前都必須取得訊息識別符號,即訪問權,訪問後脫離關係
(8) 訊息佇列具有加鎖處理機制
(9) 在許可權允許時,訊息佇列的資訊可以雙向傳遞
6. 共享記憶體
詳細請見:
共享記憶體是效率最高的ipc機制,他允許任何兩個程序訪問相同的邏輯記憶體區,它具有一下特點:
(1) 通過共享記憶體key值定義和生成共享記憶體
(2) 任何程序只要有訪問許可權並且知道key就可以訪問共享記憶體
(3) 共享記憶體為記憶體塊方式資料段
(4) 共享記憶體的訊息長度可為系統引數限制內的任何長度
(5) 共享記憶體的訪問方式與陣列的訪問方式相同
(6) 在取得共享記憶體識別符號將共享記憶體與程序資料段連線後即可以開始對其進行讀寫操作,在所有操作完成之後再做共享記憶體與程序資料段的脫離操作,才完成記憶體訪問的過程
(7) 共享記憶體中的資料不會因為資料被程序讀取後消失
(8) 共享記憶體不具備鎖機制,所有共享記憶體最好與訊號量一起使用來保證資料的一致性
(9) 在許可權允許時,共享記憶體的資訊傳遞時雙向的
7. 訊號量
詳細請見:
訊號量是一種同步機制,主要用途是保護臨界資源(在乙個時刻只能被乙個程序所擁有),通常與共享記憶體一起使用。
6.1 semget()函式
#include
int semget(key_t key, int num_sems, int sem_flags)
key:訊號量集合的鍵
num_sems:訊號量集合裡面元素個數
sem_flags:任選引數
返回值:返回訊號量集合識別符號,出錯返回-1
6.2 semop()函式
#include
int semop(int sem_id, struct sembuf *sem_ops , size_t num_sem_ops)
sem_id: 訊號量集合識別符號
sem_ops:訊號量操作結構的指標
num_sem_ops:訊號量操作結構的個數
6.3 semctl)函式
#include
int semctl (int sem_id, int sem_num, int command, …)
sem_id: 訊號量集合識別符號
sem_num:訊號量元素編號
command:控制命令
…:命令引數列表
返回值:根據命令返回相應的值,出錯返回-1
php程序間通訊 yoc PHP程序間通訊
php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...
程序間通訊
實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...
程序間通訊
最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...