web-dev-qa-db-ja.com

バックグラウンドで(ctrl + zによって)中断されたアプリケーションは引き続き実行する必要がありますか、それとも実行を停止する必要がありますか?

コマンドxinit /path/to/firefox/binaryでFirefoxを実行すると、Firefoxが実行されているディスプレイが開きます。

それから私はプッシュします Ctrl +Alt+F1 コンソールに戻ってからプッシュする Ctrl+z Firefoxをバックグラウンドで一時停止します。

次に、プッシュします Ctrl+Alt+F7 Firefoxに戻ります。 Firefoxがフリーズするか応答しないと思いますが、Firefoxは問題なく使用できます。私の期待は、wgetのような他のアプリをバックグラウンドに送信したときの私の経験に基づいています。 wgetをバックグラウンドに送信すると、ダウンロードプロセスが停止します。

なぜこれが起こるのですか?

3
user3405291

Firefoxはそれ自体をバックグラウンドに置き、ターミナルから実行するとターミナルから切り離されます。したがって、 Ctrl+Z Firefoxを実際に一時停止しているわけではなく、おそらくxinitを一時停止しています。

wgetおよびほとんどのコマンドラインプログラムには、このようなデタッチ動作はありません。 geditのようなGUIベースのプログラムは、ほとんどがFirefoxのように起動してデタッチします。


これを防ぐためのオプションがあるかどうかを調べました。 -foregroundはおそらくオプション名のように見えましたが、それはFirefoxウィンドウを前面に押し出すだけです。

2
Anthon

押す Ctrl+Z のように、アプリケーションを一時停止します。SIGCONTで再開されるまで実行を停止します(シェルのfgまたはbgコマンドを介して送信される可能性があります)。だが…

xinitではなくfirefoxを実行しています。押す Ctrl+Z 実行された可能性のある他のアプリケーションではなく、フォアグラウンドで実行されているアプリケーションにSTOP信号を送信します。したがって、xinit自体を一時停止しただけであり、これはX11セッションには影響しません。

より正確には、 Ctrl+Z STOP信号をフォアグラウンドに送信します プロセスグループ 。これには複数のプロセスが含まれる場合がありますが、プロセスグループの目的は、シグナリングの目的で道徳的に単一のユニットであるということです。

(同じことが当てはまります Ctrl+C およびSIGINT、および Ctrl+\ とSIGQUIT。一方、端末が消えたときのSIGHUPは、単一のプロセスにのみ送信されます。セッションリーダー、通常はシェル。シェルは、起動したジョブにSIGHUPを送信します。)

xinitは、Xサーバーとクライアントの両方を独自のプロセスグループで実行します。これにより、セッション全体を強制終了せずに、Xサーバーを一時停止または強制終了できます。キャッチ可能なシグナルを送信すると、Xサーバーが強制終了され、ほとんどのXアプリケーションが終了します。 Ctrl+C GUIセッションを停止しますが、間接的に、すべてのクライアントとサーバーがSIGINTを受信したためではありません。 Ctrl+C。一方、xinitは特に何もしません Ctrl+Z、そのため、xinitを一時停止し、セッションをそのままにします。これは、xinitを実行したターミナルで他のことをしたい場合に便利です。