第六十四章、信号的注册调用

前几章我们简单了解了信号,这一章我们来了解下信号的注册调用。

我们如果想要进程捕获某个信号,然后作出相应的处理,就需要注册信号处理函数。当进程为某个信号注册了信号处理程序后,发生该信号时,内核就会调用注册的函数。

我们来看一个注册信号处理函数的系统调用:

typedef void (*__sighandler_t) (int);

__sighandler_t signal (int __sig, __sighandler_t __handler)

我们先来看第一条语句,这条语句我们先盖住 typedef不看 ,sighandler_t就是一个函数指针,指向的函数接受一个整型参数并返回一个无类型指针 。加上typedef之后sighandler_t就是一种新的类型,就可以像int一样地去用它,不同的是它声明是一种函数指针,这种指针指向的函数接受一个整型参数并返回一个无类型指针 ;

我们了解了上面这条语句,那么我们在来看下面这条语句,sig表示所注册函数针对的信号,handler就是一个函数指针,它指定收到信号后进程所应采取的行动,这便是信号处理函数,这个信号处理函数可能是用户自定义的一个函数,或是下面的两个值:SIG_IGN和SIG_DFL。SIG_IGN表示忽略sig所指出的信号,SIG_DFL表示调用系统定义的默认处理,信号处理函数的参数是要处理的信号的信号值。

当程序执行signal后,表示自此参数1的信号将受到参数2的函数的管制。

注意:并非是程序执行到signal这一行就立即会对该信号做什么操作,因为信号的产生是无法预期的,程序设计人员根本没法预知该在哪一行捕捉突如其来的信号。用singnal设置信号处理函数只是告诉系统对这个信号用什么程序来处理。

我们来看一个简单的例子:

第六十四章、信号的注册调用

这个程序很简单,作用时读入字符,并将其中的小写字母转换成大写字母,在这个程序中注册了针对信号SIGTERM的处理函数,在运行这个程序时,当在终端中用kill终止这个进程时,向程序发送一个SIGTERM信号,则转向信号处理函数的调用,输出一条信息后结束。


分享到:


相關文章: