今天写消息队列的时候,调用msgrcv的时候,发现总是报了这么个错误:Argument list too long,于是看了下代码,结果发现自己粗心大意,在msgsnd函数里传输的数据大小写错了,写成另外一个数据的结构体大小了,难怪接收方大小不匹配,就报错了.具体如下所示:
消息队列的函数定义如下:
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
函数里参数列表意思如下:
msqid:消息队列的识别码.
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下
struct msgbuf { long mtype; /* 消息类型,必须 > 0 */ char mtext[1]; /* 消息文本 */ };
msgsz:消息的大小.
msgtyp:消息类型
msgtyp等于0 则返回队列的最早的一个消息.
msgtyp大于0,则返回其类型为mtype的第一个消息.
msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息.
msgflg: 用来指明核心程序在队列没有数据的情况下所应采取的行动.如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已 满,则msgsnd()将不会阻塞,而会立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为 ENOMSG.当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式.
返回说明:
成功执行时,msgsnd()返回0,msgrcv()返回拷贝到mtext数组的实际字节数.失败两者都返回-1,errno被设为以下的某个值
[对于msgsnd]
EACCES:调用进程在消息队列上没有写权能,同时没有CAP_IPC_OWNER权能
EAGAIN:由于消息队列的msg_qbytes的限制和msgflg中指定IPC_NOWAIT标志,消息不能被发送
EFAULT:msgp指针指向的内存空间不可访问
EIDRM:消息队列已被删除
EINTR:等待消息队列空间可用时被信号中断
EINVAL:参数无效
ENOMEM:系统内存不足,无法将msgp指向的消息拷贝进来
[对于msgrcv]
E2BIG:消息文本长度大于msgsz,并且msgflg中没有指定MSG_NOERROR
EACCES:调用进程没有读权能,同时没具有CAP_IPC_OWNER权能
EAGAIN:消息队列为空,并且msgflg中没有指定IPC_NOWAIT
EFAULT:msgp指向的空间不可访问
EIDRM:当进程睡眠等待接收消息时,消息已被删除
EINTR:当进程睡眠等待接收消息时,被信号中断
EINVAL:参数无效
ENOMSG:msgflg中指定了IPC_NOWAIT,同时所请求类型的消息不存在
总结:报错Argument list too long错在使用msgsnd和msgrcv函数的时候,size_t msgsz 这个msgsz的大小双方不一致,msgsnd的长度大于了msgrcv的长度,所以就导致报错:Argument list too long
文章的脚注信息由WordPress的wp-posturl插件自动生成