c/c++ linux 进程间通信系列6,使用消息队列(message queue)
程序员文章站
2022-06-22 12:03:02
linux 进程间通信系列6,使用消息队列(message queue) 概念:消息排队,先进先出(FIFO),消息一旦出队,就从队列里消失了。 1,创建消息队列(message queue) 2,写消息到消息队列(message queue) 3,从消息队列(message queue)读消息 3 ......
linux 进程间通信系列6,使用消息队列(message queue)
概念:消息排队,先进先出(fifo),消息一旦出队,就从队列里消失了。
1,创建消息队列(message queue)
2,写消息到消息队列(message queue)
3,从消息队列(message queue)读消息
3,删除消息队列(message queue)
1,创建消息队列(message queue)
#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> int main(){ int msgid; msgid = msgget(ipc_private, 0600); if(msgid < 0){ perror("msgget"); return 1; } printf("%d\n", msgid); return 0; }
用下面的命令,能够查看到上面的程序创建的共享内存。
ipcs -q
执行后的结果:
------ message queues -------- key msqid owner perms used-bytes messages 0x00000000 32768 ys 600 0 0
2,写消息到消息队列(message queue)
#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdlib.h> #define mtextsize 10 int main(int argc, char* argv[]){ int msgid; struct msgbuf{ long mtype; char mtext[mtextsize]; }mbuf; if(argc != 2){ printf("wrong argc"); return 1; } msgid = atoi(argv[1]); mbuf.mtype = 777; memset(mbuf.mtext, 0, sizeof(mbuf.mtext)); mbuf.mtext[0] = 'a'; if(msgsnd(msgid, &mbuf, mtextsize, 0) != 0){ perror("msgsnd"); return 1; } return 0; }
执行方法:【ipcs -q】执行后,得到下面的数字。
./a.out 789884
执行后:ipcs -q 发现, message下面的数字从0变为1了,说明消息队列里有了一个消息。
------ message queues -------- key msqid owner perms used-bytes messages 0x00000000 32768 ys 600 10 1
3,从消息队列(message queue)读消息
#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdlib.h> #define mtextsize 10 int main(int argc, char* argv[]){ int msgid, msgtype; struct msgbuf{ long mtype; char mtext[mtextsize]; }mbuf; if(argc != 3){ printf("wrong argc"); return 1; } msgid = atoi(argv[1]); msgtype = atoi(argv[2]); if(msgrcv(msgid, &mbuf, mtextsize, msgtype, 0) <= 0){ perror("msgrcv"); return 1; } printf("%c\n", mbuf.mtext[0]); return 0; }
执行方法:必须指定在写入消息是的type,也就是777
./a.out 32768 777
执行后,ipcs -q发现,message下面的数字,由1变为0了,说明消息队列里没有消息了。
------ message queues -------- key msqid owner perms used-bytes messages 0x00000000 32768 ys 600 0 0
4,删除消息队列(message queue)
#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdlib.h> int main(int argc, char* argv[]){ int msgid; msqid_ds mds; if(argc != 2){ printf("wrong argv\n"); return 1; } msgid = atoi(argv[1]); if(msgctl(msgid, ipc_rmid, &mds) != 0){ perror("msgctl"); return 1; } return 0; }
执行方法:
./a.out 32768
执行后,ipcs -q发现,消息队列本身都没有了。
------ message queues -------- key msqid owner perms used-bytes messages
用命令行删除共享内存:【ipcs -q】执行后,得到下面的数字。
ipcrm -q id
c/c++ 学习互助qq群:877684253
本人微信:xiaoshitou5854
上一篇: 用asp怎样编写文档搜索页面(1)
推荐阅读
-
c/c++ linux 进程间通信系列3,使用socketpair,pipe
-
c/c++ linux 进程间通信系列4,使用共享内存
-
c/c++ linux 进程间通信系列6,使用消息队列(message queue)
-
c/c++ linux 进程间通信系列5,使用信号量
-
c/c++ linux 进程间通信系列7,使用pthread mutex
-
c/c++ linux 进程间通信系列2,使用UNIX_SOCKET
-
c/c++ linux 进程间通信系列1,使用signal,kill
-
c/c++ linux 进程间通信系列7,使用pthread mutex
-
c/c++ linux 进程间通信系列3,使用socketpair,pipe
-
c/c++ linux 进程间通信系列4,使用共享内存