Linux應用程式設計 11 程序間通訊 訊息佇列

2021-09-22 08:17:31 字數 3294 閱讀 2780

向訊息佇列傳送訊息 msgsnd()

從訊息佇列接收訊息 msgrcv()

控制訊息佇列 msgctl()

訊息佇列—示例

訊息佇列是system v ipc物件的一種

訊息佇列由訊息佇列id來唯一標識

訊息佇列就是乙個訊息的列表。使用者可以在訊息佇列中新增訊息、讀取訊息等

訊息佇列可以按照型別來傳送/接收訊息(不同的程序可以通過乙個訊息佇列,實現向某乙個程序傳送訊息;可以在訊息佇列中為每個程序定義不同的訊息型別,當前程序只需接受自己的型別的訊息,傳送對方的型別的訊息)

開啟/建立訊息佇列 msgget

向訊息佇列傳送訊息 msgsnd

從訊息佇列接收訊息 msgrcv

控制訊息佇列 msgctl

成功時返回訊息佇列的id,失敗時返回eof

key 和訊息佇列關聯的key ipc_private 或 ftok

msg*** 標誌位 ipc_creat|0666

成功時返回0,失敗時返回-1

msgid 訊息佇列id

msgp 訊息緩衝區位址(存放的是要傳送的訊息)

size 訊息正文長度

msg*** 標誌位 0(阻塞方式,表示訊息傳送成功了才返回) 或 ipc_nowait(不需要等待訊息完全傳送成功就可以返回,如:訊息佇列滿了)

通訊雙方首先定義好統一的訊息格式

使用者根據應用需求定義結構體型別

首成員型別為long,代表訊息型別(正整數)

其他成員都屬於訊息正文

成功時返**到的訊息長度,失敗時返回-1

msgid 訊息佇列id

msgp 訊息緩衝區位址

size 指定接收的訊息長度 (超過指定長度的部分會丟失)

msgtype 指定接收的訊息型別,指定成0表示接收訊息佇列中最早的乙個訊息 ,指定成負數表示按優先順序接受

msg*** 標誌位 0(0表示接收不成功則阻塞,直到有訊息了,或訊息佇列被刪除了出錯返回,或被訊號打斷了) 或 ipc_nowait

成功時返回0,失敗時返回-1

msgid 訊息佇列id

cmd 要執行的操作 ipc_stat(獲取屬性) / ipc_set (設定屬性)/ ipc_rmid(刪除訊息佇列,第三個引數傳null)

buf 存放訊息佇列屬性的位址

訊息佇列的刪除和共享記憶體不一樣。共享記憶體系統會檢查,所有程序都取消映**才會真的刪除,而訊息只要程序一執行ipc_rmid,訊息佇列會立刻被刪除

要求:兩個程序通過訊息佇列輪流將鍵盤輸入的字串傳送給對方,接收並列印對方傳送的訊息

通過多程序/執行緒實現同時收發訊息 ·引入伺服器端,實現不同通訊方式

改進,增添退出處理,程式結束,自動刪除訊息佇列

/******clienta.c******/ 

#include #include #include#include #include #include #include typedef structmsg;

#define len (sizeof(msg) - sizeof(long))

#define typea 100

#define typeb 200

int main(int argc, const char *ar**)

if((msgid = msgget(key,ipc_creat|0666)) < 0)

if((pid = fork()) < 0)

else if (pid == 0) }

else

if(strcmp(buf.mtext,"quite\n") == 0)

printf("recv from clientb: %s",buf.mtext);

} kill(pid,sigusr1);

} return 0;

}

/******clientb.c******/ 

#include #include #include #include#include #include #include #include typedef structmsg;

#define len (sizeof(msg) - sizeof(long))

#define typea 100

#define typeb 200

int main(int argc, const char *ar**)

if((msgid = msgget(key,ipc_creat|0666)) < 0)

if((pid = fork()) < 0)

else if(pid == 0)

if(strcmp(buf.mtext,"quite\n") == 0)

printf("recv from clienta: %s",buf.mtext);

} }else

kill(pid,sigusr1);

} return 0;

}

Linux應用程式設計 程序通訊

通訊方式有管道pipe,訊號 一 pipe 管道分兩種無名管道,有名管道。1 無名管道 父程序和子程序可通過無名管道傳輸資料,管道有兩個口,一端寫一端讀,半雙工通訊。可以當作檔案進行操作,所以建立的管道會有兩個檔案描述符fds 0 和fds 1 fds 0 用於讀,fds 1 用於寫,關係如圖。實驗...

Linux應用程式設計之程序程式設計

程序同步 一組併發的程序按照一定的順序執行的過程稱為程序間的同步。獲取id include pid t getpid void 獲取本程序id pid t getppid void 在子程序中獲取父程序id 程序建立 include pid t fork void fork 的奇妙之處在於它被呼叫一...

Linux應用程式設計之程序程式設計

程序同步 一組併發的程序按照一定的順序執行的過程稱為程序間的同步。獲取id include pid t getpid void 獲取本程序id pid t getppid void 在子程序中獲取父程序id 程序建立 include pid t fork void fork 的奇妙之處在於它被呼叫一...