pub子IPC上unix有哪些方法?

时间:2014-09-14 00:23:01

标签: sockets unix publish-subscribe

IPC有多种选择。

通过网络:

  • 对于客户端 - 服务器,可以使用TCP
  • for pub sub,可以使用UDP多播

本地:

  • 对于客户端 - 服务器,可以使用unix域套接字
  • for pub sub,可以使用???

我认为我感兴趣的是某种文件描述符,它同时支持许多读者(订阅者)和许多作者(发布者)。这种使用模式在unix上是否可行/有效?

3 个答案:

答案 0 :(得分:1)

经过大量谷歌搜索后,我还没有找到ipc多播的方式,所以我决定编写一个程序pubsub,它将发布者地址和用户地址作为参数,监听并接受这些关联。 2个地址,然后对于发布者连接上接收的每个有效负载,将其写入每个订户连接。如果效率低下或重新发明车轮,我不会感到惊讶,但我没有遇到更好的解决方案。

答案 1 :(得分:0)

我一直在寻找类似问题的解决方案,并找到了/ dev / fanout。扇出是一个内核模块,它将输入复制到从中读取的所有进程。您可以将其视为IPC广播机制。根据作者的说法,适用于小型数据有效载荷。多个进程可以写入设备,多个进程可以从中读取。我不确定写入的原子性。来自多个进程的小写操作应该像FIFO一样原子地发生。

有关扇出的更多信息:

http://compgroups.net/comp.linux.development.system/-dev-fanout-a-one-to-many-multi/2869739 http://www.linuxtoys.org/fanout/fanout.html

答案 2 :(得分:0)

也有Posix消息队列。正如man mq_overview所说:

  

POSIX消息队列允许进程以消息形式交换数据。这个API与   System V消息队列(msgget(2),msgsnd(2),msgrcv(2)等),但是提供了类似的功能。

     

使用mq_open(3)创建和打开消息队列;此函数返回消息队列描述符(mqd_t),该描述符是   用于在以后的调用中引用打开的消息队列。每个消息队列由/ somename形式的名称标识;   也就是说,一个以NULL结尾的字符串,最多NAME_MAX(即255个)字符,由一个初始斜杠组成,后跟一个   或更多字符,都不是斜杠。通过将相同的名称传递给两个进程,可以在同一个队列上操作   mq_open(3)。

     

使用mq_send(3)和mq_receive(3)在队列之间来回传递消息。进程使用完队列后,可以使用mq_close(3)关闭该队列,而不再需要该队列时,可以使用mq_unlink(3)将其删除。   可以使用mq_getattr(3)和mq_setattr(3)检索和(在某些情况下)修改队列属性。进程可以使用mq_notify(3)请求异步通知消息到达先前为空的队列。

     

消息队列描述符是对打开消息队列描述的引用(请参阅open(2))。在fork(2)之后,子级继承其父级的消息队列描述符的副本,并且这些描述符与父级中的相应描述符引用相同的打开消息队列描述。这两个进程中的相应描述符共享与打开消息队列描述关联的标志(mq_flags)。

     

每条消息都具有关联的优先级,并且始终将消息始终首先传递到接收过程的最高优先级。   消息优先级范围从0(低)到sysconf(_SC_MQ_PRIO_MAX)-1(高)。在Linux上,sysconf(_SC_MQ_PRIO_MAX)返回32768,但是POSIX.1仅要求实现至少支持0到31范围内的优先级;一些实现仅提供此范围。

Michael Kerrisk的更友好的介绍可以在这里找到:http://man7.org/conf/lca2013/IPC_Overview-LCA-2013-printable.pdf