'C exec() use a pipe as default input stream

I want to do the following things:

  1. Child process run a program by exec()
  2. Parent process read from STDIN and do something to the input
  3. Pass the input to child process's default input stream.

I know that the child and the parent share the same STDIO, and I'm not familiar with pipe or how to make child read from other pipe.

Here is my code:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {

    int fd[2];
    pid_t pid = fork();
    pipe(fd);
    if (!pid) {
        dup2(fd[0], STDIN_FILENO);
        char arg_pipe_id[10];
        sprintf(arg_pipe_id, "<&%d", fd[0]);
        close(fd[1]);
        // Error here, cannot use <&id or <id in this execl
        execl("/bin/bash", "/bin/bash", "-i", arg_pipe_id, NULL);
    } else {
        char input[2048];
        close(fd[0]);
        while (fgets(input, 2048, stdin)) {
            ...
            process the input...
            ...
            if (condition) {
                write(fd[1], input, strlen(input));
            }
        }
        close(fd[1]);
        kill(pid, SIGKILL);
        wait(NULL);
    }
}

I'd appreciate it if you could help me!



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source