2016-03-27 6 views
1

私はkonsole(Tab1とTab2)で2つのタブを開いていると言います。printfからのメッセージが端末にどのようにルーティングされますか?

私はそれらの両方でのttyを実行すると、私が持っている:

Tab1を:

~$ tty 
/dev/pts/23 

TAB2:

~$ tty 
/dev/pts/24 

私はprintfの持つ単純なプログラムhello.cを実行する場合( "Hello")、システムがstdout(ファイルid 1)から/ dev/pts/23への書き込み、konsoleで読み込まれてTab1に表示される様子

システムは、/ dev/pts/23に "Hello"文字列を与え、/ dev/pts/24に与えないとシステムが知っている方法を教えてください。そしてそれはどうやって?

"Hello"を送信するpsudoterminalを知るために、プログラムにbashによって与えられたパラメータはありますか?あるいは、プログラムは文字列をbashに送り返します(どのようにして?)疑似端末がデータを送るのを知っていますか?あなたは、プロセスのオープン・ファイルを見れば

は、あなたが見ることができ、あなたの助け

+1

オープンファイルのセットは、すべてのプロセスに対してローカルです。シェルはstdin/out/errスロットにオープンされた特定の擬似端末デバイスを持っています。このデバイスは、生成時に子プロセスによって継承されます。擬似端末自体は基本的にシステムコールによって割り当てられた名前付きパイプであり、使用しているx端末や他の端末からテキストを読み込んで画面に出力しています。ところで、[これは良い読書です](http://www.linusakesson.net/programming/tty/)。 – doynax

答えて

1

いただきありがとうございます、あなたがまだあなたの質問にttyを使用して考え出し特定の擬似端子にSTDOUT、STDERR、などの点

[email protected]:~# ls -l /proc/self/fd 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 

ご存じのように、プロセスコールはforkシステムコールによって作成され、実際には開いているファイルディスクリプタを親から複製します。基本的に、プロセスは親からファイル記述子を取得します。

親はどのように彼に関連付けられていましたか?よく、konsoleはすでにそれを扱っていました。

+0

ありがとうございました。 ls -l/proc/self/fdを実行すると、カーネルはこの呼び出しをどの端末からどのように知っていますか?この出力がすべてのkonsoleタブで異なるのはなぜですか? –

+1

ネットで「制御端末」を検索します。ここから始めてください:https://www.gnu.org/software/libc/manual/html_node/Controlling-Terminal.html – stdcall

関連する問題