编译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");,这个不影响报错,但会导致错误提示的函数名写错。
修复步骤
统一消息体长度参数
修改readmsg.c中的msgrcv调用,将第三个参数改为sizeof(buf.data),和msgsnd保持一致:ssize_t size = msgrcv(msgid,&buf,sizeof(buf.data),1234,0);更严谨的消息长度处理(可选但推荐)
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
相关产品推荐
相关产品推荐

