サブプロセスがターミナルのフォアグラウンドプロセスグループの唯一のメンバになるため、Bashは、サブプロセスが開始されると、ターミナル入力もシグナル(SIGINTなど)も生成されません。サブプロセスが終了すると、Bashは端末を再び見るだけです。
サブプロセスはシグナルハンドラが割り当てられていないシグナルの処理を継承するため、bashでSIGINTを無視します。
stty
を使用して、SIGINTを別のキーボード記号(またはキーボード記号なし)に再割り当てすることができます。サブプロセスはその設定も継承します。これはctrl-Cを通常の文字にするので、サブプロセスを中断しません。残念ながら、bashも中断しないので、それは実際の解決策ではありません。
擬似端末(pty)を作成し、擬似ttyのスレーブ側にサブプロセスを付加することで、より多くの制御を行うサブプロセスを作成できます。次に、ptyのマスター側にデータを書き込んで、端末から読み取った入力をサブプロセスに渡すことができます。マスター側から読み取り、端末に書き込むことで、サブプロセスの出力を端末に戻すことができます。この構成では、マスター・プロセスでSIGINTをトラップし、サブプロセスに渡すことはできません。しかし、ほとんどの場合、これはシステムの機能にアクセスするための言語(必ずしもCではない)で記述する必要があります。それはbashで可能かもしれないが、それはかなりハックになります。開始場所の詳細については、man pty
をお読みください。
私は、 'ctrl_c_handler()'の最後に置くことができるコマンドのセットの前にスクリプト内のどこかに本当に巧妙なジャンプがない限り、これは可能ではないと思います。 – Mort