Domanda

Come posso chiamare awk o sed all'interno di un programma c? So che potrei usare exec (), ma non voglio occuparmi di fork () e di tutta quell'altra cattiveria.

È stato utile?

Soluzione

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

Altri suggerimenti

Quindi la tua scelta è system () , o usando una libreria che avvolge la generazione del processo per te. Quest'ultimo, o il modo hard-core che volevi evitare, è consigliato se desideri un controllo accurato su errori, pipe e così via.

system () è abbastanza semplice.

Ma dovresti cercare di non farlo se puoi. Gli script funzionano meglio quando sono in cima alle cose, non sotto. Se sei in UNIX, spesso è meglio interrompere il lavoro e scrivere uno script di livello superiore 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. Pensò che fosse un modo intelligente e rapido per farlo funzionare, tuttavia quando fallì, fallì gravemente. Ha sprecato enormi quantità di tempo nel debug del pasticcio. Sarebbe stato molto più veloce imparare solo alcuni semplici comandi della shell ...

Paul.

libc ha le funzioni system e popen , che funzionano in questo modo:

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 più controllo degli errori e cose)

Se vuoi un controllo più preciso sulla gestione degli argomenti (invece di passare attraverso sh ), o vuoi controllare più di uno di {stdin, stdout, stderr} , dovrai scriverlo da solo o trovare una biblioteca. Ma la libreria standard copre la maggior parte dei casi d'uso.

Puoi farlo tramite la chiamata di sistema () Questo Discussione è un buon esempio

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top