消息队列中的accept()IPC UNIX

时间:2013-05-14 14:32:01

标签: c++ c linux unix ipc

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() IPC中是否有sockets函数,但对于message queues IPC? 我的服务器应等待客户端连接,并且仅在客户端连接时将数据发送回它。 我特意从客户端发送一些无用的数据并在无限循环中检查数据(这意味着客户端已连接,我知道这是非常愚蠢的算法)。

1 个答案:

答案 0 :(得分:0)

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

某些实现(z / OS?)会公开msgrcv上阻止的进程数,这与您要查找的进程类似,但这不是可移植的。

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

首先,做你正在做的事情,但不要在服务器msgrcv中做IPC_NOWAIT。如果你没有做任何事情,没有必要在循环中旋转。直到客户宣布自己为止。 (并使用不同的消息类型进行从客户端到服务器和服务器到客户端的通信 - 您不希望客户端将消息消耗到服务器,反之亦然。)

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