2

I'm trying to redirect the output of a process to the stdin of another process. This is done by dup2(). My question is: do stdin and stdout go back to their place(0,1) after function terminates, or do i have to do something like savestdin = dup(0). More clearly, after the function for one command terminates, at the second call are stdin and stdout on their supposed position?

Krishna Kanth Yenumula
  • 2,533
  • 2
  • 14
  • 26
Sirona
  • 23
  • 2

1 Answers1

0

To get your stdout to go to a forked process' stdin, you'll need to use a combination of pipe and dup. Haven't tested it but it should give you some ideas hopefully:

int my_pipe[2];

pipe(my_pipe); // my_pipe[0] is write end
               // my_pipe[1] is read end

// Now we need to replace stdout with the fd from the write end
// And stdin of the target process with the fd from the read end

// First make a copy of stdout
int stdout_copy = dup(1);

// Now replace stdout
dup2(my_pipe[0], 1);

// Make the child proccess
pid_t pid = fork();
if (pid == 0)
{
    // Replace stdin
    dup2(my_pipe[1], 0);
    execv(....); // run the child program
    exit(1); // error
}
int ret;
waitpid(pid, &ret, 0);

// Restore stdout
dup2(stdout_copy, 1);
close(stdout_copy);

close(my_pipe[0]);
close(my_pipe[1]);

So to answer your question, when you use dup2() to replace 0 and 1, they will not be restored to the terminal unless you save the original file descriptor with dup() and manually restore it with dup2().

Andrei Tumbar
  • 490
  • 6
  • 15