2012-05-22 40 views
2

我试图通过管道“my_pipe”从父级将stdin重定向到子级,但是当我运行我的程序时,我看不到预期的结果。为什么在C中重定向stdin不起作用?

当我执行程序时,它期望从stdin输入,为什么它不重定向stdin在dup2中?

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <string.h> 



int main(int argc, char* argv[]) 
{ 
    char* arguments[] = {"sort", NULL}; 

    int my_pipe[2]; 
    if(pipe(my_pipe) == -1) 
    { 
     fprintf(stderr, "Error creating pipe\n"); 
    } 

    pid_t child_id; 
    child_id = fork(); 
    if(child_id == -1) 
    { 
     fprintf(stderr, "Fork error\n"); 
    } 
    if(child_id == 0) // child process 
    { 
     close(my_pipe[1]); // child doesn't write 
     dup2(0, my_pipe[0]); // redirect stdin 

     execvp(argv[0], arguments); 

     fprintf(stderr, "Exec failed\n"); 
    } 
    else 
    { 
     close(my_pipe[0]); // parent doesn't read 

     char reading_buf[1]; 
     write(my_pipe[1], "hello", strlen("hello")); 
     write(my_pipe[1], "friend", strlen("friend")); 
     close(my_pipe[1]); 
     wait(); 
    } 
} 

回答

5

您对dup2的论点是倒退的。尝试dup2(my_pipe[0], STDIN_FILENO)

+0

是的!那样做了!非常感谢你。 – XavierusWolf