面试题答案
一键面试msgsnd函数
-
基本参数及其作用:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid
:消息队列标识符,由msgget
函数返回,用于指定要发送消息的消息队列。msgp
:指向要发送的消息结构体的指针。该结构体一般定义如下:struct msgbuf { long mtype; /* 消息类型,必须大于0 */ char mtext[1]; /* 消息正文,实际长度由msgsz指定 */ };
msgsz
:msgp
指向的消息正文(不包括mtype
字段)的字节数。msgflg
:标志位,常用值有:IPC_NOWAIT
:若消息队列已满,不等待,立即返回EAGAIN
错误。- 0:若无可用空间,进程阻塞直到有空间或队列被删除。
-
常见错误及处理:
- EACCES:权限不足。检查消息队列的权限设置,确保当前进程有发送消息的权限。可以通过
ipcs -q
查看消息队列权限,必要时修改权限(如使用ipcrm -q msqid
删除队列后重新创建并设置合适权限)。 - EAGAIN:当设置了
IPC_NOWAIT
且消息队列已满时返回。可以选择等待一段时间后重试,或者调整消息队列大小(通过ipcs -l
查看系统限制,通过修改内核参数等方式调整)。 - EFAULT:
msgp
指针指向的地址非法。检查msgp
指针是否正确分配内存。 - EIDRM:消息队列已被删除。重新获取消息队列标识符(通过
msgget
)并重新发送。 - EINVAL:
msqid
无效,或者msgsz
超过系统限制(MSGMAX
)。检查msqid
是否正确获取,调整msgsz
大小在系统允许范围内(可通过sysctl -a | grep msgmax
查看MSGMAX
值)。
- EACCES:权限不足。检查消息队列的权限设置,确保当前进程有发送消息的权限。可以通过
msgrcv函数
-
基本参数及其作用:
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
msqid
:消息队列标识符,同msgsnd
,指定要接收消息的消息队列。msgp
:指向用于接收消息的结构体的指针,结构体定义与发送时类似。msgsz
:msgp
指向的消息正文(不包括mtype
字段)的最大字节数。实际接收的字节数会返回。msgtyp
:指定要接收的消息类型:msgtyp == 0
:接收消息队列中的第一条消息。msgtyp > 0
:接收消息类型为msgtyp
的第一条消息。msgtyp < 0
:接收消息类型小于等于abs(msgtyp)
的消息中类型最小的第一条消息。
msgflg
:标志位,常用值有:IPC_NOWAIT
:若没有符合条件的消息,不等待,立即返回ENOMSG
错误。MSG_NOERROR
:若消息正文长度大于msgsz
,截断消息正文,不返回错误。
-
常见错误及处理:
- E2BIG:消息正文长度大于
msgsz
且未设置MSG_NOERROR
。可以增大msgsz
,或者处理截断后的消息(若设置了MSG_NOERROR
)。 - EACCES:权限不足。处理方式同
msgsnd
中的EACCES
错误,检查和调整消息队列权限。 - EAGAIN:设置了
IPC_NOWAIT
且无符合条件的消息。可以等待一段时间后重试。 - EFAULT:
msgp
指针指向的地址非法。检查msgp
指针是否正确分配内存。 - EIDRM:消息队列已被删除。重新获取消息队列标识符(通过
msgget
)并重新接收。 - EINVAL:
msqid
无效,或者msgsz
小于0。检查msqid
是否正确获取,确保msgsz
为非负。 - ENOMSG:设置了
IPC_NOWAIT
且无符合条件的消息。处理方式同EAGAIN
,等待后重试。
- E2BIG:消息正文长度大于