Search code examples
cexecfork

Redirecting exec output to a buffer or file


I'm writing a C program where I fork(), exec(), and wait(). I'd like to take the output of the program I exec'ed to write it to file or buffer.

For example, if I exec ls I want to write file1 file2 etc to buffer/file. I don't think there is a way to read stdout, so does that mean I have to use a pipe? Is there a general procedure here that I haven't been able to find?


Solution

  • For sending the output to another file (I'm leaving out error checking to focus on the important details):

    if (fork() == 0)
    {
        // child
        int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    
        dup2(fd, 1);   // make stdout go to file
        dup2(fd, 2);   // make stderr go to file - you may choose to not do this
                       // or perhaps send stderr to another file
    
        close(fd);     // fd no longer needed - the dup'ed handles are sufficient
    
        exec(...);
    }
    

    For sending the output to a pipe so you can then read the output into a buffer:

    int pipefd[2];
    pipe(pipefd);
    
    if (fork() == 0)
    {
        close(pipefd[0]);    // close reading end in the child
    
        dup2(pipefd[1], 1);  // send stdout to the pipe
        dup2(pipefd[1], 2);  // send stderr to the pipe
    
        close(pipefd[1]);    // this descriptor is no longer needed
    
        exec(...);
    }
    else
    {
        // parent
    
        char buffer[1024];
    
        close(pipefd[1]);  // close the write end of the pipe in the parent
    
        while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
        {
        }
    }