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信号を受信しないようです。これら2つのケースで信号を処理/ルーティングする方法の違いが何であるかを知りたいです。

修正する

私はスクリプトをCプログラムのように作ろうとしており、それを愚かなsleep infinitybusy-waitに置き換えますwhile true; do sleep 0.1; done。これを行うと、スクリプトは端末で実行してもPython関数で実行しても同じように動作します。

ベストアンサー1

おすすめ記事