子进程正在执行打印语句,但此后什么都没有

问题描述 投票:0回答:1

我有以下代码:

    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]已初始化并且可以正常工作。

c fork stdout
1个回答
1
投票

当你做:

dup2(fd[1], STDOUT_FILENO)

此代码告诉过程将其STDOUT: Standard Output重定向,即打印命令和在终端上打印的所有内容都重定向到文件描述符fd[1]

因此,您的子进程将按照预期执行并打印所有内容,但不在终端上。要查看终端上的输出,请注释以下行:

//dup2(fd[1], STDOUT_FILENO)
© www.soinside.com 2019 - 2024. All rights reserved.