为什么我的信号处理程序只执行一次?
Why does my signal handler only execute once?
我正在 UNIX 和 C++ 中处理信号,遇到了这个问题。我正在尝试编写一个计数到 10 的程序,每秒一个数字,当用户尝试使用 SIGINT(如 CTRL+C(中断它时,它会打印一条消息,告诉它无论如何它都会继续计数。
到目前为止,我得到了这个:
#include <iostream>
#include <signal.h>
#include <zconf.h>
using namespace std;
sig_atomic_t they_want_to_interrupt = 0;
void sigint_handler(int signum) {
assert(signum == SIGINT);
they_want_to_interrupt = 1;
}
void register_handler() {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGINT);
sa.sa_handler = sigint_handler;
sigaction(SIGINT, &sa, 0);
}
int main() {
register_handler();
cout << "Hi! We'll count to a hundred no matter what" << endl;
for (int i = 1; i <= 100; i++) {
if (they_want_to_interrupt == 1) {
cout << endl << "DON'T INTERRUPT ME WHILE I'M COUNTING! I'll count ALL THE WAY THROUGH!!!" << endl;
they_want_to_interrupt = 0;
}
cout << i << " " << flush;
sleep(1);
}
cout << "Done!" << endl;
return 0;
}
现在,我第一次发送中断信号时,它工作正常:
Hi! We'll count to a hundred no matter what
1 2 ^C
DON'T INTERRUPT ME WHILE I'M COUNTING! I'll count ALL THE WAY THROUGH!!!
3 4
但是如果我发送第二个中断信号,该过程就会停止。
为什么会这样?我尝试阅读有关"sigaction"的手册,以尝试查看是否有某些东西可以使我创建的处理程序在捕获信号时不会被弹出并回滚到SIG_DFL,但无法解决。
谢谢
您可以在每次发送信号时重置信号处理程序。 我已经看到这用于处理SIGUSR,当信号可能重复预期时。
#include <iostream>
#include <cassert>
#include <signal.h>
#include <zconf.h>
using namespace std;
void register_handler();
sig_atomic_t they_want_to_interrupt = 0;
void sigint_handler(int signum) {
assert(signum == SIGINT);
they_want_to_interrupt = 1;
register_handler();
}
void register_handler() {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGINT);
sa.sa_handler = sigint_handler;
sigaction(SIGINT, &sa, 0);
}
int main() {
register_handler();
cout << "Hi! We'll count to a hundred no matter what" << endl;
for (int i = 1; i <= 100; i++) {
if (they_want_to_interrupt == 1) {
cout << endl << "DON'T INTERRUPT ME WHILE I'M COUNTING! I'll count ALL THE WAY THROUGH!!!" << endl;
they_want_to_interrupt = 0;
}
cout << i << " " << flush;
sleep(1);
}
cout << "Done!" << endl;
return 0;
}
在此代码中:
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGINT);
sa.sa_handler = sigint_handler;
sigaction(SIGINT, &sa, 0);
sa.sa_flags
字段(和其他字段(未初始化,这可能会导致意外结果。最好在开始时对结构进行零初始化,例如:
struct sigaction sa = { 0 };
此外,应将sig_atomic_t
标志声明为volatile
,以防止优化程序引入意外行为。
相关文章:
- 为什么我的信号处理程序只执行一次?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- For循环在cpp中仅执行一次
- 在可变函数调用中执行一次语句
- 如何强制循环执行另一次迭代到零并关闭循环
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- cppUnit:针对多个测试方法执行一次的设置函数
- For 循环是否总是至少执行一次?
- 仅执行一次函数一次内部循环,该循环在每个0.1秒C 处都被调用
- 代码执行/CPU 速度每 2 秒减慢一次
- 函数被多次执行,同时调用一次
- 如何确保方法在该对象的生存期内仅执行一次?
- 一次遍历 8 个向量字节并执行按位运算
- OpenMP 一次只执行一个线程
- 线程仅执行一次
- while(getline(myReadFile, temp, ':')) 执行一次迭代太多导致向量越界
- C++,查找最低值,函数错误:循环最多运行一次(循环增量从未执行)
- Qt - 解决一个插槽上的两个顺序调用,并且仅执行一次操作
- 调用从上一次执行中保存的函数指针会失败吗
- 一次执行后,嵌套for循环出现意外/未见的中断:高斯消去