2009-03-18 4 views

risposta

7

popen lavoro? Genera il processo, quindi leggi/scrivi con un handle FILE*

5

Quindi la vostra scelta è system() oppure utilizzare una libreria che esegue il wrapping del processo di spawning per voi. Quest'ultimo, o il modo più duro che si voleva evitare, è raccomandato se si desidera un controllo preciso su errori, pipe e così via.

3

system() è abbastanza facile.

Ma dovresti cercare di non farlo se puoi. Gli script funzionano meglio quando sono in cima alle cose, non al di sotto. Se sei in UNIX, è spesso molto meglio suddividere il lavoro e scrivere uno script di primo livello per chiamare tutti i pezzi.

Ricordo di aver visto un programmatore aggiungere un numero enorme di chiamate di sistema nel suo codice C per evitare di dover imparare la shell Bourne. Ha pensato che fosse un modo intelligente e veloce per farlo funzionare, ma quando ha fallito, ha fallito male. Ha sprecato un sacco di tempo a mettere a punto il caos. Sarebbe stato molto più veloce imparare semplicemente alcuni semplici comandi della shell ...

Paul.

1

libc ha funzioni system e popen, che funzionano un po 'come questo:

int system(cont char *command) { 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    int status; 
    pid_t child = fork(); 
    if (child == 0) { 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    waitpid(child, &status, 0); 
    return status; 
} 

FILE *popen(const char *command, const char *type) { 
    int fds[2]; 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    pipe(fds); 
    if (fork() == 0) { 
     close(fds[0]); 
     dup2(type[0] == 'r' ? 0 : 1, fds[1]); 
     close(fds[1]); 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    close(fds[1]); 
    return fdopen(fds[0], type); 
} 

(tranne che con maggiore controllo degli errori e cose)

Se si desidera un controllo più preciso sopra la manipolazione (invece di passare attraverso argomento sh), o se vuoi il controllo su più di uno di {stdin, stdout, stderr}, dovrai scriverlo da solo o trovare una libreria. Ma la libreria standard copre la maggior parte dei casi d'uso.

1

È possibile farlo attraverso il sistema() chiamata Questo Threadè un buon esempio

Problemi correlati