Linuxを起動し、小さなBashスクリプトを実行するLive CDがあります。スクリプトは、2番目のプログラム(通常はコンパイルされたC ++バイナリ)を検索して実行します。
Ctrl+を押して2番目のプログラムを中断できる必要がありますC。何しなければならない2番目のプログラムが停止し、Bashスクリプトは引き続きクリーンアップを実行します。何実際にこれにより、基本アプリケーションとBashスクリプトの両方が終了します。これは問題です。
trap
そのため、組み込みコマンドを使用してBashにSIGINTを無視するように指示します。 + Ctrl+はCC ++アプリケーションを終了しますが、Bashは引き続き実行されます。途方もない。
ああ、はい...時には「2番目のアプリケーション」が別のBashスクリプトです。そしてそれケース、Ctrl+C今すぐまったく何も。
Ctrl明らかに、これがどのように機能するのか私の理解が間違っています...ユーザーが+を押すとSIGINTを取得するプロセスをどのように制御しますかC?この信号を次に送信したいと思います。特定のプロセス。
ベストアンサー1
数時間、インターネット検索の最後に答えを見つけました。
Linuxに概念があるプロセスグループ。
TTYドライバには、フォアグラウンドプロセスグループという概念があります。
Ctrl+を押すと、CTTYが
SIGINT
次に送信されます。すべてのコースフォアグラウンドプロセスグループにあります。 (あなたも見ることができますこのブログエントリ.)
したがって、コンパイルされたバイナリそしてこれを開始するスクリプトはすべて破損しています。実際、私はメインアプリケーションがこの信号を受信したいと思います。いいえスクリプトを起動します。
今、解決策は明らかです。アプリケーションを新しいプロセスグループに入れて、このTTYのフォアグラウンドプロセスグループとして作成する必要があります。明らかに、これを行うコマンドは次のとおりです。
setsid -c <applcation>
それはすべてです。ユーザーがCtrl+を押すと、CSIGINTはアプリケーション(および子アプリケーションに存在する可能性があります)に送信され、他の人には送信されません。これが私が望むものです。
setsid
独自にアプリケーションを新しいプロセスグループ(実際にはまったく新しい「セッション」、明らかにプロセスグループのセット)に配置します。この
-c
フラグを追加すると、この新しいプロセスグループは現在のTTYの「フォアグラウンド」プロセスグループになります。 (つまり、+をSIGINT
押すとCtrl表示されますC)
私はBashが新しいプロセスグループでプロセスを実行または実行しない時期について多くの矛盾する情報を見ました。 (特に「対話型」シェルと「非対話型」シェルの間に違いがあるようです。)私はあなたが使用できるいくつかの提案を見ました。賢い配管トリック...わかりません。しかし、上記の方法が私には合うようです。