消息队列中的accept()

accept() in message queues IPC UNIX

本文关键字:accept 队列 消息      更新时间:2023-10-16
for (;;)
{
    if (msgrcv(msqid, &flag, sizeof(struct flags) - sizeof(long), 1, IPC_NOWAIT)>0)
           break;
}
    msgsnd(msqid, &message , sizeof(struct messages) - sizeof(long), 0);

是否有accept()的功能像sockets的IPC,但message queues的IPC?我的服务器应该等待客户端连接,只有当客户端连接发送数据回给它。我特别从客户端发送一些无用的数据,并在无限循环中检查数据(这意味着客户端已连接,我知道这是非常愚蠢的算法)。

不,没有直接类似的东西。消息队列更像无连接的数据报套接字,而不像面向连接的流套接字(支持accept()等)。

一些实现(z/OS?)公开msgrcv上阻塞的进程数,这与您正在寻找的类似,但这是不可移植的。

在我看来,你有两个简单的选择。

首先,做你正在做的事情,但不要在服务器的msgrcv中IPC_NOWAIT。如果你什么都不做,在一个循环中旋转是没有意义的。只要阻塞,直到客户端宣布自己。(并使用不同的消息类型进行客户端到服务器和服务器到客户端的通信—您不希望客户端将其消息消费到服务器,反之亦然。)

第二,切换到AF_UNIX流套接字,这将为您提供accept()可语义。