如何在 Unix C++ 上跟踪进程?

How to track a process on Unix C++?

我有一个程序 (A) 启动另一个程序 (B)。

我想要的是每次 B 收到信号 A 都会将此信号发送给 B 和 B 的所有子进程。我真的不知道如何在这里实现一些事情:

1).如何确定信号已发送到 B?

2).如何将此信号保存在变量中?

3).我如何循环直到 B 还活着?

int main() {
   pid_t pid = fork();
   int32_t num = 0;
   if (pid == 0) {
      static char *argv[] = {"main", NULL};
      execv(argv[0], argv); //start program B
   }
   else{
      while(/*B is alive*/){
          //if program B receives signal
          //I want to send this signal to B and all child processes, 
          //cause B doesn't handle any signals
          if (/*B receives signal*/){
              //save this signal to num.
              kill(pid, num); //???
                              //send signal to parent
                              //useless cause it was already send to B?
              fp = popen((("pgrep -P ") + string(num)).c_str(), "r");
              //pgrep all child processes
              std::vector<int> children;
              while (fgets(buf, 128, fp) != NULL) //getting child pid
                  children.push_back(stoi(string(buf)));
              for(auto a : children)              
                  kill(a, num); //send signal to child
         }
      }
   } 
   return 0;
}

恐怕你的问题实在是太宽泛了,涉及的话题太多了。如果可能,我会尽力提供帮助。

关于信号处理。我通常在我的程序中创建一个单独的线程,专门用于信号处理。这样我就不"disturb"主执行了

关于如何处理信号,请看这段代码:

void    *   threadSignalHandler (){
int err, signo;

for (;;) {
    err = sigwait(&mask, &signo);
    if (err != 0) {
        syslog(LOG_ERR, "sigwait failed");
        exit(1);
    }

    switch (signo) {
    case SIGHUP:
        //Do your stuff here

        break;

    case SIGTERM:
        //Do your stuff here 
        break;
    default:
        syslog(LOG_INFO, "unexpected signal %d\n", signo);
        break;
    }
}
return(0);

}

同样,如前所述,我通常会生成一个新的基本线程,并且我是这样处理的:

    int                 err;
    pthread_t           tid;

 /*
    * Restore SIGHUP default and block all signals.
    */
   sa.sa_handler = SIG_DFL;
   sigemptyset(&sa.sa_mask);
   sa.sa_flags = 0;
   if (sigaction(SIGHUP, &sa, NULL) < 0)
       err_quit("%s: can′t restore SIGHUP default");
   sigfillset(&mask);
   if ((err = pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0)
       err_exit(err, "SIG_BLOCK error");



    /*
    * Create a thread to handle SIGHUP and SIGTERM.
    */
   err = pthread_create(&tid, NULL, threadSignalHandler, 0);
   if (err != 0)
       err_exit(err, "can′t create thread");

所以,回答你的 3 个问题:

A) 使用我提供的代码,它已经过测试,我知道它可以工作。

B) 只是 修改线程处理程序以存储接收到的信号(变量 签名)

C) 请看这里,有统一的方法 它,根据 posix 标准 (Check if process exists given its pid)