注意 :在消息得发送和接受时,可能会重置errno的值,如果发送和接受函数返回-1,要检查errno来确定具体的出错信息
消息的发送
#include <stdio.h> #include <sys/msg.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #define KEY 0x1234 /* * step 1 : 自定义msgbuf结构(存放消息的类型和数据本身),类比与msg.h中的struct msgbuf * 要求 message type 必须是long类型 , * 数据可以自定义为任何类型,并且对数据变量的数量没有要求 */ struct mymsg { long mtype; char data[1024]; }; int main(int argc, char **argv) { int msqid; //step 2 : 初始化msg变量 存放消息信息 struct mymsg msg; //step 3 : 打开(创建)消息队列对象 ,KEY是消息队列的关键字(16进制数), //成功返回消息队列ID,失败返回-1 if ((msqid = msgget(KEY, 0666 | IPC_CREAT)) < 0) { fprintf(stderr, "get message queue %X failed\n", KEY); exit(1); } while (strncmp(msg.data, "exit", 4)) { memset(&msg, 0, sizeof(msg)); //从标准输入获得消息数据 msg.mtype = getpid(); fgets(msg.data, sizeof(msg.data), stdin); /* * 发送消息msg到消息队列msqid,消息长度是消息数据长度 * 成功返回0;失败返回 -1 ;errno被置为相应的值 */ while (msgsnd(msqid, &msg, strlen(msg.data), 0) < 0) { //step 4 :发送判断 if (errno == EINTR) { continue; } else { fprintf(stderr, "send message error!"); exit(1); } } } return
消息的接收
#include <stdio.h> #include <sys/msg.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdlib.h> //接受消息队列信息 //自定义消息结构,与发送的消息结构相对应 struct mymsg { long mtype; char data[1024]; }; int main(int argc, char **argv) { struct mymsg msg; int msqid; int result; /* * 打开(创建)KEY为0x1234的消息队列,成功返回消息队列得ID,失败返回-1 */ if ((msqid = msgget(0x1234, 0666 | IPC_CREAT)) < 0) { fprintf(stderr, "open message queue %X error", 0x1234); exit(1); } while (strncmp(msg.data, "exit", 4)) { //清空msg内存,进行初始化 memset(&msg, 0, sizeof(msg)); while ((result = msgrcv(msqid, &msg, sizeof(msg), 0, 0)) < 0) { if (errno == EINTR) { continue; } else { perror("msgrcv"); exit(1); } } fprintf(stderr, "Message from msqid=%d , size=%d,type=%ld,data=%s\n", msqid, result, msg.mtype, msg.data); } return 0; }