进程间通信——消息队列
多线程
进程间通信——消息队列
消息队列——发送
-
测试代码
#include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h>#include <stdlib.h> #include <stdio.h> #include <string.h>#define MAX_BUF_SIZE 255struct msgtype {long mtype;char buf[MAX_BUF_SIZE]; };int main(int argc, char const *argv[]) {if (argc != 3){printf("argv must be 3\r\n");return 0;}//1.创建消息队列int msgid = 0;//key为IPC_PRIVATE 也就是0时,则只能在当前进程使用,非零值可以在多个进程之间共享调用//flag为IPC_GREAT时,msgget要么返回新创建的id要么返回自己写的key值,如果为IPC_CREAT|IPC_EXCL时,要么返回新创建的id,要么返回-1,已经存在msgid = msgget((key_t)1234567,0666|IPC_CREAT);//2.向消息队列发送数据struct msgtype msg;msg.mtype = atoi(argv[1]);strcpy(msg.buf,argv[2]);msgsnd(msgid,&msg,sizeof(struct msgtype),0);return 0; }
消息队列——接受
-
测试代码
#include <stdio.h> #include <string.h> #include <stdlib.h>#include <sys/ipc.h> #include <sys/msg.h> #include <sys/types.h>#define MAX_BUF_SIZE 512struct msgtype {long mtype;char buf[MAX_BUF_SIZE]; };int main(int argc, char const *argv[]) {if(argc != 2){printf("argc must be at least 2\r\n");return 0;}//1.创建消息队列,如果存在就打开消息队列int msgid;msgid = msgget((key_t)1234567,IPC_CREAT|0666);//2.从消息队列读取数据struct msgtype msg;memset(&msg, 0, sizeof(msg));msgrcv(msgid, &msg,sizeof(msg),atoi(argv[1]),0);printf("msgrecv:%s\r\n",msg.buf);return 0; }
消息队列——删除
-
测试代码
#include<stdio.h> #include <stdlib.h> #include <string.h>#include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h>int main(int argc, char const *argv[]) {if(argc != 2){printf("argc must be at least 2\r\n");return 0;}int msgid = 0;int ret = 0;msgid = atoi(argv[1]);printf("%d-0x%x\r\n",msgid,msgid);ret = msgctl(msgid,IPC_RMID,NULL);if(ret < 0){printf("rm failed\r\n");return 0;}else{printf("rm success\r\n");}return 0; }
消息队列测试过程中的注意事项:
-
mesget的第二个参数一定要
|0666
用来给消息队列赋予权限,否则无法写入数据同时也无法接受数据,通过ipcs
查询的时候就可以看到消息队列的权限 -
报错
*** stack smashing detected ***: <unknown> terminated 已放弃 (核心已转储)
是因为分配的空间不够用,我这里出现这种情况的原因是,向消息队列中写入数据的时候写入的是数据部分+数据类型两个部分的数据长度总和,而读取是分配的空间之后数据部分的长度,就造成越界了