问如何捕获或忽略键盘中断,如 Ctrl-C?
答基本步骤是调用signal函数,例如
#include <signal.h> signal(SIGINT, SIG_IGN);忽略中断信号,或者调用
extern void func(int); signal(SIGINT, func);在接收到中断信号时将控制权转移到函数func。 [脚注]
在 Unix 等多任务系统中,最好使用一种稍微复杂一些的技术
extern void func(int); if(signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, func);测试和额外的调用可以确保在前台输入的键盘中断不会无意中中断后台运行的程序(并且以这种方式调用signal没有坏处,任何系统都可以)。 [脚注]
在某些系统中,键盘中断处理也是终端输入子系统模式的一个功能;请参阅问题 19.1。在某些系统中,键盘中断的检查仅在程序读取输入时进行,因此键盘中断处理可能取决于正在调用哪些输入例程(以及是否*有*任何输入例程处于活动状态)。在 MS-DOS 系统中,setcbrk或ctrlbrk函数也可能涉及。
参考:ISO Secs. 7.7, 7.7.1
H&S Sec. 19.6 pp. 411-3
PCS Sec. 12 pp. 210-2
POSIX Secs. 3.3.1, 3.3.4