流程和管道示例(关于Waitpid的困惑)

时间:2019-12-08 12:44:14

标签: c linux pipe fork system-calls

我在理解以下代码时遇到了一些麻烦: 我知道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;
}

0 个答案:

没有答案