標準ストリームはすべて同じファイル(/dev/tty)で実行されますか?

標準ストリームはすべて同じファイル(/dev/tty)で実行されますか?

仮想端末に 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データはありません。

追加資料:

おすすめ記事