消息队列中的accept()
accept() in message queues IPC UNIX
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()
可语义。
相关文章:
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 共享队列的线程安全
- 带自定义比较器的最小优先级队列
- 在 Vulkan Qt 中获取队列系列
- 堆栈和队列是否像C++中的数组一样传递?
- 在C++中创建队列 - 什么是 malloc 错误?
- 消息队列中的accept()