2012-10-24 11 views
5

Sto provando a scrivere un programma che esegue un programma esterno.Catch stderr e stdout dal programma esterno in C++

so che posso prendere stdout, e posso prendere stdout e stderr insieme ma la domanda è posso prendere il stderr e stdout separati?

Cioe per esempio, in stderr variabile STDERR e stdout in variabile STDOUT. Voglio dire, li voglio separati.

Inoltre, ho bisogno del codice di uscita del programma esterno in una variabile.

+3

Quale sistema operativo? E quale approccio conosci 'per catturarli insieme? – ybungalobill

+0

Sto usando Ubuntu e so che posso usare 2> & 1. Ma li voglio separati. Grazie –

+0

Guarda questa risposta: http://stackoverflow.com/a/12839498/1741542 –

risposta

2

Su Windows è necessario compilare STARTUPINFO per il CreateProcess per catturare flussi standart ed è possibile utilizzare la funzione GetExitCodeProcess per ottenere lo stato di terminazione. V'è un esempio di come reindirizzare i flussi standart nel processo padre http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499.aspx

Su OS Linux-like probabilmente si desidera utilizzare fork invece di execve, e lavorare con un processo biforcuta è un'altra storia.

In Windows e Linux il reindirizzamento degli stream ha un approccio generale: è necessario creare diversi pipe (uno per ogni flusso) e reindirizzare flussi di processo secondari in tali pipe e il processo padre può leggere i dati da tali pipe.

Codice di esempio per Linux:

int fd[2]; 

if (pipe(fd) == -1) { 
    perror("pipe"); 
    exit(EXIT_FAILURE); 
} 

pid_t cpid = fork(); 
if (cpid == -1) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
} 

if (cpid == 0) { // child 
    dup2(fd[1], STDERR_FILENO); 
    fprintf(stderr, "Hello, World!\n"); 
    exit(EXIT_SUCCESS); 
} else { // parent 
    char ch; 
    while (read(fd[0], &ch, 1) > 0) 
     printf("%c", ch); 
    exit(EXIT_SUCCESS); 
} 

EDIT: Se avete bisogno di recuperare i flussi da un altro programma, utilizzare lo stesso stragey come sopra, prima fork, secondo - usa pipe (come nel codice qui sopra) , poi execve un'altra progrram nel processo figlio e utilizzando questo codice nel processo padre di aspettare una fine esecuzione e prendere un codice di ritorno:

int status; 
if (waitpid(cpid, &status, 0) < 0) { 
    perror("waitpid"); 
    exit(EXIT_FAILURE); 
} 

potete trovare maggiori dettagli nelle pagine man pipe, dup2 e waitpid.

Problemi correlati