一部のプロセスを開始した仮想端末を閉じると、出力は直接入りますか、/dev/null
それともメモリを汚染しますか?
とにかく、後でいつでも読み続けることができるように出力を取得できますか?
[編集者]:それでは、プロセスを拒否した瞬間、実際にプロセスの出力を制御する権限が終了するのでしょうか?
また、停止したプロセスを拒否すると、最初はすべてが正常に見えます。プロセスが終了したり、ジョブに表示されません。しかし、私が出ると(そして私はいいえsu
これは、終了などの端末を閉じることを意味し、プロセスが終了します。それにもかかわらず、バックグラウンドで実行されている拒否プロセスは引き続き実行できます。
答え1
プロセスが「拒否」されたという事実は、そのプロセスを作成した対話型シェルにのみ意味があります。これは、シェルのタスクリストにプロセスがなくなり、シェルが終了したときにSIGHUPがプロセスに転送されないことを意味します。これはあなたの質問にはあまり関係がありません。
削除された仮想端末に送信された出力に何が起こるかについて:私は直接いくつかのテストを実行した結果、デバイスにアクセスできず、そのデバイスを指すすべてのファイル/dev/pts/x
記述子が閉じられるまでデバイスが再割り当てされないことを示します。確認しました。したがって、削除された端末への書き込みがなぜ保存されるのかわかりません。私はこれがPOSIXによって定義されていないようです。
端末に書き込む特定のプロセスの出力をキャッチすることに関して、端末がまだ存在していても可能ではないと思います。あなたができることは、端末から直接入力を受け取るだけです(たとえば、キー入力またはptyの主要部分でシミュレートされたキー入力など)。プロセスがstdinの端末に書き込まれた内容を読み取ると、ほとんどのプロセスでself-ioループが発生します。
プロセス終了の最後の言葉は何が起こっているのかわかりませんが、セッションリーダーが終了すると、プロセスグループのフォアグラウンド/バックグラウンド状態に関連する信号(SIGTTOU、SIGTTIN、SIGHUPなど)のかなり奇妙な動作が疑われます。 (例えばsu
言及された場合)。
回答編集する:いいえ、出力に関する限り、プロセスが拒否されても変更はありません。プロセスはまだ制御端末に接続されています(デーモンのようにそれ自体が分離されていない限り)。を使用していることがわかります。ただし、このプロセス中にシェルが提供する // コマンドはps
使用できなくなります。これは、端末から入力を供給するのが難しいことを意味します(フォアグラウンドプロセスグループに存在する必要があります)。fg
bg
jobs
-
1.プロセスが望まない限り、いくつかのデバッグツールを使用してプロセスをハイジャックします(上記の注意事項を参照)。
答え2
この特定の質問を解決するには:
一部のプロセスを開始した仮想端末を閉じると、出力は直接/dev/nullに移動しますか、またはメモリを汚染しますか?
端末と端末に接続されたプログラムは、ファイルを読み書きするのと同じように、ttyデバイスを介して通信します。具体的には、仮想端末は「pseudo-tty」(減らして「pty」)を生成し、シェル(または他の)プロセスを作成し、そのプロセスのstdin / out / errをptyに接続します。 (詳細はオペレーティングシステムによって異なります。)
仮想端末を閉じると、仮想端末もその接続の終わり(pty "マスター")を閉じます。その後、接続の反対側のプログラムがttyに書き込まれるとエラーが返され、データはどこにも送信されません。同様に、ttyから読み取った場合はEOF(ファイルの終わり)マークを返します。
答え3
質問の最も興味深い部分に答えるには:リアルタイムランチャーの出力を変更するには、対応するファイル記述子を編集する必要があります。これはgdbを使用して簡単に実行できます。ハッキングですが動作します。
望むより:
ヘルパースクリプトは次の場所にあります。http://users.linpro.no/ingvar/fdswap.sh.txt。
答え4
私を指摘するコメントをいただいたGillesに感謝します。この問題、私は次のプロジェクトについて学びました。レティ。
(医師)ttyに再接続するためにいくつかの汚れたハッキングを使用しているように見えます。だから、これは私の質問の最初の部分のほとんどに答えるようです。二つ目が答えた。スティーブンによって。