В чем разница между popen () и system () в C - PullRequest
21 голосов
/ 16 декабря 2011

Я хочу выполнить двоичный файл в моем C-коде.Что лучше выполнить?popen() или system()

РЕДАКТИРОВАТЬ : я пытался использовать system, но выполнение процесса, похоже, застряло в конце и не возвращается к моему коду.

Любые предложения о том, что делать?

Спасибо

Ответы [ 2 ]

34 голосов
/ 16 декабря 2011

popen() дает вам контроль над потоками входного или выходного файла процесса.system() нет.Если вам не нужен доступ к вводу / выводу процесса, вы можете использовать system() для простоты.

system() в C89 и C99;popen() только для Posix (хотя в Windows API также есть).

Обе функции вызывают некоторую форму shell для выполнения команды (например, /bin/sh в Linux и, возможно,cmd.exe в Windows).Если вы хотите выполнить исполняемый файл напрямую и находитесь в Posix, вы также можете посмотреть на exec* семейство функций в сочетании с fork() (поскольку exec() заменяет текущий процесс).

5 голосов
/ 16 декабря 2011

Используйте popen, если вы хотите выполнить команду оболочки и хотите, чтобы родительский процесс мог общаться с дочерним процессом. (Он перехватывает ввод или вывод дочернего элемента до потока, который вы возвращаете.) В противном случае, предпочтите семейство функций exec (вероятно, в сочетании с fork); Процессы exec d наследуют большинство открытых дескрипторов файлов (включая stdin, stdout и stderr), так что вы можете перехватывать входные данные и вплоть до того, что вам нравится ... плюс, меньше последствий для безопасности

system обычно лучше избегать, если вам не нужно запускать команды оболочки. Он запускает оболочку для запуска команды, и оболочка может анализировать команду любым удобным для нее способом. В частности, некоторые переменные среды (например, $IFS и / или $PATH) могут быть изменены таким образом, чтобы родительский элемент мог выполнять программы, для которых вы никогда не предназначали его. Хотя popen, кажется, делает то же самое, он, по крайней мере, обеспечивает функциональность, которая делает его полезным в общем случае.

...