Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grabbing output from exec

I'm trying to write a C program that grabs command output and then i'll be passing that to another program.

I'm having an issue, I cant work out how to get the command output and store it. Below is a sample of what I have

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

so basically im wondering if there is any way i can get the output from the "execl" and pass it to some thing else (e.g. via storing it in some kind of buffer).

Suggestions would be great.

like image 819
TrewTzu Avatar asked Sep 03 '11 10:09

TrewTzu


2 Answers

You have to create a pipe from the parent process to the child, using pipe(). Then you must redirect standard ouput (STDOUT_FILENO) and error output (STDERR_FILENO) using dup or dup2 to the pipe, and in the parent process, read from the pipe. It should work.

#include <stdio.h> #include <stdlib.h> #include <unistd.h>  #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; } 
like image 107
Aif Avatar answered Oct 13 '22 00:10

Aif


Open a pipe, and change stdout to match that pipe.

 #include <sys/types.h>  #include <unistd.h>  #include <stdio.h>  #include <stdlib.h>   int pipes[2];   pipe(pipes); // Create the pipes   dup2(pipes[1],1); // Set the pipe up to standard output 

After that, anything which goes to stdout,(such as through printf), comes out pipe[0].

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

Now you can read the output like a normal file descriptor. For more details, look at this

like image 39
Darcy Rayner Avatar answered Oct 12 '22 23:10

Darcy Rayner