我正在学习关于 fork
、pipe
和 execve
的工作原理。我从一个主进程中 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]);
}