我在理解以下代码时遇到了一些麻烦: 我知道dup在做什么。第一个派生后,孩子运行“ ls” ,第二个派生后,孩子运行“更多”。
但是为什么我们只将 pid2用于机敏?为什么不 pid1 ?是因为如果使用pid1,pid2可能会进入僵尸案例?
如果第一个分叉过程遇到错误,会发生什么?我们看到错误消息了吗?
在 execve()和waitpid()调用之前,进程的文件描述符表如何?
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<sys/types.h>
int main(int argc, char *argv[])
{
pid_t pid1, pid2;
int fds[2];
char *argv1[] = { "ls", "-l", "/usr/bin", NULL };
char *argv2[] = { "more", NULL };
pipe(fds);
pid1 = fork();
if (! pid1) {
close(fds[0]);
dup2(fds[1], STDOUT_FILENO);
close(fds[1]);
execvp(argv1[0], argv1);
}
pid2 = fork();
if (! pid2) {
close(fds[1]);
dup2(fds[0], STDIN_FILENO);
close(fds[0]);
execvp(argv2[0], argv2);
}
close(fds[0]);
close(fds[1]);
waitpid(pid2, NULL, 0);
return EXIT_SUCCESS;
}