【发布时间】:2018-03-24 11:02:48
【问题描述】:
我一直在尝试编写一个非常简单的程序,其中父进程通过管道将 100 行传递给子进程。然后孩子应该使用生成的行并在这些行上执行命令行程序more。
但是,当我尝试运行该程序时,它只是冻结了。我小心翼翼地关闭了所有两个进程都没有使用的描述符,但我真的不明白是什么原因造成的。
代码:
int main(void){
int fd[2];
if (pipe(fd) == -1){
perror("Error creating pipe");
return 1;
}
dup2(fd[1], STDOUT_FILENO);
int i;
for (i = 1; i <= 100; i++){
printf("Line %d\n", i);
}
close(fd[1]);
pid_t pid = fork();
if(pid == 0) {
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
execlp("more", "more",(char*) NULL);
fprintf(stderr, "Failed to execute 'more'\n");
exit(1);
}
wait(NULL);
return 0;
}
【问题讨论】:
-
如果你在
Linux下运行你的程序strace并看到它实际上并没有冻结,它可以正常工作并以wait()结束。您只是看不到输出 - 请注意write()使用的文件描述符。 -
我认为它“冻结”了,因为执行后提示从未出现过。但是为什么没有出现输出呢?可以做些什么来避免这种行为?