我有以下代码:
pid_t childProcessID;
childProcessID = fork();
if (childProcessID == -1) {
printf("fork failed");
exit(EXIT_FAILURE);
}
if (childProcessID == 0) {
printf("reached child\n");
close(STDOUT_FILENO);
dup2(fd[1], STDOUT_FILENO);
close(fd[1]);
close(fd[0]);
printf("about to execute child command\n");
if (fork() == 0) {
execve(argv1[0], argv1, NULL);
printf("Command not found.");
exit(1);
}
else {
wait(NULL);
}
}
else {
printf("reached parent, but wait for child to finish\n");
waitpid(childProcessID, &child_status, NULL);
printf("child finished\n");
close(STDIN_FILENO);
dup2(fd[0], 0);
close(fd[1]);
printf("About to executed piped command\n");
if (fork() == 0) {
execve(argv2[0], argv2, NULL);
printf("Command not found");
exit(1);
}
else {
wait(NULL);
}
}
当我运行我的minishell并为其输入nl parse.c | wc -l,我的minishell打印出来:
已联系父母,但等待孩子完成
受害儿童
下面没有东西。该程序显然仍在运行,但未打印任何内容。为什么我的孩子不执行其余代码? argv1 []和argv [2]已初始化并且可以正常工作。
当你做:
dup2(fd[1], STDOUT_FILENO)
此代码告诉过程将其STDOUT: Standard Output
重定向,即打印命令和在终端上打印的所有内容都重定向到文件描述符fd[1]
。
因此,您的子进程将按照预期执行并打印所有内容,但不在终端上。要查看终端上的输出,请注释以下行:
//dup2(fd[1], STDOUT_FILENO)