У меня есть двоичный файл, скомпилированный в Cpp со следующим кодом:
std::string input;
getline(std::cin, input);
std::cout << "Message given: " << input << std::endl;
Если я выполню этот пример и напишу в терминале «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, программа получит ввод.Я пытаюсь сделать сценарий для ввода входных данных в фоновом процессе, но он не работает.
Как я могу ввести входные данные, которые будут обнаружены в процессе, не делая это вручную?
ОБНОВЛЕНИЕ:
Кажется, что при использовании ожидаемого, это может сработать, но я предпочитаю избегать подобных зависимостей.После нескольких попыток лучший способ сделать это без зависимостей - это использовать канал, например:
mkdir tmp; mkfifo tmp/input.pipe; nohup ./basicsample tmp/user.out 2> tmp/nohup.err
Это запустит создание канала ввода, вывод для консоли и ошибку.Затем просто подайте трубу, используя:
echo "Hello world!" > tmp/input.pipe
Проблема в том, что труба работает только один раз.После получения ввода, он никогда не будет слушать снова.Может быть, так, но я не знаю, как избежать потери фокуса.
Я пытался перенаправить его несколькими способами, например, файлами и т. Д., Но это не сработало.Заранее спасибо.