Come catturare l'uscita di execvp
-
11-09-2019 - |
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.
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 fork
s. Nel bambino, si riattacca output standard (stdin) ad un'estremità del tubo, quindi exec
s 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;
}
}