Esta é uma cópia da minha resposta a uma pergunta semelhante no stackoverflow do ano passado.
Você pode gravar na entrada padrão do seu dispositivo terminal devido ao histórico personalizado. Veja o que está acontecendo:
Quando um usuário efetua login em um terminal em um sistema semelhante ao Unix ou abre uma janela de terminal em X11, os descritores de arquivo 0, 1 e 2 são conectados a um dispositivo terminal e cada um deles é aberto para ler e escrever . Este é o caso apesar do fato de que um normalmente só lê de fd 0 e escreve para fd 1 e 2 .
Aqui está o código de 7ª edição init. c :
open(tty, 2);
dup(0);
dup(0);
...
execl(getty, minus, tty, (char *)0);
E aqui está como ssh
faz isso:
ioctl(*ttyfd, TCSETCTTY, NULL);
fd = open("/dev/tty", O_RDWR);
if (fd < 0)
error("%.100s: %.100s", tty, strerror(errno));
close(*ttyfd);
*ttyfd = fd;
...
/* Redirect stdin/stdout/stderr from the pseudo tty. */
if (dup2(ttyfd, 0) < 0)
error("dup2 stdin: %s", strerror(errno));
if (dup2(ttyfd, 1) < 0)
error("dup2 stdout: %s", strerror(errno));
if (dup2(ttyfd, 2) < 0)
error("dup2 stderr: %s", strerror(errno));
(A função dup2
dups arg1 em arg2, fechando arg2 primeiro, se necessário).
E aqui está como xterm
faz isso:
if ((ttyfd = open(ttydev, O_RDWR)) >= 0) {
/* make /dev/tty work */
ioctl(ttyfd, TCSETCTTY, 0);
...
/* this is the time to go and set up stdin, out, and err
*/
{
/* dup the tty */
for (i = 0; i <= 2; i++)
if (i != ttyfd) {
IGNORE_RC(close(i));
IGNORE_RC(dup(ttyfd));
}
/* and close the tty */
if (ttyfd > 2)
close_fd(ttyfd);