linux进程通信--消息队列

来源:互联网 发布:撩淘宝客服 编辑:程序博客网 时间:2024/06/05 09:27
消息队列:
针对不同的对象发送消息 

创建并打开:

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 0while(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 512struct 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

0 0
原创粉丝点击