Os fluxos padrão operam no mesmo arquivo (/ dev / tty)?

0

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?

    
por Bwawhwmopoloin 10.04.2016 / 20:19

1 resposta

1

Concordando que todos eles fazem referência ao mesmo dispositivo, a pergunta real aparece no final. A razão pela qual o read não retorna nada é que /dev/tty não é apenas uma conexão de sua entrada para sua saída , mas é uma conexão entre seu (shell ) processo e um dispositivo real, ou seja, o console do Linux. Você poderia ter um programa em execução no console que lê dados do host (como o exemplo acima) e responde (fornecendo dados para a chamada read ), mas sem essa conexão adicional, o read não terá dados.

Leitura adicional:

por 10.04.2016 / 20:47

Tags