2010-12-20 25 views
2

プロセス(私の場合はセッションリーダー)が制御端末を取得するにはどうしたらいいですか?私は出力に何も得るだろうとbeleived端末と新しいセッションの制御

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

:私は私のプログラムで行う

。 (子供はセッションリーダーなので、今は古いttyとは関係ありません)しかし、私は理由を理解していません。男は泣いた。しかし、インタラクティブではありません。 Ctrl-zを押すと、「q」を押すとインタラクティブになり、私のプログラム(親)に戻ります。だから、質問は次のとおりです。男はそのシェルでいくつかの出力を行いますなぜ

  1. (私はCtrl-Zを押す必要がある理由を、上記読み)初めに何が起こるかを説明してください?
  2. どのようにttyが接続されていなくても、どうやってそれを行うことができますか?(psで確認しましたが、TTYの欄に "?"があります)
  3. 最後に、新しいセッションリーダーがどのように制御端末を取得できますか? open(/dev/tty)以外の方法はありますか?

答えて

3

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

Q 4:

制御端子なしのセッションリーダーは、端末デバイスファイルとフラグO_NOCTTYを開くとオープンに明らかで、その端末がに割り当てられた制御端子となりますセッションリーダー端子は、すでにいくつかのセッションに

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

が割り当てられていない場合
関連する問題