C 程序和脚本的信号处理有区别吗?

C 程序和脚本的信号处理有区别吗?

我有以下脚本和相应的 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 函数运行脚本,该脚本的行为都是相同的。

相关内容