gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:49:40 24 4
gpt4 key购买 nike

我有一个程序 (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;
}

最佳答案

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

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

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

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 )

关于c++ - 如何在 Unix C++ 上跟踪进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43838853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com