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
次に、どのシステムコールが再び中断されたかを確認してください。