c - 如何计算进程收到信号的次数
问题描述
另一个正在运行的进程(我无法访问其代码)将以随机顺序向我的进程发送一堆 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
}
解决方案
就如此容易。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。
推荐阅读
- php - 我的服务器上出现的这个 PHP 文件是什么?
- angular - 无法在 Angular 6 中使用 ngFor 显示 agm 标记列表
- android - Android Studio 和 Gradle - 关于 testCompile、testImplementation、testApi 的看似误导性的警告
- javascript - 如何让我的 Number Diamond 具有零和更改的行?
- asp.net - 找不到 System.ComponentModel.Composition 2.0.5.0。已弃用?
- ios - 在 iOS 11 中获取我的 UIBarButtonItem 的位置
- django-rest-framework - Django Rest Api - 对齐文本
- php - 在 PHP 中处理来自选择选项表单的数据
- c# - 将未签名的包集成到已签名的项目中
- java - aws lambda是否只能公开一个spring boot api