如何多次发送SIGINT信号
how to send SIGINT signal multiple times
我正试图从其他线程向主线程发送SIGINT信号。主线程已经为该信号分配了一个处理程序。当我发送第一个信号时,它被处理程序捕获。但我想连续发送信号。但是在处理第一个信号之后,程序终止。我放了一个while循环。所以我期望的是它应该继续发送这些信号。下面是我的代码
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
static void catch_function(int signo) {
puts("Interactive attention signal caught.");
}
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
while(1)
{
Sleep(50);
puts("Raising the interactive attention signal.");
if (raise(SIGINT) != 0)
{
fputs("Error raising the signal.n", stderr);
return EXIT_FAILURE;
}
}
return 0;
}
int main(void)
{
if (signal(SIGINT, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.n", stderr);
return EXIT_FAILURE;
}
HANDLE thread;
DWORD threadId;
thread = CreateThread(NULL, 0, &MyThreadFunction, NULL, 0, &threadId);
if(!thread)
{
printf("CreateThread() failed");
}
while(1)
{
Sleep(50);
}
puts("Exiting.");
return 0;
}
下面代码的输出是
Raising the interactive attention signal.
Interactive attention signal caught.
Raising the interactive attention signal.
我也试过用一个简单的例子。这里我发送了3次信号,但只有第一次信号被捕获。在那之后,这个项目终止了。下面是代码
#include <signal.h>
#include <stdio.h>
void signal_handler(int signal)
{
printf("Received signal %dn", signal);
}
int main(void)
{
// Install a signal handler.
signal(SIGINT, signal_handler);
printf("Sending signal %dn", SIGINT);
raise(SIGINT);
raise(SIGINT);
raise(SIGINT);
printf("Exit main()n");
}
输出
sending signal 2
Received signal 2
我想知道如何继续从一个线程向另一个线程发送一些信号?我希望我的一个线程将发送SIGINT信号,main将捕获它们并相应地执行一些操作。
通常在第一个信号之后,信号处理程序被重置为SIG_DFL
(Unix V信号),并且SIG_INT
的默认行为退出程序。这就是你观察到的。所以它需要重新安装处理程序。在处理程序中重新安装它:
void signal_handler(int signal)
{
signal(SIGINT, signal_handler);
printf("Received signal %dn", signal);
}
一个更好的方法是使用sigaction
代替,因为它没有这种行为。
相关文章:
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 有可能在信号处理程序中设置promise吗
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 在条件变量中触发错误信号的频率是多少
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- 升压信号2将插槽传递到成员功能以断开连接
- C++函数包装器来捕获某些信号
- 如何防止在C++中使用 popen() 打开的进程接收 SIGINT 信号?
- sigaction SIGINT,程序在 & (background) 中运行,没有得到信号
- 使用 select() 时无法捕获 SIGINT 信号
- SIG_IGN忽略SIGINT信号失败
- 向c++ 11线程传播信号(SIGINT)
- 如何多次发送SIGINT信号