プロセスが自動的に中断されるのはなぜですか?

プロセスが自動的に中断されるのはなぜですか?
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007
brandon@Air portal % fg
[1]  + 81104 continued  rails server --port=3007
[1]  + 81104 suspended (signal)  rails server --port=3007

クリックしていません^Z。再びフォアグラウンドにインポートすると、プロセスは一時停止しました。アイデアが足りません。その理由は何ですか?

答え1

SIGTSTP何かがシグナルを送信すると、プロセスが中断される可能性があります。これはCtrl-Zが行うことですが、信号は同じ効果を持ちます。

一部のインタラクティブなアプリケーションは、raise(SIGTSTP)自分自身を中断したと呼びます。これは、ターミナルをネイティブモード(編集の有効化など)に切り替えるプログラムを介して行われます。たとえば、VimなどのテキストエディタでCtrl-Zを押すと、TTYドライバは信号を送信するためにCtrl-Zを傍受しませんSIGTSTP。 TTYがネイティブモードであるため、この機能は無効になります。エディタはCtrl-Zを受け取り、それを一時停止コマンドとして解釈します。このコマンドが実行するタスクの1つは、SIGTSTPプロセス自体にシグナルを送信することです。

ただし、バックグラウンドサーバーアプリケーションのように見えることは、これらの操作を実行できないようです。シグナルは、許可されているすべてのプロセスから来ることができます。

プロセス自体が自分にシグナルを送信している場合は、別のターミナルウィンドウでstraceを実行してこれを確認できます。

strace -p 81104

次に、どのシステムコールが再び中断されたかを確認してください。

関連情報