首页 > 解决方案 > 如何计算进程收到信号的次数

问题描述

另一个正在运行的进程(我无法访问其代码)将以随机顺序向我的进程发送一堆 SIGUSR2 信号和两个 SIGUSR1 信号。我的程序的目的是计算在接收到第一个和第二个 SIGUSR1 信号之间接收到 SIGUSR2 信号的次数。

(从我的进程接收到 SIGUSR1 信号后,另一个进程将开始发送)。

我是信号处理的初学者,所以如果它以某种方式涉及循环,它会让我更难。我已经看到用信号操作无限循环是很常见的事情,但它让我很难正确地实现它。

int counter=0;

void count_up(){
    counter++; 
}

void signal_catcher(){
    signal(SIGUSR2,count_up); 
// I think here should go some sort of loop that makes it keep catching SIGUSR2
// There should be some flag or somtehing too, so that it stops after receiving 
// the second SIGUSR1
}

int main(int argc, char *argv[]){
    int pid_sender = atoi(argv[1]);
    kill(pid_sender,SIGUSR1); //The other process is notified to start
    signal(SIGUSR1,signal_catcher); //The first SIGUSR1 is catched 
}

标签: csignals

解决方案


就如此容易。SIGUSR2让我们首先根据您的处理程序创建处理程序:

int counter;

void catch_usr2(void) {
    counter++;
}

SIGUSR1处理程序:

int sw;

void catch_usr1(void) {
    if(!sw) {
        signal(SIGUSR2, catch_usr2);
        sw = 1;
    } else {
        signal(SIGUSR2, SIG_DFL);
        /* Side note: If you want to count these only single time, remove line below. */
        sw = 0;
    }
}

这个第一个信号将设置SIGUSR2为计数器过程,并设置sw为 1。下一次SIGUSR1被捕获,处理程序将自己删除。让我们将其注册为SIGUSR1处理程序:

signal(SIGUSR1, catch_usr1);

假设序列为2122212,此代码将counter等于 3。


推荐阅读