signal函数的用法
第一个参数是信号值, 本文使用到的三个常用的Windows系统下的信号如下
信号名 | 说明 |
---|---|
SIGINT | 中断, 通过键入 Ctrl+C触发 |
SIGBREAK | 通过键入Ctrl+Break触发 |
SIGABRT | 通过调用abort()函数触发 |
在Windows系统中有定义的所有信号(定义在signal.h中)
#define SIGINT 2 // interrupt
#define SIGILL 4 // illegal instruction - invalid function image
#define SIGFPE 8 // floating point exception
#define SIGSEGV 11 // segment violation
#define SIGTERM 15 // Software termination signal from kill
#define SIGBREAK 21 // Ctrl-Break sequence
#define SIGABRT 22 // abnormal termination triggered by abort call
测试的内容:
- SIGINT信号的屏蔽
- 自定义signal()的处理函数, 从而控制程序在接受到对应信号时采取的动作
/* Signal types
#define SIGINT 2 // interrupt
#define SIGILL 4 // illegal instruction - invalid function image
#define SIGFPE 8 // floating point exception
#define SIGSEGV 11 // segment violation
#define SIGTERM 15 // Software termination signal from kill
#define SIGBREAK 21 // Ctrl-Break sequence
#define SIGABRT 22 // abnormal termination triggered by abort call
*/
#include <iostream>
#include <signal.h>
#include <windows.h>
using namespace std;
typedef void (*signal_handler)(int);
bool bRun = true;
void signal_handler_func(int signal)
{
cout << "signal id: " << signal << endl;
switch (signal)
{
case SIGINT:
cout << "\tSIGINT" << endl;
bRun = false;
break;
default:
cout << "NOT SIGINT: Do Nothing." << endl;
}
}
int main(void)
{
int iCount = 0;
//signal(SIGINT, SIG_DFL); // 屏蔽SIGINT信号
signal_handler pSignalHander = signal_handler_func;
signal(SIGINT, pSignalHander);
signal(SIGABRT, pSignalHander);
signal(SIGBREAK, pSignalHander);
while (bRun)
{
cout << "Running in LOOP: " << iCount++ << endl;
//if (iCount && (iCount % 5) == 0)
//{
// abort(); // 发送SIGABRT信号
//}
Sleep(1000);
}
cout << "out of loop, ready to return." << endl;
return 0;
}