进程间通信——消息队列
生活随笔
收集整理的這篇文章主要介紹了
进程间通信——消息队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.消息隊列原理
1、2…是消息類型,進程發送消息可以指定消息類型,進程接收消息也指定消息類型,這樣在消息隊列里識別消息類型就可以知道是不是自己需要接受的消息了。
2.消息隊列示例代碼
函數介紹:
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> /* msgget()創建或者獲取一個消息隊列 msgget()成功返回消息隊列 ID,失敗返回-1 msqflg: IPC_CREAT */ int msgget(key_t key, int msqflg);/* msgsnd()發送一條消息,消息結構為: struct msgbuf { long mtype; // 消息類型, 必須大于 0 char mtext[1]; // 消息數據 }; msgsnd()成功返回 0, 失敗返回-1 msqsz: 指定 mtext 中有效數據的長度 msqflg:一般設置為 0 可以設置 IPC_NOWAIT//設置為0的話,消息隊列添加滿了,發送會阻塞。 */ int msgsnd( int msqid, const void *msqp, size_t msqsz, int msqflg);/* msgrcv()接收一條消息 msgrcv()成功返回 mtext 中接收到的數據長度, 失敗返回-1 msqtyp: 指定接收的消息類型,類型可以為 0 msqflg: 一般設置為 0 可以設置 IPC_NOWAIT//設置為0,消息隊列為空或者沒有這類數據的話,會阻塞。 */ ssize_t msgrcv( int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg);/* msgctl()控制消息隊列 msgctl()成功返回 0,失敗返回-1 cmd: IPC_RMID */ int msgctl( int msqid, int cmd, struct msqid_ds *buf);示例代碼:wr.c進程隨機發送消息類型為1、2的消息,進程 rd1.c 讀取消息類型為1消息,進程rd2.c讀取消息類型為 2的消息。wr.c退出的話,會先發送一條消息類型為1的數據“end”,再發送一條消息類型為 2的數據“end”,rd1和rd2分別讀取,并退出,rd2.c程序里銷毀消息隊列 。
wr.c代碼:
rd1.c代碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<assert.h> #include<sys/msg.h>typedef struct msgdata {long mtype;char mtext[128]; }MsgData;int main() {int msgid = msgget((key_t)1234,IPC_CREAT|0664);assert(msgid != -1);MsgData data;memset(&data,0,sizeof(data));while(1){msgrcv(msgid,&data,128,1,0);if(strncmp(data.mtext,"end",3) == 0){break;}printf("data.typy:%d\n",data.mtype);printf("data.mtext:%s\n",data.mtext);}exit(0); }rd2.c代碼:
include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<assert.h> #include<sys/msg.h>typedef struct msgdata {long mtype;char mtext[128]; }MsgData;int main() {int msgid = msgget((key_t)1234,IPC_CREAT|0664);assert(msgid != -1);MsgData data;memset(&data,0,sizeof(data));while(1){msgrcv(msgid,&data,128,2,0);if(strncmp(data.mtext,"end",3) == 0){break;}printf("data.typy:%d\n",data.mtype);printf("data.mtext:%s\n",data.mtext);}msgctl(msgid,IPC_RMID,NULL);exit(0); }運行wr.c和rd1.c、rd2.c程序。
wr.c程序發送以下圖中消息:
rd1.c程序運行結果:
rd2.c程序運行結果:
在這里,rd2.c里面對消息隊列進行了銷毀。
如果沒在代碼里操作銷毀消息隊列,可以 用命令ipcrm -q + msqid進行銷毀。
總結
以上是生活随笔為你收集整理的进程间通信——消息队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程间通信——信号量及ipcs/ipcr
- 下一篇: Linux线程——线程安全问题