В чем разница между popen() и system() в C
Я хочу выполнить двоичный код в моем C-коде. С какими лучше работать? popen()
или system()
EDIT: я попытался использовать system
, но выполнение процесса, похоже, застряло в конце и не вернется к моему коду.
Любые предложения о том, что делать?
Спасибо
Ответы
Ответ 1
popen()
дает вам контроль над потоками входных или выходных файлов процесса. system()
нет. Если вам не нужен доступ к процессу ввода-вывода, вы можете использовать system()
для простоты.
system()
находится в C89 и C99; popen()
- только Posix (хотя в Windows API также есть один).
Обе функции вызывают некоторую форму оболочки для выполнения команды (например, /bin/sh
в Linux и, возможно, cmd.exe
в Windows). Если вы хотите выполнить исполняемый файл напрямую, и вы находитесь в Posix, вы также можете посмотреть exec*
-семейство функций в сочетании с fork()
(так как exec()
заменяет текущий процесс).
Ответ 2
Используйте popen
, если вы хотите запустить команду оболочки и хотите, чтобы родительский процесс мог разговаривать с дочерним элементом. (Он перехватывает дочерний вход или вывод до потока, который вы возвращаете.) В противном случае предпочитайте семейство функций exec
(вероятно, в сочетании с fork
); Процессы exec
'd наследуют большинство открытых файловых дескрипторов (включая stdin, stdout и stderr), поэтому вы можете подключать входные и выходные данные до того, что вам нравится... плюс меньше последствий для безопасности.
system
обычно лучше избегать, если только вы не должны запускать команды оболочки. Он запускает оболочку для запуска команды, и оболочка может разбирать команду любым способом. В частности, некоторые переменные среды (например, $IFS
и/или $PATH
) могут быть изменены таким образом, чтобы заставить родителя выполнять программы, которые вы никогда не планировали. Хотя popen
, похоже, делает то же самое, он по крайней мере обеспечивает функциональность, которая делает ее полезной в общем случае.