私は次のスクリプトと対応する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
信号を受信しないようです。これら2つのケースで信号を処理/ルーティングする方法の違いが何であるかを知りたいです。
修正する
私はスクリプトをCプログラムのように作ろうとしており、それを愚かなsleep infinity
busy-waitに置き換えますwhile true; do sleep 0.1; done
。これを行うと、スクリプトは端末で実行してもPython関数で実行しても同じように動作します。