Skip to main content
edited title
Link

Do the standard streams all operate on the same file (/dev/tty)?

Source Link

Do the standard streams all operate on /dev/tty?

If I type ls -l /dev in a virtual terminal I get

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

If i then type ls -l /proc/self/fd I get

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

All entries point to the same device file, which also happen to be the controlling terminal for the virtual shell (as confirmed by the "tty" command). Am I then right to assume that the stdin, sdout and stderr file descriptors all operate on the same file (/dev/pts/1), e.g. three separate open() calls have been made (when the virtual shell process was forked from its parent process) on the same file?

If so, while running the following program:

#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");
    }
}

Gives:

Error: Bad file descriptor
Error: Bad file descriptor

As expected, but when changing rfd to 1 (sdtout) and wfd to 0 (stdin) in the read() arguments, I don't get an error. Does this mean that /dev/tty was opened with the O_RDWR flag?

When trying:

if (write(1,&wc,1)<0) {
    perror("Error");
}

if (read(0,&rc,1)<0) {
    perror("Error");
}

I see the 'b' on the console, but the read() call doesn't return, as if there wasn't any data to be read from the file. Why is that?