Windows下的信号(Signal)

来源:互联网 发布:linux中进程 编辑:程序博客网 时间:2024/05/10 10:58
Windows下的signal,Piaoger一直没有机会用到,今天既然在一个Console程序中碰到了,就很有必要把玩把玩,广搜天下,并做些笔记:


>> Windows下的信号(Signal)

信号是进程在运行过程中,由自身产生或由进程外部发过来的消息。

信号是硬件中断的软件模拟(软中断)。每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD、SIGINT等,它们在系统头文件中<signal.h>定义。

这玩意儿据说Linux也有,但相当不一样,有时间可以zhuangB看看。

>> 信号的来源

信号的生成来自内核,让内核生成信号的请求来自3个地方:用户、内核护着进程。

++ 用户:用户能够通过输入CTRL+c、Ctrl+,或者是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号;

++ 内核:当进程执行出错时,内核会给进程发送一个信号,例如非法段存取(内存访问违规)、浮点数溢出等

++ 进程:一个进程可以通过系统调用kill给另一个进程发送信号,一个进程可以通过信号和另外一个进程进行通信。

由进程的某个操作产生的信号称为同步信号(synchronous signals),例如除0;由用户击键之类的进程外部事件产生的信号叫做异步信号。(asynchronous signals)。


>> 信号的处理

进程接收到信号以后,可以有如下3种选择进行处理:

++ 接收默认处理:接收默认处理的进程通常会导致进程本身消亡。例如连接到终端的进程,用户按下CTRL+c,将导致内核向进程发送一个SIGINT的信号,进程如果不对该信号做特殊的处理,系统将采用默认的方式处理该信号,即终止进程的执行;

++ 忽略信号:进程可以通过代码,显示地忽略某个信号的处理,例如:signal(SIGINT,SIGDEF);但是某些信号是不能被忽略的,

++ 捕捉信号并处理:进程可以事先注册信号处理函数,当接收到信号时,由信号处理函数自动捕捉并且处理信号。

有两个信号既不能被忽略也不能被捕捉,它们是SIGKILL和SIGSTOP。即进程接收到这两个信号后,只能接受系统的默认处理,即终止线程。


>> Windows Signal Types

#include <signal.h>

复制代码
// Ctrl-C handlerstatic int b_ctrl_c = 0;static int b_exit_on_ctrl_c = 0;// Signal types#define SIGINT     2       // interrupt(Ctrl+C中断)#define SIGILL     4       // illegal instruction - invalid function image(非法指令)
#define SIGFPE 8 // floating point exception(浮点异常)
#define SIGSEGV 11 // segment violation(段错误)#define SIGTERM 5 // Software termination signal from kill(Kill发出的软件终止)#define SIGBREAK 21 //Ctrl-Break sequence(Ctrl+Break中断)#define SIGABRT 22 // abnormal termination triggered by abort call(Abort)
复制代码


>> Windows Signal Handling

信号处理函数用于设置信号处理的Handler。

#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);

signal用于设置信号的捕捉函数。signal如果调用成功,返回以前该信号的处理函数的地址,否则返回 SIG_ERR。

++ signum:要捕捉的信号,

++ handler: 函数指针,表示要对该信号进行捕捉的函数,该参数也可以是SIG_DEF(表示交由系统缺省处理,无需理会)或SIG_IGN(表示忽略掉该信号而不做任何处理)。

sighandler_t是信号捕捉函数,由signal函数注册,注册以后,在整个进程运行过程中均有效,并且对不同的信号可以注册同一个信号捕捉函数。唯一的传入参数表示信号值。


>> MSDN上的小例子
这个小例子演示了如何处理Abort信号。

复制代码
// Use signal to attach a signal handler to the abort routine#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <tchar.h>void SignalHandler(int signal){    printf("Application aborting...\n");}int main(){    typedef void (*SignalHandlerPointer)(int);    SignalHandlerPointer previousHandler;    previousHandler = signal(SIGABRT, SignalHandler);        abort();}
复制代码

>> More

据说还有更NB与可靠的sigaction信号处理机制,既然是初来乍到,就留到以后来了解吧。

- Piaoger

0 0
原创粉丝点击