首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当子进程还活着时,c++循环

当子进程还活着时,c++循环
EN

Stack Overflow用户
提问于 2011-02-20 20:50:20
回答 1查看 1.4K关注 0票数 2

在我编写了一个c++程序之后。在子进程终止之前运行while循环的语法是什么?

代码语言:javascript
复制
int value = fork();
if( value = 0 ) {
    //do something
} else {
    while(childIsAlive) {
        //do something
    }
}

做一些事情是独立的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-20 20:53:03

代码语言:javascript
复制
int Stat;
if (waitpid(PidOfChild, &Stat, WNOHANG) == PidOfChild) {
  if (WIFEXITED(Stat) || WIFSIGNALED(Stat)) {
    childAlive = false;
  }
}

waitpid等待waitpid中的状态更改。如果返回PidOfChild,则说明发生了更改,并更新了Stat。

如果子进程正常退出,WIFEXITED(Stat)将为true

如果子进程被信号终止,WIFSIGNALED(Stat)将为true。

编辑:示例代码。

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>

#include <iostream>
#include <cstdlib>

using namespace std;

int main() {

  srand(time(0));

  pid_t pid = fork();

  if (pid == 0) {
    int Seconds = rand() % 3 + 1;
    cout << "child: Sleeping " << Seconds << " seconds" << endl;
    sleep(Seconds);
    if (rand() % 2) {
      cout << "child: Killing" << endl;
      kill(getpid(), SIGTERM);
    } else {
      int ExitCode = rand() % 3;
      cout << "child: Exiting with exit code " << ExitCode << endl;
      exit(ExitCode);
    }
  } else if (pid > 0) {
    for (;;) {
      cout << "parent: spinning waiting for child to exit" << endl;
      int Stat;
      while (waitpid(pid, &Stat, WNOHANG) != pid);
      if (WIFEXITED(Stat)) {
        cout << "parent: Child exited with exit code " << WEXITSTATUS(Stat) << endl;
        break;
      } else if (WIFSIGNALED(Stat)) {
        cout << "parent: Child killed with signal " << WTERMSIG(Stat) << endl;
        break;
      } else {
        cout << "parent: Something else happened to child, e.g. STOPPED" << endl;
      }
    }

  } else {
    cout << "Error forking: " << strerror(errno) << endl;
  }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5057137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档