linux - 进程之间的1对多通信

时间:2014-07-26 23:14:26

标签: linux ipc

我正在尝试找到一种在Linux进程之间进行1对多通信的方法。我发现linux有named pipes,但那些不适用于多个读者(我在其他SO答案中发现,一旦读者读取一些数据,其他人就不会得到它);有人可以澄清这一点 - 我在SO上看到了复杂的答案 - 无论是否可能。

另外,根据我的理解,使用sockets,多个客户端可以连接到服务器,但在我的情况下,我需要一个进程将数据发送到多个进程(反向) - 就像一个广播

有人可以建议可用的选项吗?

编辑:可以使用共享内存吗?

2 个答案:

答案 0 :(得分:2)

命名管道确实就像一个管道,我。即他们有一个输入和一个输出。因此,您不能使用单个(命名)管道向多个其他进程发送信息。

但是没有什么可以反对为每个其他进程使用一个管道并使用相同信息填充所有管道的想法。这在使用命名管道(未命名)管道和套接字时将起作用。但它会在所有情况下意味着发送者跟踪所有接收者并分别将信息发送给每个接收者。

如果你想让发件人不知道收件人列表,那么我现在能想到的唯一方法是使用普通文件。你的发件人可以写它,接收者都可以读它。

答案 1 :(得分:1)

您可以将共享内存与读写信号量一起使用,以将数据从一个进程交换到多个进程。读写信号量可用于同步进程之间的数据。

以下是用于同步一个写入器线程和20个读取器线程之间的通信的伪代码。写入被阻止,直到所有读取器线程读取共享内存。

if it is a writer thread
{
    Take read-write mutex lock
    increment writers++;
    Release read-write mutex lock

    Sem wait for the node-is-empty
    Access the shared memory and fill the empty node

    Take read-write mutext lock
    Decrement writers--; 
    Release read-write mutex lock

    Sem post for the node-is-filled
}
else /* want to read */
{
    Take read-write mutex lock
    if (writers > 0 || readers == 20) //reader default value is 20 reader threads
    {
        Release read-write mutex lock
        sem wait for the node-is-filled
        Take read-write mutex lock
    }

    Release read write mutex lock

    printf("Shared Memory: %d\n", memory);

    Take read-write mutex lock
    readers--;
    if (readers == 0) //wait for all the threads to read the buffer
        sem post for the node-is-empty
    Release read-write mutex lock
}