У меня есть исполняемый файл в Linux, который может взаимодействовать с stdin / stdout. Я пытаюсь написать программу на C ++, которая может интерактивно вызывать эту программу, отправлять команды на ее стандартный ввод и захватывать ее стандартный вывод.
Я действительно запутался. Я не хочу раскошелиться на мою программу (не так ли?). Я хочу, чтобы моя программа могла запускать «клиент», отправлять данные, получать выходные данные, отправлять больше данных, получать больше выходных данных, … и закрывать «клиент».
Постскриптум Да, я уверен, что об этом уже спрашивали, но я потратил несколько часов, действительно почесывая голову — вероятно, не используя правильные ключевые слова.
Единственный способ выполнить другую программу — через один из exec()
системные вызовы. Это единственный способ. И, как вы знаете, exec()
заменяет исполняющую программу программой, указанной exec()
, Процесс, который выпустил exec()
больше не будет существовать, это PID
теперь используется новой программой.
Следовательно, логически следует, что если вы не хотите, чтобы ваша программа была заменена другим исполняемым файлом, ваша программа должна fork()
и дочерний процесс использует exec()
выполнить новый исполняемый файл. Это традиционный способ начать новый процесс и продолжить выполнение исходного процесса. fork()
требуется для этого.
Ситуация, которую вы описываете, довольно типична, ситуация закрашена цифрами, это делалось бесчисленное количество раз:
Используйте pipe (), чтобы создать две трубы, одну для стандартного канала, одну для стандартного канала.
Используйте fork (). Дочерний процесс dup2()
s конец чтения канала stdin в 0, конец записи канала stdout в 1 закрывает оба конца каждой из исходных каналов, и exec()
новый процесс.
Родительский процесс закрывает конец чтения канала stdin, конец записи канала stdout, затем переходит к взаимодействию с дочерним процессом, используя конец записи канала stdin и конец чтения канала stdout.
Других решений пока нет …