Linux下的信号(二)

相关博客

Linux下的信号(一)

http://blog.csdn.net/double_happiness/article/details/72848372


信号的四种产生方式


(一)通过键盘上的某些组合键完成

(二)由硬件产生信号

****前面两种在上一篇中已经详细介绍过了,再次就不在叙述

(三)调用相应的函数实现


1)调用kill函数

#include 
#include 
int kill(pid_t pid, int sig);
功能:一个进程调用kill(2)函数可以发送信号给另一个进程;如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作是终止进程
返回值:成功返回0,失败返回-1


2)使用raise函数

 #include 
 int raise(int sig);
功能:每隔一段时间,自己给自己发送一个信号

返回值:成功返回0,失败返回-1;


3)调用abort函数

#include 
void abort(void);
功能:终止一个进程,可以被捕获,但必须被终止

返回值:这个返回值比较特殊,就像我们前面在进程替换中学习的exec函数族一样,只有出错返回值,没有成功返回值。


*****几个函数的比较


1)kill和raise函数的区别


kill:可以给任意进程发送任意信号

raise:只能给自己发送任意信号


(2)exit和abort函数的区别


exit:正常退出

abort:异常退出


(四)由软件条件产生信号

#include 
unsigned int alarm(unsigned int seconds)
功能:设置一个闹钟,参数为闹钟的秒数

返回值:返回值为闹钟的剩余时间


阻塞信号

http://blog.csdn.net/double_happiness/article/details/72897592


信号捕捉


信号捕捉的时机:从系统态切换回用户态的时候


信号捕捉流程


1)主流程因为指令中断或异常转而进入内核态,处理完返回用户态时,先处理当前进程中可以递送的信号;

2)若信号的处理动作是自定义的转而去执行自定义动作流程;

3)自定义函数处理完毕返回时,再次进入内核态;

4)执行完毕从内核态返回用户态时,到达主流程当时中断或者异常处继续执行。


图示表示


Linux下的信号(二)_第1张图片


sigaction


#include 
int sigaction(int signum, const struct sigaction *act,   struct sigaction *oldact);

功能:读取和修改与指定信号相关联的处理动作


参数说明:

signum:指定信号的编号

act:若指针非空,根据act修改该信号的处理动作

cldact:若指针非空,通过oldact传出原来的处理动作


sigaction结构体


Linux下的信号(二)_第2张图片


结构体成员变量说明:

sa_handler:赋值为常数SIG_IGN传给sigaction表示忽略信号;赋值为常数SIG_DFL表示执行系统默认动作,赋值为一个函数指针表示用自定义函数捕捉信号。 向内核注册了一个信号处理函数,该函数返回值为void,可以带一个int参数,通过参数可以得知当前信号的编号,这样就可以用同一个函数处理多种信号。显然,这也是一个回调函数,不是被main函数调用,而是被系统所调用。

sa_mask:进程的信号屏蔽字。如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。

sa_flags:sa_flags字段包含一些选项,本文代码把sa_flags设为0。

sa_sigaction是实时信号的处理函数。


可重入函数

http://blog.csdn.net/double_happiness/article/details/72877112


pause与竟态条件

http://blog.csdn.net/double_happiness/article/details/72900010


SIGCHLD信号

http://blog.csdn.net/double_happiness/article/details/72900014

你可能感兴趣的:(Linux)