Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在两个流程之间建立通信?_Linux_Sockets - Fatal编程技术网

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

Linux 如何在两个流程之间建立通信?,linux,sockets,Linux,Sockets,我有以下情况: 对保存在内存中的数据执行特权操作的守护程序 一个多线程服务器,目前运行在大约30个内核上,处理用户请求 服务器(1)将接收来自(2)的查询,逐个处理,然后返回答案。对(1)的每个查询都不会被阻塞,并且只需要(1)上的几分之一微秒的处理时间,因此我们可以保证快速返回响应,除非(1)因负载过多而超限 从本质上讲,我想设置一个场景,其中(1)侦听UNIX域套接字,(2)写入请求并读取响应。但是,我希望(2)的每个线程都能够同时读写。我的想法是每个线程有一个UNIX套接字,用于(1)和(

我有以下情况:

  • 对保存在内存中的数据执行特权操作的守护程序

  • 一个多线程服务器,目前运行在大约30个内核上,处理用户请求

  • 服务器(1)将接收来自(2)的查询,逐个处理,然后返回答案。对(1)的每个查询都不会被阻塞,并且只需要(1)上的几分之一微秒的处理时间,因此我们可以保证快速返回响应,除非(1)因负载过多而超限

    从本质上讲,我想设置一个场景,其中(1)侦听UNIX域套接字,(2)写入请求并读取响应。但是,我希望(2)的每个线程都能够同时读写。我的想法是每个线程有一个UNIX套接字,用于(1)和(2)之间的通信。在epoll上有(1)块等待这些套接字逐个处理请求。然后(2)上的每个线程将独立地读写到其套接字

    我看到这种方法的问题是,我无法轻松地动态增加(2)上的线程数。有没有一种方法可以在运行时配置方面灵活地实现这一点?我猜一种方法是使用大量套接字,(2)上的线程随机选取一个套接字,在其上获取互斥体,编写查询并阻塞等待响应,然后在从(1)获得响应后释放互斥体


    有人有更好的想法吗?

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

  • 守护进程使用
    socket()
    bind()
    listen()
    侦听特定端口。正在侦听的套接字最初是其
    epoll\u wait
    集合中的唯一内容
  • 客户端线程通过
    connect()
  • 守护程序服务器接受(使用
    accept()
    )传入连接以创建新套接字,该套接字将添加到其
    epoll\u wait
    设置中,并使用
    epoll\u ctl()

  • 上述过程可用于根据需要任意添加多个套接字,所有这些都在守护进程端使用一个
    epoll\u wait
    循环。

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

  • 守护进程使用
    socket()
    bind()
    listen()
    侦听特定端口。正在侦听的套接字最初是其
    epoll\u wait
    集合中的唯一内容
  • 客户端线程通过
    connect()
  • 守护程序服务器接受(使用
    accept()
    )传入连接以创建新套接字,该套接字将添加到其
    epoll\u wait
    设置中,并使用
    epoll\u ctl()

  • 上述过程可用于任意添加所需数量的套接字,所有这些都在守护进程端使用一个
    epoll\u wait
    循环。

    对不起,您能否更详细地解释一下您提出的解决方案的问题是什么?让(2)的每个线程按照您的建议写入自己的套接字,以及(1)
    epoll_wait
    ing在所有线程上,如果您正在谈论数据报(看起来是!),那么让多个线程在同一个套接字上侦听(和写入),这似乎是完全合理的解决方案。此方案不需要任何外部同步(就其本身而言。当然,您可能需要同步外部数据)。@SergeyA:我猜同一套接字的问题在于读取响应时,试图找出响应属于哪个线程?@Smeeheey:如果套接字和线程之间有1对1的映射,然后,在增加服务器上的线程数量时,我必须以某种方式将此信息传递给进程(1),以便它开始侦听该套接字。对不起,您能否更详细地解释一下您提出的解决方案的问题是什么?让(2)的每个线程按照您的建议写入自己的套接字,以及(1)
    epoll_wait
    ing在所有线程上,如果您正在谈论数据报(看起来是!),那么让多个线程在同一个套接字上侦听(和写入),这似乎是完全合理的解决方案。此方案不需要任何外部同步(就其本身而言。当然,您可能需要同步外部数据)。@SergeyA:我猜同一套接字的问题在于读取响应时,试图找出响应属于哪个线程?@Smeeheey:如果套接字和线程之间有1对1的映射,然后,在增加服务器上的线程数量时,我必须以某种方式将此信息传递给进程(1),以便它开始侦听该套接字。