linux消息队列简析
消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法:
消息发送端代码:
#include <stdio.h>
#include <stdlib.h>#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/types.h>
int message_id;
struct my_message
{
long int message_type;
char buf[BUFSIZ];
};
struct my_message message;
int main(void)
{
int ret;
int running = 1;
char buffer[BUFSIZ];
// 打开或创建消息队列
message_id = msgget((key_t)1234, 0666|IPC_CREAT);
if(message_id == -1)
{
perror("fail to msgget");
exit(1);
}
memset(&message, 0, sizeof(struct my_message));
while(running)
{
printf("Please input text\n");
fgets(buffer, BUFSIZ, stdin);
//发送类型为8的消息
message.message_type = 8;strcpy((message.buf), buffer);
//发送消息,消息长度为message.buf长度,不包括message_type长度;IPC_NOWAIT设置不阻塞
ret = msgsnd(message_id, (const void *)&message, sizeof(message.buf), 0|IPC_NOWAIT);
if(ret == 0)
{
printf("send message:%s \n", message.buf);
}
else
{
perror("fail to msgsnd");
}
if(strncmp(buffer, "end", 3) == 0)
{
running = 0;
}
}
//删除消息队列
ret = msgctl(message_id, IPC_RMID, 0);
if(ret < 0)
{
perror("fail to msgctl");
exit(1);
}
return 0;
}
消息接收端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/types.h>
int message_id;
struct my_message
{
long int message_type;
char buf[BUFSIZ];
};
struct my_message message;
int main(void)
{
int ret;
int running = 1;
//接收类型为8的消息
long int recv_type = 8;
message_id = msgget((key_t)1234, 0666|IPC_CREAT);
if(message_id == -1)
{
perror("fail to msgget");
exit(1);
}
memset(&message, 0, sizeof(struct my_message));
while(running)
{
ret = msgrcv(message_id, &message, BUFSIZ, recv_type,0);
if(ret > 0)
{
printf("received message %s", message.buf);
}
else
{
perror("fail to msgrcv");
}
if(strncmp(message.buf, "end", 3) == 0)
{
printf("1\n");
running = 0;
}
}
return 0;
}