【问题标题】:Can socket file descriptors be passed to childprocesses?可以将套接字文件描述符传递给子进程吗?
【发布时间】:2019-04-17 05:45:09
【问题描述】:

我目前正在编写一个程序,它是一个多处理服务器应用程序。我目前的想法是对于每个传入的 TCP 连接,我接受它并将传入的套接字描述符传递给使用 fork() 创建的子进程。两个进程中的套接字描述符是否相同,或者是否会发生未定义的行为?似乎我可以从传入的套接字读取但不能写入。

【问题讨论】:

  • 是的,没关系。例如,服务器进程侦听端口、接受连接并派生一个子进程来处理该连接曾经很常见,但有时您仍然会看到它。
  • 虽然前段时间分叉服务器并不少见......但这种方法被淘汰以及事件服务器和混合服务器(具有工作进程和线程池)是首选的原因是有原因的。就每个客户端的资源而言,分叉服务器的成本更高,并且可能无法支持大量并发连接。

标签: c sockets networking multiprocessing


【解决方案1】:

来自man accept强调我的:

返回值

成功时,这些系统调用返回一个非负整数,它是 接受套接字的文件描述符

来自man fork强调我的:

  • 子代继承父代的打开文件描述符集副本。子文件中的每个文件描述符与父文件中的相应文件描述符引用相同的打开文件描述(请参阅 open(2))。这意味着这两个描述符共享打开文件状态标志、当前文件偏移量和信号驱动的 I/O 属性(参见 fcntl(2) 中 F_SETOWN 和 F_SETSIG 的描述)。

在父/服务器中打开的每个接受的连接都将在子中完全相同。如果您的孩子不能给它写信,那就太奇怪了。

服务器通常是这样的:

while (..) {
     int newconnection = accept(..);
     switch (fork()) {
     case 0:
         child_handle_connection(newconnection);
         break;
     ...
     }
     close(newconnection);
     ....
 }

比较:我从 google 获得的关于“示例 http 服务器 C”的第一个结果是 this source file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多