如何在两个进程之间建立通信?

时间:2016-06-17 12:57:58

标签: linux sockets

我有以下情况:

  1. 对内存中保存的数据执行特权操作的守护程序。

  2. 当前在大约30个处理用户请求的核心上运行的多线程服务器。

  3. 服务器(1)将从(2)接收查询,逐个处理它们,并返回答案。对(1)的每个查询都不会阻塞,只需要花费一小时(1)进行处理,因此我们保证快速获得响应,除非(1)因负载过大而超支。

    本质上,我想建立一种情况,其中(1)侦听UNIX域套接字,(2)写入请求并读取响应。但是,我希望(2)的每个线程能够同时读写。我的想法是每个线程有一个UNIX套接字用于(1)和(2)之间的通信,这些套接字上的epoll_wait上的(1)块一个接一个地处理请求。然后,(2)上的每个线程将独立地读取和写入其套接字。

    我用这种方法看到的问题是我不能轻易地动态增加(2)上的线程数。有没有办法以一种在运行时配置方面灵活的方式来实现这一目标?我想一种方法是拥有大量套接字并且(2)上的线程将随机选择一个套接字,在其上获取互斥,编写查询并阻止等待响应,然后一旦获得它就释放互斥锁(1)回复。

    任何人都有更好的想法?

1 个答案:

答案 0 :(得分:0)

我建议一个可行的可能性是使用你自己的提议并让每个线程创建自己的套接字以与守护进程通信。您可以使用流式(tcp)套接字,它可以轻松解决您动态添加更多线程的问题:

  1. 守护程序使用socket()bind()listen()侦听特定端口。被监听的套接字最初是其epoll_wait集中的唯一内容。
  2. 客户端线程使用connect()
  3. 连接到此端口
  4. 守护程序服务器接受(使用accept())传入连接以创建新套接字,该套接字已添加到epoll_waitepoll_ctl()
  5. 上面的过程可以用来随意添加任意数量的套接字,所有套接字都在守护进程端有一个epoll_wait循环。