【问题标题】:How to count how many times a process has received a signal如何计算进程收到信号的次数
【发布时间】:2019-05-11 18:11:15
【问题描述】:

另一个正在运行的进程(我无法访问其代码)将以随机顺序向我的进程发送一堆 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 
}

【问题讨论】:

    标签: c signals


    【解决方案1】:

    就这么简单。让我们首先根据您的处理程序创建 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 handler:

    signal(SIGUSR1, catch_usr1);
    

    假设2122212的序列,这段代码将使counter等于3。

    【讨论】:

    • 我想我理解了你描述的两个信号捕捉器,我很感谢你,但是主要功能的其余部分是否应该像我描述的那样保持不变?它让我感到困惑,单个信号(SIGUSR1,catch_usr1)语句如何可以多次捕获 SIGUSR1 而无需前进到下一行代码。不知道我是否解释得太清楚了。也不确定我是否应该在 main 的末尾添加一个 return。
    • 这就是处理程序的工作方式。我建议你学习事件驱动编程。
    猜你喜欢
    • 2013-12-29
    • 2021-09-10
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多