【问题标题】:Forking and exiting from child in python在python中从孩子分叉和退出
【发布时间】:2014-11-13 01:26:27
【问题描述】:

我正在尝试分叉一个进程,在子进程中执行某些操作,然后退出它(参见下面的代码)。为了退出,我首先尝试了 sys.exit ,结果发现这是一个问题,因为中间函数捕获了 SystemExit 异常(如下面的代码所示),因此子进程实际上并没有终止。我发现我应该改用 os._exit 。现在孩子终止了,但我仍然看到周围已经失效的进程(当我这样做时ps -ef)。有没有办法避免这些?

import os, sys

def fctn():
    if os.fork() != 0:
        return 0
#   sys.exit(0)
    os._exit(0)

while True:
    str = raw_input()
    try:
        print(fctn())
    except SystemExit:
        print('Caught SystemExit.')

编辑:这实际上并不是一个真正的 Python 问题,而更像是一个 Unix 问题(所以我猜结果可能会因系统而异)。伊万的回答建议我应该做类似的事情

def handleSIGCHLD(sig, frame):
    os.wait()

signal.signal(signal.SIGCHLD, handleSIGCHLD)

对我来说很简单

signal.signal(signal.SIGCHLD, signal.SIG_IGN)

也可以。

然后我应该使用一些库可能是真的......

【问题讨论】:

  • 首先捕获SystemExit 通常是个坏主意;除非绝对必要,否则我建议不要这样做。
  • 其实我自己也没有抓到。我在 BaseHTTPServer.BaseHTTPRequestHandler 中实现 do_POST 并且一些调用它的函数捕获了异常。

标签: python fork system exit


【解决方案1】:

【讨论】:

    【解决方案2】:

    您最好使用 subprocess 模块来满足您的需要。它是分叉进程的首选方式。

    https://docs.python.org/2/library/subprocess.html#subprocess.check_call

    【讨论】:

    • OP 没有调用os.exec*(),所以整个subprocess 模块不适合这个用例(即它们没有执行一些外部二进制文件,所以没有什么可以传递给subprocess.call()和朋友)。
    • 在这种情况下,我误解了“分叉一个进程并与孩子做某事”。投票赞成另一个答案
    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 2015-12-12
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2023-03-07
    相关资源
    最近更新 更多