如何计算进程收到信号的次数
How to count how many times a process has received a signal
另一个 运行 进程(我无法访问其代码)将以随机顺序向我的进程发送一堆 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。
另一个 运行 进程(我无法访问其代码)将以随机顺序向我的进程发送一堆 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。