当parentchild在同一端口上监听时会发生什么?

2024-07-03 02:01:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个父进程,当它启动时,启动一个线程,该线程创建一个侦听端口X的TCP服务器实例。之后,父进程开始分叉子进程(只做很少的事情并退出)。注意,这些子进程从父进程继承fds,因此最终监听端口X

父程序有一个处理程序来处理端口X上的请求,但子进程没有这样的处理程序(它是操作系统执行(-)-ED C++程序)

我知道子进程可以关闭所有FD,在这种情况下不会出现上述情况。端口X上的传入请求会发生什么情况?如何处理?在

以下是我目前所观察到的。。。 执行父级中的tcp请求处理程序commands.getstatusoutput(..)当它收到请求时。大多数时候,它的行为和预期的一样(或者我预期的方式)——执行上面的命令没有任何错误……但是偶尔我会

File "/home/y/lib/python2.7/commands.py", line 61, in getstatusoutput
    sts = pipe.close()
IOError: [Errno 10] No child processes

Tags: 实例端口程序服务器处理程序进程情况事情
1条回答
网友
1楼 · 发布于 2024-07-03 02:01:45

在操作系统级别,这应该不会有任何问题。这基本上就是预分叉服务器的工作方式:

  1. 在主线程中创建套接字
  2. 将套接字绑定到地址
  3. 调用listen()将套接字置于侦听模式,此时任何连接请求都将被操作系统接受并排队
  4. 派生一组子对象,每个子对象都继承开放套接字
  5. 然后,子进程处理每个accept()调用,直到有一个连接供它们处理为止。在

如果子进程选择不在侦听套接字上调用accept()(您的exec进程不会这样做),那么该进程或仍在接受连接的进程不应该有任何问题。在

我所能看到的唯一复杂情况是,不能关闭套接字以便操作系统实际关闭它,所有引用它的进程都必须对其调用close(),从而使其打开描述符计数降至零。在

在您的情况下,如果该行为干扰了应用程序的其余部分,那么最好在分叉之后,但在调用exec之前关闭子对象中的侦听套接字。在

相关问题 更多 >