【问题标题】:What signal is passed to child process on terminating main program?终止主程序时将什么信号传递给子进程?
【发布时间】:2014-01-30 06:32:39
【问题描述】:

在 Windows 7 机器上:-

  • 我有一个在命令提示符 [主进程] 上启动的主 (Python) 程序。

  • 此程序生成一个子 (Python) 程序 [子进程]。

  • 我关闭命令提示符。

结果:-

  • 子进程立即结束。

另一方面,如果我从任务管理器结束主程序,我观察到子进程仍在运行。

我想知道为什么这两种方法没有相同的结果?在这两种情况下是否发送了一些不同的信号?

【问题讨论】:

  • 您在哪个平台上工作?如果是 POSIX,当控制进程退出时,SIGHUP(挂断)被发送到它的所有子进程(可能会或可能不会真正终止它们)。据推测,在“任务管理器”环境中,父进程并未成为控制进程。请参阅Consequences of Process Termination 和相关信息。
  • AFAIK 当你关闭一个终端时,它会关闭所有附加到它的进程。您应该将子进程与终端分离(例如,将其守护)。
  • @JonathanLeffler 我正在使用 windows(win7) 操作系统。浏览了您引用的文档,它主要处理 POSIX 信号处理。
  • 这就是为什么确定你在哪里工作很重要。规则完全不同,适用于 Unix(POSIX、Linux)的规则不一定适用于 Windows,反之亦然。
  • 子进程在启动时分配给命令窗口。 Windows API 允许您指定子进程获得一个新窗口,或者没有窗口。希望 Python 在启动新进程时为您提供相同的选项。 (Windows API 还允许程序在启动后更改命令窗口,但我不知道 Python 是否将其公开给程序员。)

标签: python windows signals process-management


【解决方案1】:

对该问题的评论指出我得到答案。

我使用subprocess.Popen(args) 来生成子进程。这将成功生成子进程,但子进程将在与其父进程相同的命令窗口中启动。

通过subprocess Popen doc,我发现要传递一些额外的参数,以便在另一个命令窗口中启动子进程。

使用以下参数启动孩子解决了我的问题。

subprocess.Popen(args, shell=True, creationflags=subprocess.CREATE_NEW_CONSOLE)

最后一个参数 subprocess.CREATE_NEW_CONSOLE 仅适用于 windows。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2015-12-05
    • 2019-08-10
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多