2 つのプロセスをパイプし、パイプの「出力」で 1 つを強制終了すると、最初のプロセスが「Broken Pipe」シグナルを受信するために使用され、通常はそれも終了していました。例:ランニング
$> do_something_intensive | less
SuSE8またはそれ以前のリリースでは、すぐにレスポンシブ シェルに戻ります。今日それを試しているとき、手動で強制終了するまで、do_something_tensiveは明らかにまだ実行されています。プログラムが「壊れたパイプ」を無視するようにする何かが変更されたようです(glib?シェル?)...
あなたの誰かがこれについてのヒントを持っていますか? 以前の動作を復元する方法は? なぜ変更されたのですか (または、常に複数のセマンティクスが存在するのはなぜですか) ?
edit : さらにテスト (strace を使用) すると、「SIGPIPE」が生成されていることがわかりますが、プログラムは中断されていません。シンプルな
#include <stdio.h>
int main()
{
while(1) printf("dumb test\n");
exit(0);
}
エンドレスに続きます
--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)
レスが殺されたとき。プログラムでシグナルハンドラをプログラムして確実に終了させることはできますが、SIGPIPEでプログラムを強制的に終了させる環境変数またはシェルオプションをもっと探しています
もう一度編集: tcsh 固有の問題 (bash が適切に処理) と端末依存 (Eterm 0.9.4) のようです。