消息队列:
针对不同的对象发送消息
创建并打开:
int msgid = msgget(key_t, 0666|IPC_CREAT);
销毁:
msgctl(msgid, IPC_RMID, 0 );
发送消息:
msgsnd(msgid, struct msg指针 , 有效数据size ,msgflg );
struct msg {
long int msgtype; --- 一定要的!!!
char text[20]; --------------- 要传入的数据就是20B,也就是大小设置
};
接收消息:
magrcv(msgid, 接收放置的位置 , size(20B) , msgtyp, msgflg)
msgtyp = 0 就是消息队列里面第一条
msgtyp > 1 消息类型为msgtyp的第一条消息
msgtyp < 0 消息类型为小于或等于|msgtyp|的最小值的第一条消息
2 1 3
msgtyp = -3 就取为1 的
参考:http://blog.csdn.net/ljianhui/article/details/10287879
针对不同的对象发送消息
创建并打开:
int msgid = msgget(key_t, 0666|IPC_CREAT);
销毁:
msgctl(msgid, IPC_RMID, 0 );
发送消息:
msgsnd(msgid, struct msg指针 , 有效数据size ,msgflg );
struct msg {
long int msgtype; --- 一定要的!!!
char text[20]; --------------- 要传入的数据就是20B,也就是大小设置
};
接收消息:
magrcv(msgid, 接收放置的位置 , size(20B) , msgtyp, msgflg)
msgtyp = 0 就是消息队列里面第一条
msgtyp > 1 消息类型为msgtyp的第一条消息
msgtyp < 0 消息类型为小于或等于|msgtyp|的最小值的第一条消息
2 1 3
msgtyp = -3 就取为1 的
消息队列可以独立于发送和接收进程而存在, 有选择地接收数据, 可同步
实例:
client.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
#include <errno.h>
struct msg_st
{
long int msg_type;// !!!!!!必须
long msg_type_using; // 1:n 因为第一个参数msg_type是不能从data中获得的,所以多设置一个
int val_a;
int val_b;
int sum ;
};
int main()
{
struct msg_st data;
int msgid = -1;
//建立消息队列
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(EXIT_FAILURE);
}
//向消息队列中写消息,直到写入0 0
while(1)
{
//输入数据
printf("Enter some text: ");
data.msg_type = data.msg_type_using =1;
scanf("%d %d", &data.val_a, &data.val_b);
printf("send %d + %d \n", data.val_a, data.val_b);
//向队列发送数据, size是不包括第一个关键long型的,0表示阻塞
if(msgsnd(msgid, (void*)&data, (sizeof(struct msg_st) - sizeof(long int)), 0) == -1)
{
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
//printf(" data @ %p \n", &data);
//结束
if( data.val_a == 0 && data.val_b == 0)
{
break;
}
if(msgrcv(msgid, (void*)&data, (sizeof(struct msg_st) - sizeof(long int)),data.msg_type_using+10 , 0) == -1)
{
fprintf(stderr, "msgrcv failed with errno: %d\n", errno);
exit(EXIT_FAILURE);
}
printf("sum is %d \n", data.sum);
}
exit(EXIT_SUCCESS);
}
server.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/msg.h> //
#define MAX_TEXT 512
struct msg_st
{
long int msg_type;// !!!!!!必须
long msg_type_using; // 1:n 因为第一个参数msg_type是不能从data中获得的,所以多设置一个
int val_a;
int val_b;
int sum ;
};
int main()
{
int msgid = -1;
struct msg_st data;
long int msgtype = -10; // 0; // 2; //注意1 0
//建立消息队列
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(EXIT_FAILURE);
}
printf("msgid = %d",msgid);
//从队列中获取消息,直到遇到0 0为止
while(1)
{
if(msgrcv(msgid, (void*)&data, (sizeof(struct msg_st) - sizeof(long int)), msgtype, 0) == -1)
{
fprintf(stderr, "msgrcv failed with errno: %d\n", errno);
exit(EXIT_FAILURE);
}
//printf("receive %d + %d \n", data.val_a, data.val_b);
data.sum = data.val_a + data.val_b;
data.msg_type = data.msg_type_using +10;
printf ("send to %ld : sum = %d \n", data.msg_type,data.sum);
if(msgsnd(msgid, (void*)&data, (sizeof(struct msg_st) - sizeof(long int)), 0) == -1)
{
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
//结束
if( data.val_a == 0 && data.val_b == 0)
{
break;
}
}
//删除消息队列
if(msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "msgctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
参考:http://blog.csdn.net/ljianhui/article/details/10287879