仮想端末に ls -l /dev と入力すると、次の結果が表示されます。
lrwxrwxrwx 1 root root 15 apr 10 10:59 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 apr 10 10:59 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 apr 10 10:59 stdout -> /proc/self/fd/1
次に、ls -l /proc/self/fd と入力すると、次のようになります。
lrwx------ 1 user user 64 apr 10 19:59 0 -> /dev/pts/1
lrwx------ 1 user user 64 apr 10 19:59 1 -> /dev/pts/1
lrwx------ 1 user user 64 apr 10 19:59 2 -> /dev/pts/1
すべての項目は同じデバイスファイルを指し、これは仮想シェルの制御端末でもあります(「tty」コマンドで識別されます)。したがって、stdin、sdout、およびstderrのファイル記述子がすべて同じファイル(/dev/pts/1)で実行されていると仮定するのは正しいですか?たとえば、3つの別々のopen()呼び出しが行われました(仮想シェルプロセスが分岐)親プロセス)が同じファイルに含まれていますか?
その場合は、次のプログラムを実行してみてください。
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int rfd = open("./a_file",O_RDONLY);
int wfd = open("./a_file",O_WRONLY);
char rc='a',wc='b';
if (write(rfd,&wc,1)<0) {
perror("Error");
}
if (read(wfd,&rc,1)<0) {
perror("Error");
}
}
以下を提供します。
Error: Bad file descriptor
Error: Bad file descriptor
予想どおり、read() パラメーターで rfd を 1(sdtout) に、wfd を 0(stdin) に変更してもエラーは発生しません。これは、/dev/ttyがO_RDWRフラグで開かれたことを意味しますか?
試してみるとき:
if (write(1,&wc,1)<0) {
perror("Error");
}
if (read(0,&rc,1)<0) {
perror("Error");
}
コンソールに「b」と表示されますが、ファイルからデータを読み取っていないかのように、read()呼び出しは返されません。なぜそんなことですか?
ベストアンサー1
すべて同じデバイスを参照することに同意します。実際の質問は最後にあります。単に接続以外のread
理由で何も返すことはできません。/dev/tty
入力するそれに出力ただし、(シェル)プロセスと物理デバイス(Linuxコンソールなど)との間の接続です。上記の例のように、ホストからデータを読み取り、応答(呼び出しにデータを提供)するプログラムをコンソールで実行できますが、追加のread
接続がない場合はread
データはありません。
追加資料:
- /dev/tty* に記録された内容を読み込みます。
- /dev/ptsファイルには何が保存されていて開くことができますか?
- tty*デバイスをどのように読み書きするのですか?、冗長ではありませんが、
説明なしでデータ不足について同じ観察を行います。