我有以下脚本和相应的 C 程序,乍一看,它们在信号和标准错误输出方面的工作原理相同。
脚本:
#!/bin/sh
function terminate() {
printf "stopped" >&2
exit 0
}
printf "started" >&2
trap terminate SIGINT SIGTERM
sleep infinity
C程序:
#include <stdio.h>
#include <signal.h>
static volatile int terminating = 0;
void terminate(int _) {
terminating = 1;
}
int main(void) {
signal(SIGINT, terminate);
signal(SIGTERM, terminate);
fprintf(stderr, "started");
while(!terminating);
fprintf(stderr, "stopped");
return 0;
}
现在,当我从终端运行 C 程序或脚本(添加执行权限后)时,我得到了预期的行为,如下所示:(1)started
打印到 stderr,(2)我使用 Ctrl-C 发送 SIGINT, (3)stopped
打印到 stderr,(4) 进程以退出状态 0 终止。
但是,当我使用 Python 运行这些程序时create_subprocess_exec
,我发现虽然 C 程序的行为与我从终端运行它时一样,但脚本只进行打印,started
并且似乎没有接收到信号。我想知道在这两种情况下信号的处理/路由方式有什么区别。
更新
我试图使脚本更像 C 程序,并将 换成sleep infinity
愚蠢的 busy-wait while true; do sleep 0.1; done
。执行此操作后,无论我是从终端还是从 Python 函数运行脚本,该脚本的行为都是相同的。