如何使用std :: in和getline()检测在后台进程中从bash注入的输入

vgo*_*anz 5 c++ bash file-descriptor sh io-redirection

我有一个用Cpp编译的二进制文件,代码如下:

std::string input;
getline(std::cin, input);
std::cout << "Message given: " << input << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果我执行这个例子,并在终端"Hello world!"中写入 完美的工作:

Message given: Hello world!

现在,我在重定向stdout时启动可执行文件:

./basicsample >> output/test

如果我尝试使用文件描述符注入输入:

echo "Hello world!" > /proc/${PID}/fd/0

该消息显示在启动该过程的终端中:

[vgonisanz@foovar bash]$ ./basicsample >> output/test
Hello world!

但是消息没有出现在程序输出中.我希望得到getline处理的消息,但是没有检测到!但是,如果我直接在该bash中编写,程序将获得输入.我正在尝试使用脚本在后台进程中注入输入,但它无法正常工作.

如何在不进行手动操作的情况下将要检测的输入注入过程?

更新:

似乎使用expect,这可能会起作用,但我宁愿避免像这样的依赖.经过多次尝试,没有依赖关系的最佳方法是使用管道,例如:

mkdir tmp; mkfifo tmp/input.pipe; nohup ./basicsample  tmp/user.out 2> tmp/nohup.err

这将运行创建输入管道,控制台输出和错误.然后,使用以下方法喂入管道:

echo "Hello world!" > tmp/input.pipe

问题是,管道只能工作一次.获得输入后,它将永远不会再听.也许这是方式,但我不知道如何避免失去焦点.

我尝试使用文件等几种方式重定向它,但它不起作用.提前致谢.

RDC*_*106 2

在没有依赖关系的情况下执行此操作的最佳方法是使用管道,例如:

mkdir tmp
mkfifo tmp/input.pipe
(tail -f tmp/input.pipe) | ./basicsample > tmp/log.0 &
Run Code Online (Sandbox Code Playgroud)

这将运行创建一个输入管道和保存在日志文件中的输出。您可以使用操作员&在后台启动它来防止控制台阻塞。

然后使用以下方式注入数据:

echo "YOUR_STRING" > tmp/input.pipe
Run Code Online (Sandbox Code Playgroud)

它应该适用于您提出的问题。