有人可以解释为什么会发生这种情况以及如何解决它,以便发送到标准输入的数据与输入到标准输入的数据的行为方式相同。
对于那些看不到 .gif 的人
基本上我有 3 个终端设置。一个正在运行一个 netcat 服务器,它是以下命令。
nc -l 127.0.0.1 4000
终端 2 正在运行一个 netcat 客户端,它是以下命令。
nc 127.0.0.1 4000
当输入客户端时,这基本上意味着将数据输入到该程序的标准输入或文件描述符 0。一旦按下回车键,数据就会显示在服务器上。这是预期的行为。
人们会期望,如果您从键盘以外的其他来源向 stdin 输入数据,只要您在末尾提供一个换行符甚至一个换行符和一个回车符,它的工作方式就相同。
虽然在运行具有以下命令的终端 3 时情况并非如此。
echo "test\n" > /proc/$pid/fd/0
奇怪的是,来自 echo 的数据甚至出现在终端 2 中,但它没有被视为键盘输入,因此没有消息从终端 2 上的 clinet 发送到终端 1 上的服务器。
我的结论是胡说八道。
如果您查看
/proc/$PID/fd/0
链接,您会看到它指向终端:当你输出到它时,你不是将输入传递给
nc
进程,而是输出到终端。它会适当打印您输出的内容。它看起来像这样:
不像这样:
如果进程的文件描述符 0 被打开到一个文件,您是否仍然希望写入
/proc/$PID/fd/0
显示为进程的输入,或者转到打开的文件?这种情况应该
echo foo > /proc/11994/fd/0
怎么办?这里也一样。当进程从 fd 读取时,它从文件中读取数据。但是,当您重新打开同一个文件进行写入时
/proc/$PID/fd/$N
,您将写入该文件。您需要使用 TIOCSTI ioctl 或某种类似的机制将数据填充到终端的输入缓冲区中。参见tty_ioctl(4)