it-swarm-pt.tech

qual é a diferença entre popen () e system () em C

Eu quero executar um binário dentro do meu código C. Qual é o melhor para executar? popen() ou system()

EDIT : Tentei usar system, mas o processo em execução parece travar no final e não retorna ao meu código.

Alguma sugestão sobre o que fazer?

Obrigado

21
Syntax_Error

popen() fornece controle sobre os fluxos de arquivos de entrada ou saída do processo. system() não. Se você não precisar acessar a E/S do processo, poderá usar system() para simplificar.

system() está em C89 e C99; popen() é apenas Posix (embora a API do Windows também tenha uma).

Ambas as funções chamam alguma forma de Shell para executar o comando (por exemplo, /bin/sh No Linux e provavelmente cmd.exe No Windows). Se você deseja executar um arquivo executável diretamente e está no Posix, também pode ver a família de funções exec* - em conjunto com fork() (uma vez que exec()substitui o processo atual).

34
Kerrek SB

Use popen se desejar executar um comando do Shell e desejar que o processo pai possa conversar com o filho. (Conecta a entrada ou saída da criança ao fluxo que você retorna.) Caso contrário, prefira a família de funções exec (provavelmente em conjunto com fork); Os processos exec 'herdam a maioria dos descritores de arquivos abertos (incluindo stdin, stdout e stderr), para que você possa conectar a entrada e a saída da maneira que desejar ... além disso, existem menos implicações de segurança.

system geralmente é melhor evitar, a menos que você precise executar comandos do Shell. Ele gera um Shell para executar o comando, e o Shell pode analisar o comando da maneira que desejar. Em particular, certas variáveis ​​de ambiente (como $IFS e/ou $PATH) pode ser modificado de forma a fazer com que o pai execute os programas que você nunca pretendeu. Embora popen pareça fazer a mesma coisa, pelo menos fornece uma funcionalidade que faz valer a pena no caso geral.

5
cHao