使用 printf、管道和 fork 时出现奇怪的行为。

时间:2021-08-12 04:11:43

标签: c pipe printf fork

我正在学习关于 forkpipeexecve 的工作原理。我从一个主进程中 fork 出一个子进程和父进程。父进程等待,直到子进程将 ls -la 的输出写入 fd[1](这被重定向到 stdout)才开始运行。问题是只有在我的主函数中使用 printf() 并且在调用父进程之前,它才能正常工作。否则,我无法获得输出。您可以通过取消注释来测试此代码。任何想法都是什么导致了这个问题?

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

void child_call(int ac, char **ag, char **ep, int fd[2])
{
    char *buf;
    char *argv[3] = {"ls", "-la", NULL};

    dup2(fd[1], 1);
    close(fd[1]);
    close(fd[0]);
    execve("/usr/bin/ls", argv, ep);
}

void parent_call(int ac, char **ag, char **ep, int fd[2])
{
    char *buf;

    close(fd[1]);
    while (read(fd[0], buf, 1) > 0)
        write(1, buf, 1);
    close(fd[0]);
}

int main(int ac, char **ag, char **ep)
{
    pid_t   pid;
    int     fd[2];
    int     *status;

    pipe(fd);
    pid = fork();
    if (pid == 0)
        child_call(ac, ag, ep, fd);
    else
    {
        // printf("uncomment me and it will work\n");
        waitpid(-1, NULL, WNOHANG);
        parent_call(ac, ag ,ep, fd);
    }
    close(fd[0]);
    close(fd[1]);
}

0 个答案:

没有答案