SIGINT signal()/sigaction in C++
SIGINT signal()/sigaction in C++
下面是我的代码:
void sigHandle(int sig)
{
signal(SIGINT, sigHandle); //Is this line necessairy?
cout<<"Signal: "<<sig<<endl;
}
int main(){
signal(SIGINT, sigHandle);
while(true){ //Supposed to loop until user exits.
//rest of my code
}
}
现在我对signal()的理解是,当收到SIGINT命令(Ctrl+C对吗?)时,我的函数sigHandle应该以整数2 (SIGINT数)调用,该方法应该运行,程序应该NOT退出。
我想做的只是打印信号号然后继续,但是在打印出" signal: 2"之后它退出。
(最终我应该处理前32个中断,但我认为Ctrl+C将是最困难的,所以我从这里开始。)
在main中,如果我执行signal(SIGINT, SIG_IGN);,它会正确地忽略信号并且不会退出,但我现在无法知道我是否收到了SIGINT中断。
早些时候我在玩符号结构,但我找不到任何真正全面的文档,所以我决定只使用"raw"信号处理。
这是我的签名代码(与上面的问题相同):
struct sigaction action;
action.sa_handler = sigHandle;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGINT, &action, 0);
谢谢你的帮助!
<标题>编辑OK SO经过许多许多小时的浏览手册页和互联网,我遇到了一个(非常)ghetto解决方案,涉及保存堆栈前无限循环,然后当中断来临时,做我需要做的事情,然后重新设置堆栈回到原来的位置,并调用sigrelse()命令重新设置任何可能已更改且未重新加载的状态。
我明白这不是最优雅/有效/甚至社会可接受的解决方案,但它的工作,据我所知,我没有泄漏任何内存的任何地方,所以这一切都很好…
我仍然在寻找这个问题的解决方案,我认为我的堆栈重新设置恶作剧只是一个临时修复…
谢谢!
标题>还应注意,不应在信号处理程序中调用stdio(或其他不可重入函数)。(你的信号处理程序可能在malloc中间被调用,或者它是c++的等效)
不是。你只是用相同的函数替换SIGINT的句柄。程序如何执行等待?
如果你有这样的东西:
int main
{
// ...
int r = read(fd, &buff, read_size); // your program hangs here, waiting for the data.
// but if signal occurred during this period of time
// read will return immediately, and r may != read_size
return 0; // then it will go straight to return.
}
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- SIGINT signal()/sigaction in C++