2011-12-16 22 views
16

Voglio eseguire un binario all'interno del mio codice C. Con cosa è meglio eseguire? popen() o system()Qual è la differenza tra popen() e system() in C

EDIT: ho provato ad usare system, ma il processo di esecuzione sembra rimanere bloccati alla fine e non restituisce al mio codice.

Qualche suggerimento su cosa fare?

Grazie

+4

'man popen' e' sistema uomo'? –

+0

Hai provato a usare il popen()? o è il problema con te binario? L'ultima modifica è un po 'confusa – henryyao

+0

L'uso di 'popen' invece di' system' non aiuta il tuo problema reale: il processo si blocca. – Wolf

risposta

25

popen() ti permette di controllare i flussi di file di output di ingresso o del processo. system() no. Se non è necessario accedere all'I/O del processo, è possibile utilizzare system() per semplicità.

system() è in C89 e C99; popen() è solo Posix (sebbene anche l'API di Windows ne abbia una).

Entrambe le funzioni invocano una qualche forma di un guscio di per eseguire il comando (per esempio /bin/sh su Linux, e probabilmente cmd.exe su Windows). Se si desidera eseguire direttamente un file eseguibile e si è su Posix, è anche possibile consultare exec* -famiglia di funzioni in combinazione con fork() (dal exec()sostituisce il processo corrente).

+3

+1, non ho mai realizzato che il popen invochi la shell. –

+1

@HeathHunnicutt: Neanch'io fino a cinque minuti fa, quando ho seguito il consiglio di Joachim :-) –

+3

Nota importante su 'popen': ti dà il controllo sull'input ** O ** il flusso di output, non entrambi. –

4

Utilizzare popen se si desidera eseguire un comando di shell e si desidera che il processo padre sia in grado di comunicare con il figlio. (Aggancia l'input del figlio o restituisce l'output al flusso che si riceve.) Altrimenti, preferire la famiglia di funzioni exec (probabilmente in combinazione con fork); I processi di exec ereditano la maggior parte dei descrittori di file aperti (inclusi stdin, stdout e stderr), quindi è possibile collegare l'input e l'output a qualsiasi cosa si desideri ... inoltre, ci sono meno implicazioni sulla sicurezza.

system è generalmente meglio evitato a meno che non sia necessario eseguire i comandi della shell. Genera una shell per eseguire il comando e la shell può analizzare il comando in qualsiasi modo desideri. In particolare, alcune variabili d'ambiente (come $IFS e/o $PATH) possono essere modificate in modo tale da far sì che il genitore esegua programmi a cui non si è mai destinati. Anche se popen sembra fare la stessa cosa, almeno fornisce funzionalità che lo rendono utile nel caso generale.

+0

Si può fare * solo * input * o * output, credo. 'popen()' genera anche una shell. –

Problemi correlati