在不使用SA_RESTART的情况下使用sigaction,并防止中篇循环
Using sigaction without SA_RESTART and preventing an infinte loop
我有以下代码:
struct sigaction act = {{0}};
act.sa_handler = handler;
sigaction(SIGINT, &act, nullptr);
while (true)
{
std::cout << "input:";
std::getline(std::cin, line);
// Handle line
}
当我收到SIGINT时,程序会陷入一个无限循环。我不能简单地设置SA_RESTART(就像这里一样(,因为我想在收到信号时打印一条消息。
我不想直接从处理程序打印,所以我在其中设置了一个标志,并在循环中检查它。
if (flag)
std::count << "got SIGINT" << std::endl;
SA_RESTART导致getline阻塞,所以除非getline返回,否则我无法达到这个if并处理信号。这附近有什么吗?
编辑(完整示例(:
#include <iostream>
#include <signal.h>
bool flag = false;
void handler(int signum)
{
flag = true;
}
int main()
{
struct sigaction act = {{0}};
act.sa_handler = handler;
//act.sa_flags = SA_RESTART;
sigaction(SIGINT, &act, nullptr);
while (true)
{
std::cout << "input:";
std::string line;
std::getline(std::cin, line);
if (flag) {
std::cout << "got SIGINT" << std::endl;
flag = false;
}
}
}
当getline
中断时,将在cin
上设置错误标志。这需要清除,以防止getline
连续出现故障。
if (flag) {
std::cout << "got SIGINT" << std::endl;
flag = false;
std::cin.clear();
}
flag
时,bool flag = false;
不正确。
正确:
std::sig_atomic_t volatile flag = false;
详见std::sig_atomic_t
。
相关文章:
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 循环依赖,在继承类的情况下使用覆盖方法
- C++在不使用pow或循环的情况下计算一个数字的幂
- 如何在不循环的情况下使用getline读取文件
- 如何在没有同步的情况下使用多个线程(2、4,8、16 个线程)在循环(10,100、1000 个周期)中打印字符串?
- 如何在没有可变参数函数的情况下循环函数的参数
- 如果 return 语句在带括号的循环中,错误可能会到达非 void 函数的末尾,但不会显示在没有括号的循环的情况下
- 在给定相同的输入的情况下,某些代码怎么可能花费更多时间来运行,这似乎只是因为它处于循环中?
- 如何在不中断整个循环的情况下跳过循环交互 - C++
- 如何在不停滞主循环的情况下实现对话系统?
- 如何在不将其拆分为两个嵌套循环的情况下打印整个形状?
- 了解如何在不冻结事件循环的情况下在 QThread 中休眠/等待
- 视觉 在C++中,我试图在没有递归的情况下循环访问许多对象
- 默认情况下,C++ 开关运行时循环
- while 循环是否在设置标志的情况下运行多次?
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- 我可以在不循环访问数组/向量的情况下检查数组/向量中的单词吗?
- 如何在不使用循环或迭代器的情况下检查所有列表元素并在满足条件时删除一个
- 您可以在没有列表或向量的情况下循环访问类对象吗?
- 在这种情况下,while 循环如何工作