Domanda

sto sviluppando un programma che esegue un programma che utilizza execvp. Ha bisogno di catturare i risultati del processo figlio e analizzare nel processo principale. Sembra che ci sia un modo, utilizzando named pipe, e ingannare. Sto cercando di dare la caccia a un buon esempio di questo, ma finora senza fortuna. Se qualcuno ha qualche puntatori, link e / o suggerimenti su questo, mi piacerebbe molto grato.

È stato utile?

Soluzione

Non è necessario named pipe; pipe senza nome funzionano bene. In realtà, spesso si può semplicemente utilizzare popen invece di fare il pipe / fork / dup / exec te stesso. popen funziona così (anche se implementazione del libc probabilmente ha più il controllo degli errori):

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]);
        execvp(argv[0], argv);
        exit(-1);
    }
    close(fds[1]);
    return fdopen(fds[0], type);
}

Questo crea un tubo senza nome, e forks. Nel bambino, si riattacca output standard (stdin) ad un'estremità del tubo, quindi execs il bambino. Il genitore può semplicemente leggere (o scrivere) dall'altra estremità del tubo.

Altri suggerimenti

Non si può semplicemente utilizzare popen ()?

Ecco un semplice esempio che dimostra l'uso di popen per raggiungere il tuo obiettivo. Basta mettere qualcosa di più interessante di "eco" come il comando:)

#include <stdio.h>

int main() 
{
    char buf[100];
    int i = 0;
    FILE *p = popen("echo \"Test\"","r");
    if (p != NULL )
    {
        while (!feof(p) && (i < 99) )
        {
            fread(&buf[i++],1,1,p);
        }
        buf[i] = 0;
        printf("%s",buf);
        pclose(p);
        return 0;
    }
    else
    {
        return -1;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top