信号处理
UNIX(或其衍生系统)对信号的支持远比 DOS 要多,信号对之于DOS,可类比于中断(INT),
当某信号发生,转到信号处理函数执行,执行完毕后返回到转折点。
定义某信号的处理函数可使用 signal,使用 raise 函数向当前程序(线程)产生一个信号。
原型:
void (*signal(int sig, void(*func)(int sig[, subcode] ))) (int);
int raise(int signal);
明显地,signal 是事前的一个预备(信号 sig 就像Windows的消息,func 所指的函数就像消息映射的处理函数),而 raise 函数导致信号发生。
若 func 的值为SIG_DEF(常量指针),则执行系统默认的函数;若为 SIG_IGN 则忽略 sig 信号。
以下信号是 UNIX 及 DOS 的通用信号(ANSI),若设置为执行默认操作的话,它们都会导致程序被中止:
SIGABRT 异常中止时发生
SIGPPE 算术运算出错时发生
SIGILL 非法硬件指令
SIGINT 中止程序(Ctrl+C,纯DOS)
SIGSEGV 无效内存访问
SIGTERM 中止信号
以下是一个示例:
#include "stdio.h"
#include "conio.h"
#include "signal.h"
void PreExit(int);
int main(void)
{
puts("Press Ctrl+C Exit Program...");
signal(SIGINT, PreExit);
while('y' != getchar())
;
puts("Exiting...");
getch();
return 0;
}
void PreExit(int sig)
{
puts("Do you want to exit this program?('y'es)");
}