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.
Quale sistema operativo? E quale approccio conosci 'per catturarli insieme? – ybungalobill
Sto usando Ubuntu e so che posso usare 2> & 1. Ma li voglio separati. Grazie –
Guarda questa risposta: http://stackoverflow.com/a/12839498/1741542 –