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) startedstderr로 인쇄, (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 함수에서 실행하든 동일하게 작동합니다.

관련 정보