消息队列
博文
https://www.cnblogs.com/fangshenghui/archive/2004/01/13/4039866.html
编程步骤
步骤 | 进程1 | 进程2 | 使用函数 |
---|---|---|---|
1 | 获取到key | 获取到key | msgget |
2 | 使用key创建消息队列拿到消息id | 使用key获取到消息队列的id | msgget |
3 | 发送消息 | 接收消息 | msgSnd/msgRev |
4 | 释放消息队列 | 释放消息队列 | msgctl |
实例程序
进程1:读
int running = 1;
int msgid = -1;
struct msg_st data;
long int msgtype = 0;
//通过key获取到msgid
msgid = msgget((key_t)1234,0666|IPC_CREAT);
if(msgid == -1){
fprintf(stderr,"msgget failed with error:%d\n",errno);
exit(-1);
}
while(running){
//读消息
if(msgrcv(msgid,(void*)&data,BUFSIZ,msgtype,0)==-1){
fprintf(stderr,"msgget failed with error:%d\n",errno);
exit(-1);
}
printf("you wrote:%s\n",data.text);
if(strncmp(data.text,"end",3)==0)
running = 0;
}
//释放消息
if(msgctl(msgid,IPC_RMID,0)==-1){
fprintf(stderr,"msgctl(IPC_RMID) failed\n");
exit(-1);
}
exit(0);
进程1:写
int running = 1;
int msgid = -1;
struct msg_st data;
char buffer[BUFSIZ];
//通过key获取到msgid
msgid = msgget((key_t)1234,0666|IPC_CREAT);
if(msgid == -1){
fprintf(stderr,"msgget failed with error:%d\n",errno);
exit(-1);
}
while(running){
printf("enter some text:");
fgets(buffer,BUFSIZ,stdin);
data.msg_type = 1;
strcpy(data.text,buffer);
//发送消息
if(msgsnd(msgid,(void*)&data,MAX_TEXT,0)==-1){
fprintf(stderr,"msg send failed with error:%d\n",errno);
exit(-1);
}
if(strncmp(buffer,"end",3)==0){
running = 0;
}
sleep(1);
}
//释放消息
if(msgctl(msgid,IPC_RMID,0)==-1){
fprintf(stderr,"msgctl(IPC_RMID) failed\n");
exit(-1);
}
exit(0);