为什么在C中重定向stdin不起作用?
我试图通过管道“my_pipe”将stdin从父级重定向到子级,但是当我运行程序时,我看不到预期的结果 当我执行程序时,它需要来自stdin的输入,那么为什么不在dup2中重定向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,
#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],标准文件号)
是!成功了!非常感谢你。