【发布时间】:2021-07-30 09:12:58
【问题描述】:
您好,我编写的一个小型调试 GUI 有问题(使用 PySimpleGUI)。 GUI 的一部分是调用本地 Linux shell 命令的能力。
如果我在后台启动 GUI(使用 &),我想要执行的其中一个 shell 命令/程序会返回一个 SIGTTOU 信号。这将冻结 GUI,直到我使用 'fg' 将 GUI 置于前台。
由于在后台启动 GUI 很正常,我只想捕捉 SIGTTOU 信号,打印警告并继续。
下面的代码 sn-p 有点工作,但让 shell 命令成为僵尸(我没有从命令中得到返回值。更好的是使用 signal.signal(signal.SIGTTOU, signal.SIG_IGN) 但我真的想打印一个警告。这可能吗?signal.SIG_IGN 用什么来清除僵尸?
cmd_output = collections.deque()
...
def _handle_sigttou(signum, frame):
sys.__stdout__.write('WARNING: <SIGTTOU> received\n')
def _run_shell_command(cmd, timeout=None):
# run command
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# process output
for line in p.stdout:
line = line.decode(errors='backslashreplace').rstrip()
cmd_output.appendleft((f'{line}'))
# wait for return code
retval = p.wait(timeout)
# print result
cmd_output.appendleft((f'✘ ({retval})') if retval else ('✅'))
# send command
signal.signal(signal.SIGTTOU, _handle_sigttou)
#signal.signal(signal.SIGTTOU, signal.SIG_IGN) # this works without zombies, but I want to print a warning
threading.Thread(target=_run_shell_command, args=(_line, 60), daemon=True).start()
【问题讨论】: