我有一个用 Cpp 编译的二进制文件,代码如下:
std::string input;
getline(std::cin, input);
std::cout << "Message given: " << input << std::endl;
如果我执行此示例,并在终端中写入“Hello world!”完美运行:
Message given: Hello world!
现在,我启动重定向标准输出的可执行文件:
./basicsample >> output/test
如果我尝试使用文件描述符注入(inject)输入:
echo "Hello world!" > /proc/${PID}/fd/0
消息出现在启动进程的终端中:
[vgonisanz@foovar bash]$ ./basicsample >> output/test Hello world!
但是消息没有出现在程序输出中。我希望通过 getline 处理消息,但未检测到!但是,如果我直接在那个 bash 中编写,程序就会得到输入。我正在尝试编写一个脚本以在后台进程中注入(inject)输入,但它不起作用。
如何在不手动执行的情况下将要检测的输入注入(inject)到流程中?
更新:
似乎使用 expect 可以工作,但我更愿意避免这样的依赖关系。经过几次尝试,没有依赖项的最佳方法是使用管道,例如:
mkdir tmp; mkfifo tmp/input.pipe; nohup ./basicsample tmp/user.out 2> tmp/nohup.err
这将运行创建输入管道、控制台输出和错误。 然后,只需使用以下方法喂食管道:
echo "Hello world!" > tmp/input.pipe
问题是管道只工作一次。获得输入后,它就不会再听了。也许这是方法,但我不知道如何避免失去焦点。
我尝试使用文件等多种方式重定向它,但它不起作用。提前致谢。
最佳答案
没有依赖项的最好方法是使用管道,例如:
mkdir tmp
mkfifo tmp/input.pipe
(tail -f tmp/input.pipe) | ./basicsample > tmp/log.0 &
这将运行创建输入管道和保存在日志文件中的输出。您可以使用运算符 &
在后台启动它来防止控制台阻塞。
然后使用以下方式注入(inject)数据:
echo "YOUR_STRING" > tmp/input.pipe
它应该适用于您提出的问题。
关于c++ - 如何使用 std::in 和 getline() 在后台进程中检测从 bash 注入(inject)的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50388378/