2012-05-22 66 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