Chinaunix首页 | 论坛 | 博客
  • 博客访问: 366641
  • 博文数量: 50
  • 博客积分: 1495
  • 博客等级: 上尉
  • 技术积分: 805
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-21 14:19
文章分类

全部博文(50)

文章存档

2011年(47)

2010年(3)

分类: LINUX

2011-04-12 14:08:45

010_信号 

信号是软中断,UNIXLinux系统响应某些条件而产生的一个事件。

 

大多数的信号都可使用这中方式处理,但是有两种型号却却不能被忽略,SIGKILLSIGSTOP

为了做到这一点要通知内核在某种信号发生时,调用一个用户函数,在用户函数中,可执行用户希望对这种时间进行的处理。

对于大多数信号的系统默认动作是终止该进程。

 

函数 
 

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  可再入函数

进程捕捉到信号并继续执行时,它首先指向该信号处理程序中的指令。如果从信号处理程序返回(例如没有掉有exitlongjmp),则继续执行在捕捉到信号时进程正在执行的正常指令序列。

 

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


阅读(1407) | 评论(0) | 转发(0) |
0

上一篇:Linux C Coding style

下一篇:013_精灵程序

给主人留下些什么吧!~~