向訊息佇列傳送訊息 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 的奇妙之處在於它被呼叫一...