Se eu digitar ls -l / dev em um terminal virtual, obtenho
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
Se eu então digitar ls -l / proc / self / fd eu recebo
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
Todas as entradas apontam para o mesmo arquivo de dispositivo, que também é o terminal de controle do shell virtual (como confirmado pelo comando "tty"). Tenho, então, o direito de assumir que os descritores de arquivos stdin, sdout e stderr operam no mesmo arquivo (/ dev / pts / 1), por exemplo? três chamadas open () separadas foram feitas (quando o processo do shell virtual foi bifurcado de seu processo pai) no mesmo arquivo?
Em caso afirmativo, durante a execução do seguinte programa:
#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");
}
}
Dá:
Error: Bad file descriptor
Error: Bad file descriptor
Como esperado, mas ao alterar rfd para 1 (sdtout) e wfd para 0 (stdin) nos argumentos read (), não recebo um erro. Isso significa que / dev / tty foi aberto com o sinalizador O_RDWR?
Ao tentar:
if (write(1,&wc,1)<0) {
perror("Error");
}
if (read(0,&rc,1)<0) {
perror("Error");
}
Eu vejo o 'b' no console, mas a chamada read () não retorna, como se não houvesse nenhum dado a ser lido do arquivo. Por que isso?