为什么在C中重定向stdin不起作用?

为什么在C中重定向stdin不起作用?,c,exec,fork,pipe,stdin,C,Exec,Fork,Pipe,Stdin,我试图通过管道“my_pipe”将stdin从父级重定向到子级,但是当我运行程序时,我看不到预期的结果 当我执行程序时,它需要来自stdin的输入,那么为什么不在dup2中重定向stdin呢 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <string.h> int main(int argc,

我试图通过管道“my_pipe”将stdin从父级重定向到子级,但是当我运行程序时,我看不到预期的结果

当我执行程序时,它需要来自stdin的输入,那么为什么不在dup2中重定向stdin呢

#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();
    }
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
字符*参数[]={“排序”,NULL};
int my_管道[2];
如果(管道(我的管道)=-1)
{
fprintf(stderr,“创建管道时出错”);
}
pid_t child_id;
child_id=fork();
如果(子项id==-1)
{
fprintf(stderr,“Fork error\n”);
}
if(child_id==0)//子进程
{
关闭(my_pipe[1]);//孩子不写字
dup2(0,my_管道[0]);//重定向标准输入
execvp(argv[0],参数);
fprintf(stderr,“Exec失败\n”);
}
其他的
{
关闭(my_管道[0]);//父级未读取
字符读取_buf[1];
写(我的管道[1],“你好”,斯特伦(“你好”);
写(我的管道[1],“朋友”,斯特伦(“朋友”);
关闭(my_管道[1]);
等待();
}
}

dup2的参数是反向的。尝试
dup2(我的管道[0],标准文件号)

是!成功了!非常感谢你。