Alguém pode explicar por que isso está acontecendo e como corrigi-lo para que os dados enviados para stdin se comportem da mesma maneira que os dados digitados em stdin.
Para quem não consegue ver o .gif
Basicamente eu tenho 3 terminais de configuração. Um está executando um servidor netcat que é o seguinte comando.
nc -l 127.0.0.1 4000
O Terminal 2 está apenas executando um cliente netcat que é o seguinte comando.
nc 127.0.0.1 4000
Ao digitar no cliente, o que basicamente significa inserir dados no stdin ou no descritor de arquivo 0 desse programa. Os dados aparecem no servidor assim que a tecla Enter for pressionada. Este é o comportamento esperado.
Seria de esperar que, se você inserir dados em stdin de outra fonte que não o teclado, funcionaria da mesma forma, desde que você forneça uma nova linha no final ou até mesmo uma nova linha e um retorno de carro.
Embora este não seja o caso ao executar o terminal 3, que possui o seguinte comando.
echo "test\n" > /proc/$pid/fd/0
Curiosamente, os dados do echo aparecem no terminal 2, mas não são tratados como entrada do teclado e, portanto, nenhuma mensagem é enviada do clinet no terminal 2 para o servidor no terminal 1.
Isso eu concluo é besteira.
Se você olhar para o
/proc/$PID/fd/0
link, verá que ele aponta para o terminal:Quando você dá saída para ele, você não está passando entrada para o
nc
processo, você está enviando para o terminal. Que imprime devidamente o que você produz.Se parece com isso:
Assim não:
Se o descritor de arquivo 0 do processo fosse aberto em um arquivo, você ainda esperaria uma gravação
/proc/$PID/fd/0
para mostrar como entrada para o processo ou ir para o arquivo aberto?O que deve
echo foo > /proc/11994/fd/0
fazer neste caso?É o mesmo aqui. Quando o processo lê do fd, ele lê os dados do arquivo. Mas quando você reabre o mesmo arquivo para gravação
/proc/$PID/fd/$N
, você grava no arquivo.Você precisará usar o TIOCSTI ioctl ou algum mecanismo semelhante para colocar dados no buffer de entrada do terminal. Veja tty_ioctl(4)