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 的
参考: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 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
- linux消息队列进程通信
- linux消息队列进程通信
- linux消息队列进程通信
- linux进程通信---消息队列
- linux进程通信--消息队列
- linux进程通信--消息队列
- 【Linux】 进程通信--消息队列
- linux进程通信---消息队列
- linux进程通信-消息队列
- Linux进程间通信: 消息队列
- Linux进程间通信: 消息队列
- linux进程间通信之消息队列
- linux C-(进程间通信 消息队列)
- linux进程间通信之消息队列
- Linux高级进程间通信:消息队列
- linux进程间通信之消息队列
- Linux进程间通信之消息队列
- Linux进程通信-消息队列
- JavaScript网页脚本编程良好习惯
- 重造轮子-栈实现队列
- hdu5451 矩阵快速幂+暴力打表循环节
- SSL工作原理
- mysql:操作记录
- linux进程通信--消息队列
- oracle体系结构(1)
- 读完这100篇论文 就能成大数据高手
- Mac OS系统上用命令行方式启动VNC Server
- 高质量C++/C编程指南
- 朴素贝叶斯分类器
- Android 实现定时开关机另类实现--BSP级
- 自定义视图-圆形动画的使用
- Jsp和Servlet的联系与区别