当前位置: 技术问答>linux和unix
关于消息队列的使用的问题
来源: 互联网 发布时间:2016-02-23
本文导语: 近期用消息队列写进程间通信的程序,但遇到如下问题,希望大家能帮忙看下,小弟先在这里致谢了,并祝各位圣诞快乐: rev: #include #include #include main() { int gflags,rflags; key_t key; int...
近期用消息队列写进程间通信的程序,但遇到如下问题,希望大家能帮忙看下,小弟先在这里致谢了,并祝各位圣诞快乐:
rev:
#include
#include
#include
main()
{
int gflags,rflags;
key_t key;
int msgid;
int reval;
struct msgmbuf
{
int mtype;
char mtext[10];
}msg_rbuf;
struct msqid_ds msg_ginfo;
char* msgpath="/unix/msgqueue";
key = ftok(msgpath,'a');
gflags = IPC_CREAT ¦IPC_EXCL;
msgid = msgget(key,gflags ¦00666);
if(msgid == -1)
{
printf("msg create error in msg2.cn");
return;
}
for(;;)
{
rflags = IPC_NOWAIT ¦MSG_NOERROR;
reval = msgrcv(msgid,&msg_rbuf,0,10,rflags);
if(reval == -1)
{
printf("read msg error in msg2.cn");
}
if(msg_rbuf.mtext[0] != 'n')
{
printf("%c",msg_rbuf.mtext[0]);
}
else
{
reval = msgctl(msgid,IPC_RMID,NULL);//delete msgqueue;
break;
}
}
}
snd:
#include
#include
#include
int msgcopy(int[],int[],int);
main()
{
int gflags,sflags;
key_t key;
int msgid;
int reval;
struct msgsbuf
{
int mtype;
char mtext[1];
}msg_sbuf;
struct msqid_ds msg_ginfo,msg_sinfo;
char *msgpath = "/unix/msgqueue";
char input;
key = ftok(msgpath,'a');
gflags = IPC_CREAT ¦IPC_EXCL;
msgid = msgget(key,gflags ¦00666);
if(msgid == -1)
{
printf("msg create error in msg1.cn");
return;
}
sflags = IPC_NOWAIT;
msg_sbuf.mtype = 10;
for(;;)
{
if(input = getchar() != 'n')
{
msg_sbuf.mtext[0] = input;
reval = msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
if(reval == -1)
{
printf("message send error in msg1.cn");
}
}
else
{
msg_sbuf.mtext[0] = 'n';
reval = msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
if(reval == -1)
{
printf("message send error in msg1.cn");
}
break;
}
}
}
当我先运行snd,再运行rev,提示msg create error(rev中报错),我个人感觉是snd已经创建了一个相同的消息队列,然后rev无法创建,就报错,但是,由于不晓得怎么删除这个消息队列,就没有办法进一步测试,请问各位是这样的原因么,还有我想请问的是如果我想两个进程中无论哪个先启动,在该消息队列不存在时都能创建一个新的消息队列,如果已经存在,则获得消息队列,该怎么改程序呢,谢谢大家了
rev:
#include
#include
#include
main()
{
int gflags,rflags;
key_t key;
int msgid;
int reval;
struct msgmbuf
{
int mtype;
char mtext[10];
}msg_rbuf;
struct msqid_ds msg_ginfo;
char* msgpath="/unix/msgqueue";
key = ftok(msgpath,'a');
gflags = IPC_CREAT ¦IPC_EXCL;
msgid = msgget(key,gflags ¦00666);
if(msgid == -1)
{
printf("msg create error in msg2.cn");
return;
}
for(;;)
{
rflags = IPC_NOWAIT ¦MSG_NOERROR;
reval = msgrcv(msgid,&msg_rbuf,0,10,rflags);
if(reval == -1)
{
printf("read msg error in msg2.cn");
}
if(msg_rbuf.mtext[0] != 'n')
{
printf("%c",msg_rbuf.mtext[0]);
}
else
{
reval = msgctl(msgid,IPC_RMID,NULL);//delete msgqueue;
break;
}
}
}
snd:
#include
#include
#include
int msgcopy(int[],int[],int);
main()
{
int gflags,sflags;
key_t key;
int msgid;
int reval;
struct msgsbuf
{
int mtype;
char mtext[1];
}msg_sbuf;
struct msqid_ds msg_ginfo,msg_sinfo;
char *msgpath = "/unix/msgqueue";
char input;
key = ftok(msgpath,'a');
gflags = IPC_CREAT ¦IPC_EXCL;
msgid = msgget(key,gflags ¦00666);
if(msgid == -1)
{
printf("msg create error in msg1.cn");
return;
}
sflags = IPC_NOWAIT;
msg_sbuf.mtype = 10;
for(;;)
{
if(input = getchar() != 'n')
{
msg_sbuf.mtext[0] = input;
reval = msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
if(reval == -1)
{
printf("message send error in msg1.cn");
}
}
else
{
msg_sbuf.mtext[0] = 'n';
reval = msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
if(reval == -1)
{
printf("message send error in msg1.cn");
}
break;
}
}
}
当我先运行snd,再运行rev,提示msg create error(rev中报错),我个人感觉是snd已经创建了一个相同的消息队列,然后rev无法创建,就报错,但是,由于不晓得怎么删除这个消息队列,就没有办法进一步测试,请问各位是这样的原因么,还有我想请问的是如果我想两个进程中无论哪个先启动,在该消息队列不存在时都能创建一个新的消息队列,如果已经存在,则获得消息队列,该怎么改程序呢,谢谢大家了
|
gflags = IPC_CREAT ¦IPC_EXCL;
都修改为:
gflags = IPC_CREAT ;
应该就不会报你说的错误了.
删除消息队列:
ipcrm -Q key
或者:
ipcrm -q id
都修改为:
gflags = IPC_CREAT ;
应该就不会报你说的错误了.
删除消息队列:
ipcrm -Q key
或者:
ipcrm -q id