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
问题是,管道只能工作一次.获得输入后,它将永远不会再听.也许这是方式,但我不知道如何避免失去焦点.
我尝试使用文件等几种方式重定向它,但它不起作用.提前致谢.
在没有依赖关系的情况下执行此操作的最佳方法是使用管道,例如:
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)
它应该适用于您提出的问题。