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

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

我想要的是当每次B收到信号A发送这个信号给B和B的所有subprocess。我真的不知道如何在这里实现一些东西:

1)。 我如何确定信号被发送到B?

2)。 如何将这个信号保存在variables中?

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; } 

恐怕你的问题太广泛了,涉及太多话题。 如果可能的话,我会尽力去帮忙。

关于信号处理 我通常在我的程序中分配一个独立的线程,专门用于信号处理。 这样,我不会“打扰”主执行。

关于如何处理信号,请看下面的代码片段:

 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)只要修改线程处理程序来存储收到的信号(变量signo)

C)请看这里,根据posix标准,有综合的方法来执行它( 检查进程是否存在给定的PID )