2

プロセス (私の場合はセッション リーダー) はどのようにして制御端末を取得できますか?

プログラムで行うこと:

1. fork;
2. parent -> while(1) or smth. similar;
3. child  -> setsid();
             exec "man ps";

私は出力に何も得られないと信じていました。(子はセッション リーダーであるため、古い tty とは関係ありません) しかし、取得した理由がわかりません。男性が出力します。しかし、インタラクティブではありません。Ctrl-z を押すと、「q」を押すとインタラクティブになり、終了してプログラム (親) に戻ります。質問は次のとおりです。

  1. 最初に何が起こるか説明してください (なぜ ctrl-z を押さなければならないのか、上記をお読みください)
  2. なぜ人はそのシェルで出力を行うのですか?
  3. tty を接続せずに man を実行するにはどうすればよいですか (ps で確認したところ、man とページャーの TTY 列に「?」が表示されています)。
  4. 最後に、新しいセッション リーダーが制御端末を取得するにはどうすればよいでしょうか。他に道はありopen(/dev/tty)ますか?
4

1 に答える 1

3

Q.1.から3.:子プロセスは、setsid()の後でも、stdin、stdoutなどにアクセスし続けます。それらを明示的に閉じる(または、たとえばを使用して再度開くopen("/dev/null",O_RDWR);)必要があります。

Q 4.:

制御端末のないセッションリーダーがterminal-device-fileを開き、開いたときにフラグO_NOCTTYがクリアされている場合、端末がまだセッションに割り当てられていない場合、その端末はセッションリーダーに割り当てられた制御端末になります。

http://uw714doc.sco.com/en/SDK_sysprog/_The_Controlling-Terminal_and_Pr.html

于 2011-01-05T14:09:21.577 に答える