代码之家  ›  专栏  ›  技术社区  ›  Osama Naeem

waitPID函数未检查子进程是否退出

  •  0
  • Osama Naeem  · 技术社区  · 4 年前

    waitPid 告诉我子进程是否退出。 在家长流程中,这就是我所做的:

    if (forkID != 0) {
        
            pid_t result = waitpid(forkID, &status, WNOHANG);
            if (result == 0) {
              // Child still alive
                std::cout<<"Child Alive"<<std::endl;
            } else if (result == -1) {
              // Error
                std::cout<<"Error"<<std::endl;
            } else {
              // Child exited
                std::cout<<"Child Exited"<<std::endl;
            }
    
            DriverParser P;
            while (!std::cin.eof()) {
    
                 std::string line;
                 std::getline(std::cin, line);
    
                  arguments = P.BeginParsing(line);
                  if (arguments.size() > 0) {
                      for (int k = 0; k < 4; k++) {
                          finalArguments[k] = arguments[k];
                      }
                      
                      close(fd[0]);
                      write(fd[1],finalArguments,4*sizeof(int));
                      close(fd[1]);
                      
                      
                      
                  }
             }
            
            
           // pid = wait(&status);
            
          //  std::cout<<waitpid(forkID, &status, 0)<<std::endl;
        
    
    }else if (forkID == 0) {
       // child: reading only, so close the write-descriptor
        
        std::cout<<"I am child process my PID is: "<<getpid()<<std::endl;
    
        execv("./a.out", argList);
        
        // close the read-descriptor
        close(fd[0]);
        
       
        
    }
    

    我基本上是通过管道将解析器的结果发送给子进程,然后在execv中执行一个进程。现在,当该程序退出时,使用 exit(0) -我没有看到 Child Exited 在终端上,这意味着 waitpid

    0 回复  |  直到 4 年前
        1
  •  0
  •   ichramm    4 年前

    waitpid 具有 WNOHANG

    pid_t result = waitpid(forkID, &status, WNOHANG);
    

    documentation ,表示:

    如果在options中指定了WNOHANG,并且没有处于可等待状态的子项,则waitid()立即返回0,并且未指定infop指向的siginfo\t结构的状态。为了将这种情况与子项处于等待状态的情况区分开来,请在调用之前将si\u pid字段置零,并在调用返回后检查该字段中是否存在非零值。

    它还说:

    WNOHANG公司
    如果没有孩子退出,请立即返回。

    子进程 发生在叉子之后,很可能孩子还在跑。

    等待 要结束子进程,只需删除 0 相反):

    pid_t result = waitpid(forkID, &status, 0);
    
    推荐文章