linux msgrcv 阻塞,Linux系统调用--msgsnd/msgrcv函数详解

本文详细介绍了msgsnd和msgrcv系统调用的功能及其使用方法。这两个系统调用用于在消息队列上进行消息的发送与接收操作。文章解释了各个参数的意义,包括消息队列标识符msqid、消息缓冲区指针msgp等,并阐述了在不同情况下可能返回的错误码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【msgsnd/msgrcv系统调用】

功能描述:

在消息队列上进行收发消息。为了发送消息,调用进程对消息队列必须有写权能。接收消息时必须有读权能。

用法:

#include #include #include

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:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。

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,同时所请求类型的消息不存在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值