Search code examples
cterminalexecfork

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.


Solution

  • 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;
    }