系列目录
进程间通信——共享内存
进程间通信——信号量
文章目录
一、概念
二、消息队列函数
1.msgget
2.magsnd
3.msgrcv
4.msgctl
三、掌握消息队列操作
头文件
#include
函数:
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
int msgget(key_t key,int msgflg);
int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflg);
int msgsnd(int msqid,const void *msg_ptr,size_t msg_sz,int msgflg);
int msgget(key_t key,int msgflg);
int msgsnd(int msqid,const void *msg_ptr,size_t msg_sz,int msgflg);
struct my_message{long int message_type;...
};
int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflg);
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
struct msqid_ds{uid_t msg_perm.uid;uid_t msg_perm.gid;mode_t msg_perm.mode;
};
通过代码掌握消息队列是如何发送与接收消息
在消息队列中添加消息:
message.c:发送消息”hello1",该进程运行一次,就会有1个“hello1"被添加入消息队列中。
#include
#include #include #include #include //定义消息 struct mess {long type;char data[128]; }; int main() {int msgid=msgget((key_t)1235,IPC_CREAT|0600);//添加一次,后面再使用就是获取消息if(msgid==-1){exit(0);}struct mess dt;dt.type=1;strcpy(dt.data,"hello1");//1号消息内容hello1msgsnd(msgid,(void*)&dt,128,0);//标志位0//消息队列不用移除 } 如下图所示,对message.c编译为mess,执行该文件1次,执行ipcs命令查看发现消息队列被添加一次
在消息队列中读取消息
编译message1.c读取消息队列中消息:
#include
#include #include #include struct mess {long type;char data[128]; }; int main() {int msgid=msgget((key_t)1235,IPC_CREAT|0600);if(msgid==-1){exit(0);}struct mess dt;msgrcv(msgid,(void*)&dt,128,1,0);printf("%s",dt.data); } 如下图所示,对message1.c编译为mess1,执行该程序,发现a1写入的”hello1“被读取输出在屏幕上。