В чем разница между 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, похоже, делает то же самое, он по крайней мере обеспечивает функциональность, которая делает ее полезной в общем случае.