waitPid 告诉我子进程是否退出。 在家长流程中,这就是我所做的:
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
exit(0)
Child Exited
waitpid
waitpid 具有 WNOHANG
WNOHANG
pid_t result = waitpid(forkID, &status, WNOHANG);
documentation ,表示:
如果在options中指定了WNOHANG,并且没有处于可等待状态的子项,则waitid()立即返回0,并且未指定infop指向的siginfo\t结构的状态。为了将这种情况与子项处于等待状态的情况区分开来,请在调用之前将si\u pid字段置零,并在调用返回后检查该字段中是否存在非零值。
它还说:
WNOHANG公司 如果没有孩子退出,请立即返回。
子进程 发生在叉子之后,很可能孩子还在跑。
子进程
等待 要结束子进程,只需删除 0 相反):
0
pid_t result = waitpid(forkID, &status, 0);