在socket编程中,可以在多进程(线程)中接受()相同的侦听套接字吗?

时间:2010-04-15 01:45:17

标签: sockets pthreads

  1. 在父进程中打开侦听套接字
  2. 在child1,child2,child3 ....中调用epoll_wait(listening_socket)。
  3. 如果有连接请求,
  4. 在每个孩子中打电话接受

2 个答案:

答案 0 :(得分:4)

通常,让多个线程在同一个套接字上执行IO而不在它们之间进行某种同步并不是一个好主意。在您的场景中,您可能会看到类似的内容:

  • 传入连接请求唤醒所有N个子线程中的epoll_wait
  • 所有N个线程调用accept,1个调用成功,N-1阻塞(或失败,如果你的侦听套接字是非阻塞的)

更常用的方法是让父线程循环在侦听套接字上调用accept,并为每个传入请求启动子线程。 (或者,如果您担心线程创建开销,则可以使用一个子线程池,在空闲时等待条件变量;父级将新接受的套接字添加到队列并使用pthread_cond_signal唤醒一个孩子来处理它。)

答案 1 :(得分:3)

是的,你可以,但你的例子有点不完整:

  1. 创建 listening_socket
  2. 使用 epoll_create 创建 epoll set
  3. 使用 epoll_ctl
  4. listen_socket 注册到 epoll set
  5. 在child1,child2,child3 ....中调用 epoll_wait epoll set )。
  6. 如果有连接请求,
  7. 在每个孩子中调用接受
  8. epoll_wait确保只有一个线程获取连接事件,并且只有该线程才会调用accept。

    如果您创建两个epoll集并将listen_socket注册到它们两个,您将收到两次事件,每个epoll集一次,并且不建议这样做。

    您可以参考本教程http://www.devshed.com/c/a/BrainDump/Linux-Files-and-the-Event-Poll-Interface/并在此论坛http://www.developerweb.net/forum/中搜索有关epoll的一些有趣讨论,以了解详情。

    有关更详细的示例,您可以随时参考libev,libevent或nginx源代码。