分类: LINUX
2011-04-12 14:08:45
010_信号
信号是软中断,UNIX和Linux系统响应某些条件而产生的一个事件。
大多数的信号都可使用这中方式处理,但是有两种型号却却不能被忽略,SIGKILL和SIGSTOP。
为了做到这一点要通知内核在某种信号发生时,调用一个用户函数,在用户函数中,可执行用户希望对这种时间进行的处理。
对于大多数信号的系统默认动作是终止该进程。
函数
Void (*signal(int sig, void (*handler)(int))) (int);
这个函数的声明很是吓人,下面解释一下:
Int (*p)();
这是一个函数指针,p所指向的函数是一个不带任何参数,并且返回值为int的一个函数。
Int (*func()) ();
这个式子与上面式子的区别在于用func()代替了p,而func()是一个函数,所以说就可以看成是func()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数。
所以说对于void (*signal(int signo, void (*handler)(int)))(int)就可以看成是signal()函数它自己是带两个参数,一个为整型,一个为函数指针的函数,而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带有一个整型参数,并且返回值为void的一个函数。
而你在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的。
注意,void (*signal())(int)
Signal是一个函数它返回一个函数指针,返回的函数指针所指向的函数有一个整型参数而且没有返回值,仔细看,是不是signal(int signo, void (handler(int))的第二个参数了,对了,其实它所返回的就是signal的第二个信号处理函数,指向性好处理函数,就可以指向函数了(signal内部时,signal把信号作为参数传递给handler信号处理函数,接着signal函数返回指针,并且又指向信号处理函数,就开始执行它)。
对于这个问题,在
参考:http://blogold.chinaunix.net/u3/97319/showart_2125317.html
3.2 程序启动当执行一个程序时,所有信号的状态都是系统默认或忽略。
但是,当一个进程调用fork时,其紫禁城继承了父进程的信号处理方式。因为子进程在开始时复制了父进程存储图像,所以信号捕捉函数的地址在紫禁城中式有意义的。
4 可再入函数进程捕捉到信号并继续执行时,它首先指向该信号处理程序中的指令。如果从信号处理程序返回(例如没有掉有exit或longjmp),则继续执行在捕捉到信号时进程正在执行的正常指令序列。
5 Sigaction函数
Sigaction函数的功能是检查或修改(或两者)与制定信号相关联的处理动作。此函数取代了UNIX早期版本使用的signal函数。
Sigaction是比signal更健壮的接口。
int sigaction(int signo, const struct sigaction *act, struct sigaction *oact);
sigaction函数设置与信号sig关联的动作。如果oact不是空指针,sigaction将把原先对该信号的动作写到它指向的位置。
必须用sigemptyset函数初始化act结构的成员。
信号屏蔽字是指当前被阻塞的一组信号,他们不能被当前进程接收到。
水平有限,如果有错误的地方,请指正,thanks
cjok.liao@gmail.com