c - msgrcv : Invalid Arguments 错误

标签 c unix ipc

我正在unix系统上用C编写代码。我创建了一个消息队列服务器。每次我收到新消息时,我都会 fork ,并且子进程会处理新客户端。服务器等待新的客户端。这是代码。

for (;;)
 {
      struct my_msgbuf buf;

      if (msgrcv (msqid, &(buf.mtype), sizeof (buf), 1, 0) == -1)
      perror ("msgrcv");


    if((pid = fork())<0)
    perror("fork");


    if(pid==0)
    {
     //child code
    }
}

现在代码适用于第一次迭代,但在第二次迭代时 msgrcv 给出以下错误 - msgrcv:无效参数而不是等待新消息。

最佳答案

msgrcv 确实采用 msgsz 参数,但它不是 struct my_msgbuf 的大小,而是结构体的mtext[]字段。

我认为你不应该直接使用struct msgbuf。用适当的空间定义自己的内容是正常的。按照您的方式,您的 buf 声明仅分配 1 个字节,然后代码告诉内核您有 sizeof buf 字节,但您没有。因此,该代码据说会调用未定义行为或 UB。

这可能会或可能不会解释EINVAL,但人们应该始终修复已知的错误并重新测试,因为 UB 污染了进一步的分析......

关于c - msgrcv : Invalid Arguments 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1586006/

相关文章:

java - 仅限本地主机的 RMI?

c - 没有库函数将单词从句子中分离出来

c - MPI - 并行点积计算

c 编程使用静态变量然后指向它?可能的?

linux - `exec n<&0 < file` 和 `exec n<file` 命令之间的区别以及有关 exec 命令的一些一般问题

.net - ssh 坚持从控制台读取密码而不是 stdin

c - 在嵌入式c中制作头文件

c - 如何在奇偶排序程序中创建线程并正确排序?

bash - Unix:是否可以将错误输出复制到文件,同时仍显示所有输出?

php - PHP与Python的通信