可能是操作系统的原因,因为我让朋友在LINUX的机子上试了,得到了我想要的答案.但是在WINDOWS上却得不到!!!
信号处理
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)");
}
在我的程序里,他是识别出了信号,但是却没有实行跳转,就是longjmp(),出现了“不知道的软件异常错误”.但是我在UNIX下却得以实现,是否操作系统不同导致的呢?
在循环内设置一个输入,才可以响应 Ctrl+C 中断,
信号处理函数执行完毕后,还需要为退出循环做好准备,
这是因为中断后转到信号处理,处理完毕后返回到转折点(循环内),
这将继续无限循环。
loop:
if('y' == getchar()) /* 输入y结束程序 */
exit(0);
goto loop;