将文本发送到正在运行的进程的stdin时出现问题



我有一个c++程序正在运行,进程号为PROCNO,我想将文本发送到该程序的stdin。然而,当我运行时:

echo test > /proc/PROCNO/fd/0

我看到控制台中打印了test。因此,似乎stdin正被重定向到stdout。我该如何防止这种情况发生?原因是我想在我的程序中阅读stdin,但我从来没有收到文本。

我的stdin侦听器是:

void stdin_listener()
{
std::string line;
do {
std::cin >> line;
std::cout << "received: " << line;
} while (!line.empty());
}

当我在进程上运行ls -l时,没有得到

lrwx------. 1 64 Aug 28 17:49 /proc/PROCNO/fd/0 -> /dev/pts/2

如何防止这种情况发生?

你不能,因为这就是终端设备在Linux上的基本工作方式。当从终端设备启动时,Linux进程的标准输入、输出和错误实际上是相同的设备:

$ ls -al /proc/$$/fd/[012]
lrwx------. 1 mrsam mrsam 64 Aug 28 18:01 /proc/5777/fd/0 -> /dev/pts/0
lrwx------. 1 mrsam mrsam 64 Aug 28 18:01 /proc/5777/fd/1 -> /dev/pts/0
lrwx------. 1 mrsam mrsam 64 Aug 28 18:01 /proc/5777/fd/2 -> /dev/pts/0

它们是三个不同的文件描述符,但它们都是读/写的,并且都连接到同一个底层设备。它们可以互换读取/写入,尽管传统上只读取0,写入1和2,但这并不重要。但是该进程可以从三个文件描述符中的任何一个进行读写。从这些文件描述符中的任何一个读取都是从终端读取的。给他们写信会给终端。

我想在我的程序中从stdin读取,但我从来没有得到文本。

因为读取/写入文件描述符是从终端读取或写入的。结束。

如果你想运行一个读写其标准输入和输出的进程,并将输入和输出重定向到你的程序,你必须创建和设置自己的终端设备,然后在打开该终端设备作为程序标准输入和输出来的情况下启动程序。有关更多信息,请参阅pty手册页面。

最新更新