stdin is /root/file. The process can only read from /root/file.
stdout is /dev/tty1. The process can read from and write to /dev/tty1 (though I don't know why the process needs to read from its own output...)
stderr is /dev/tty1. The process can read from and write to /dev/tty1 (again, why does the process needs the permission to read from the error logs that it outputs?)
Tanto "stdout" quanto "stderr" apontam para o mesmo objeto de arquivo, o mesmo "stdin" estava apontando antes de ser redirecionado de /root/file
, a saber, /dev/tty1
. Eles foram todos obtidos por dup (2) o mesmo descritor de arquivo, e compartilhar todos suas propriedades (modos: O_RDWR
, ponteiro de arquivo, etc). Você deve pensar em descritores de arquivo como índices em uma matriz de ponteiros (referência contada), onde mais de um pode apontar para a mesma estrutura. O shell não se preocupou em alterar os modos de acesso de "stdout" e "stderr" com fcntl(fd, F_SETFL, O_WRONLY)
quando redirecionou stdin de file
- isso seria inútil.
The last line is a non-standard stream. I don't know what it is for, but the process can only read from it.
Esse é o% que oless
está usando para interação do usuário.
The question: Even though the stdin is /root/file, I can still interact with the less process (ex. typing '/' to enter search mode and search for a word). This means the process still accepts input from the current virtual terinal (/dev/tty1). I thought that since the stdin is not /dev/tty1, I should not be able to interact with the less process via typing on the keyboard?
/dev/tty
é um caminho mágico que sempre abrirá o terminal de controle; no seu caso, /dev/tty
e /dev/tty1
referem-se ao mesmo dispositivo (que pode ser um dispositivo virtual - um pseudo-terminal)