库函数signal和CTRL-C
进程接受和发出的信号(signal)相关的设置函数signal,和ctrl-c的处理原理
ctrl-c是通过中断信号切断当前程序运行的。
中断是信号的一种,信号有用户、内核、进程三个来源。
用户的一些特定操作可以被设置为信号;
而内核通过信号接受程序报错或利用信号通知进程特定事件的发生(利用信号实现内核和进程通信);
进程操作产生的信号被称为同步信号,用户操作产生的信号称为异步信号。
和信号相关的一个重要函数是<signal.h>(csignal)中的signal():
一般用法是
signal(信号名,处理方式);
较常用信号名的是SIGINT(中断)和SIGQUIT(退出)
处理方式有三种:
- SIG_IGN:忽略信号,有无这个信号都不做响应。如果在某个进程(程序)中对信号SIGINT(中断)设置了处理方式SIG_IGN(忽略),那么ctrl-c就不再能如常退出这个进程(程序)了。
(tips:还可通过CTRL-\发出SIGQUIT信号退出) - SIG_DEF:根据头文件中的默认设置对信号作出反应。
- 函数指针:( 返回值类型为void、有一个int类型参数的函数指针).函数指针指向自定义的函数,也就是说通过这个设置能够对一些信号进行自定义的处理。
信号名是头文件中定义的宏,具体可通过man 7 signal 获知:
注意:为了避免因为错误的设置无法退出某些进程,有两个信号不能被忽略、挂起、阻塞,它们分别是SIGKILL和SIGSTOP.