套接字文件描述符可以传递给子进程吗?

时间:2018-11-14 09:45:55

标签: c sockets networking multiprocessing

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

1 个答案:

答案 0 :(得分: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在“ example http server C”上获得的第一个结果是this source file