【问题标题】:Process communication with message queue进程与消息队列的通信
【发布时间】:2014-01-17 17:04:03
【问题描述】:

我的通信队列有问题。在我尝试编写的服务器程序中,我需要在使用 fork 函数创建的两个进程之间进行通信。 我收到Invalid Argument 错误,但我不知道为什么。这是我简化的非工作代码。

key_t key = ftok(".",'A');
msgget(key,IPC_CREAT);
perror(""); //receive succes

if(fork()>0){
    msgbuf dat;

    msgrcv(key,(void*)&dat,(size_t)sizeof(dat),500,0);
    perror(""); //receive INVALID ARGUMENT
    cout<<dat.mtext<<endl;
}
else
{
    msgbuf data;
    data.mtext[0]='a';
    data.mtype=500;

    msgsnd(key,(void*)&data,(size_t)sizeof(data),0);
    perror(""); //receive INVALID ARGUMENT
}

我应该更正什么才能使其正常工作?

P.S 我什至尝试使用睡眠功能来等待子进程,但它没有帮助。

【问题讨论】:

  • 长期没有像这样进行低级编程,但是从手册页来看,sizeof(dat) 是错误的。它需要是 msgbuf 中 mtext 字段的大小。
  • 不要调用perror(),除非你知道msgrcv()的返回值是-1errno 可能包含虚假值,或者与 3 天前调用的函数相关的值,如果 msgrcv() 没有表明它失败。如果msrgrcv() 确实失败了,那么根据我的手册页,EINVAL(或“无效参数”)表示“msgid 无效,或者msgsz 小于 0”...

标签: c linux posix message-queue


【解决方案1】:

msgrcv/msgsnd 采用从 msgget 返回的整数 msqid 不是键。

int qid = msgget(key, IPC_CREAT);

msgrcv(qid, (void*)&data, (size_t) sizeof(data), 500, 0);

//..........

msgsnd(qid,(void*) &dat,(size_t) sizeof(dat), 0);

请记住,data 结构应包含 long msgtype 作为您设置的第一个字段,在本例中可能为 msgtype = 500,因为这是您要读取的内容。

【讨论】:

    猜你喜欢
    • 2013-11-01
    • 2011-08-27
    • 2020-06-11
    • 2018-01-19
    • 2014-08-12
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多