в чем разница между popen() и system() В C

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

редактировать: Я пытался использовать system, но выполнение процесса, похоже, застряло в конце и не возвращается к моему коду.

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

спасибо

2 ответов


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

system() в С89 и C99; popen() только Posix (хотя Windows API также имеет один).

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


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

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