Agarrando la salida del ejecutivo

así que estoy tratando de escribir algo que necesite obtener el resultado del comando y luego tratarlo y luego pasarlo a otro progtwig.

pero estoy teniendo un problema, no puedo entender cómo obtener el resultado del comando y almacenarlo a continuación es una muestra de lo que tengo

if(fork() == 0){ execl("/bin/ls", "ls", "-1", (char *)0); /* hopefully do something with the output here*/ }else{ *other stuff goes here* }` 

así que básicamente me estoy preguntando si hay alguna forma de obtener el resultado del “execl” y pasarlo a otra cosa (por ejemplo, al almacenarlo en algún tipo de buffer).

Cualquier sugerencia seria genial. gracias chicos .. `

Debe crear un conducto del proceso primario al hijo, utilizando pipe() . A continuación, debe redirigir la error output standard ouput (STDOUT_FILENO) y error output (STDERR_FILENO) utilizando dup o dup2 a la tubería y, en el proceso principal, leer desde la tubería. Deberia de funcionar.

 #include  #include  #include  #define die(e) do { fprintf(stderr, "%s\n", e); exit(EXIT_FAILURE); } while (0); int main() { int link[2]; pid_t pid; char foo[4096]; if (pipe(link)==-1) die("pipe"); if ((pid = fork()) == -1) die("fork"); if(pid == 0) { dup2 (link[1], STDOUT_FILENO); close(link[0]); close(link[1]); execl("/bin/ls", "ls", "-1", (char *)0); die("execl"); } else { close(link[1]); int nbytes = read(link[0], foo, sizeof(foo)); printf("Output: (%.*s)\n", nbytes, foo); wait(NULL); } return 0; } 

Abra una tubería y cambie la salida estándar para que coincida con esa tubería.

  #include  #include  #include  #include  int pipes[2]; pipe(pipes); // Create the pipes dup2(pipe[1],1); // Set the pipe up to standard output 

Después de eso, todo lo que vaya a stdout, (como por ejemplo, a través de printf), saldrá de la tubería [0].

 FILE *input = fdopen(pipe[0],"r"); 

Ahora puede leer el resultado como un descriptor de archivo normal. Para más detalles, mira esto

Gracias Jonathan Leffler, y optimizo el código anterior porque no puede leer todas las respuestas por una vez.

 #include  #include  #include  #include  #include  #define die(e) do { fprintf(stderr, "%s\n", e); exit(EXIT_FAILURE); } while (0); int main() { int link[2]; pid_t pid; char foo[4096 + 1]; memset(foo, 0, 4096); if (pipe(link)==-1) die("pipe"); if ((pid = fork()) == -1) die("fork"); if(pid == 0) { dup2 (link[1], STDOUT_FILENO); close(link[0]); close(link[1]); execl("/bin/ls", "ls", "-1", (char *)0); die("execl"); } else { close(link[1]); int nbytes = 0; std::string totalStr; while(0 != (nbytes = read(link[0], foo, sizeof(foo)))) { totalStr = totalStr + foo; printf("Output: (%.*s)\n", nbytes, foo); memset(foo, 0, 4096); } wait(NULL); } return 0; }