c - 进程与消息队列的通信

标签 c linux posix message-queue

我有一个通信队列的问题。在我尝试编写的服务器程序中,我需要在使用 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 我什至尝试使用 sleep 函数来等待子进程,但它没有帮助。

最佳答案

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

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,因为这正是您正在尝试的阅读。

关于c - 进程与消息队列的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20845850/

相关文章:

c - 如何在 libuv 中获取已接受的 tcp 套接字的文件描述符?

linux - 如何忽略进入 stderr 的警告

linux - 使用 Linux 将项目文件夹链接到 dropbox 文件夹

linux - 我需要文件 I/O 的解释'我收到了我不明白的警告

c - MISRA C 建议不要使用 malloc,这是否意味着 calloc 更安全?

c# - 通过引用传递到非托管 C DLL 函数后,结构保持不变

C程序在指针运算后崩溃(仅在某些计算机上)

linux - 使用linux命令在与目录结构匹配的行末尾添加字符串

automation - CRON 作业在该月的最后一天运行

以原子方式创建文件