在设置消息队列的O_NONBLOCK标志后,如何在使用mq_send()时测试阻塞?
是这样的吗
if (errno == EAGAIN)
printf("Blocking occured\n");
答案 0 :(得分:1)
(1)您使用mq_getattr
来电。
int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
(2)这将返回struct mq_attr,如下所示:
struct mq_attr {
long mq_flags; /* Flags: 0 or O_NONBLOCK */
long mq_maxmsg; /* Max. # of messages on queue */
long mq_msgsize; /* Max. message size (bytes) */
long mq_curmsgs; /* # of messages currently in queue */
};
(3)测试是否设置了O_NONBLOCK,例如
if (mystruct.mq_flags & O_NONBLOCK) //nonblocking
你可能会问别的东西。如果您想在设置队列非阻塞后知道mq_send
是否有效,那么您就有了正确的想法。如果呼叫没有工作(因为队列已满,你会阻止等待它有你的发送空间),那么呼叫将返回-1并且errno将被设置为EAGAIN。这并不代表"阻塞发生"这意味着阻塞会发生但不会,因为队列处于非阻塞模式。因此,当希望呼叫成功时,您必须稍后再次尝试发送。