You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译readmsg.c遇msgrcv: argument list too long错误求排查方案

解决msgrcv报argument list too long错误的排查与修复

问题根源

你遇到的msgrcv: argument list too long错误对应错误码E2BIG,触发原因是msgrcv指定的可接收消息体长度小于msgsnd实际发送的消息体长度:

  • 在msg.c中,msgsnd的第三个参数是sizeof(buf.data),即发送64字节的消息体(包含buf.data数组的全部内容)
  • 在readmsg.c中,msgrcv的第三个参数是sizeof(buf.data)-1,即仅允许接收63字节的消息体,当发送的消息长度超过这个限制时,就会触发E2BIG错误,对应提示就是argument list too long

另外你的代码里还有一个拼写错误:perror("msgcrcv");应该改为perror("msgrcv");,这个不影响报错,但会导致错误提示的函数名写错。

修复步骤

  1. 统一消息体长度参数
    修改readmsg.c中的msgrcv调用,将第三个参数改为sizeof(buf.data),和msgsnd保持一致:

    ssize_t size = msgrcv(msgid,&buf,sizeof(buf.data),1234,0);
    
  2. 更严谨的消息长度处理(可选但推荐)
    msgsnd的第三个参数最好传递消息的实际有效长度而非数组总长度,避免发送多余的空字节。修改msg.c中的msgsnd调用:

    if(msgsnd(msgid,&buf,strlen(buf.data),0)==-1){
        perror("msgsnd");
        return -1;
    }
    

    因为fgets会自动在输入末尾添加\0,strlen(buf.data)能准确获取实际输入的字符长度(包含换行符)。

额外排查建议

  • 可以通过打印errno值来确认错误类型:在perror前添加printf("errno: %d\n", errno);,E2BIG对应的值是7
  • 确认消息队列的权限和key值是否匹配:你用ftok(".",123)生成key,确保两个程序运行在同一个目录下,否则会生成不同的key,导致访问不同的消息队列
  • 测试时先启动readmsg.c,再启动msg.c发送消息,避免消息队列被提前删除

内容的提问来源于stack exchange,提问作者Winnie Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:14:54