1.消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。
1.1msgget函数【创建和访问一个消息队列】
int msgget(key_t key,int msgflg);
1.2msgsnd函数【添加】
int msgsnd(int msqid,const void* msg_ptr,size_t msg_sz,int msgflg);
msqid是由msgget函数返回的消息队列标识符
msg_ptr是由一个指向准备发送消息的指针
msg_sz是msg_ptr指向的消息的长度
msgflg控制在当前消息队列满或队列消息到达系统范围的限制时,将要发生的事情
1.3msgrcv函数【获取消息】
int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflg);
msqid是由msgget函数返回的消息队列标识符
msg_ptr是一个指向准备接受消息的指针
msg_sz是msg_ptr指向的消息的长度
msgtype是一个长整数
msgflg用于控制当前队列中没有相应类型的消息可以接收时将发生的事情
消息队列的结构定义
struct my_message
{
long message_type;
//需要的变量...
};
2.代码
a.c
typedef struct msgdata
{
long mtype;
char mtext[128];
}MsgData;
int main()
{
int msgid=msgget((key_t)1234,IPC_CREAT|0600);
assert(msgid != -1);
MsgData data;
memset(&data, 0, sizeof(data));
data.mtype = 1;
strcpy(data.mtext, "hello");
msgsnd(msgid, &data, 128, 0);
exit(0);
}
b.c
typedef struct msgdata
{
long mtype;
char mtext[128];
}MsgData;
int main()
{
int msgid = msgget((key_t)1234, 0664 | IPC_CREAT);
assert(msgid != -1);
MsgData data;
memset(&data, 0, sizeof(data));
msgrcv(msgid, &data, 128, 1, 0);
printf("data.type: %d\n", data.mtype);
printf("data.text: %s\n", data.mtext);
msgctl(msgid, IPC_RMID, NULL);
exit(0);
}