相关博客
Linux下的信号(一)
http://blog.csdn.net/double_happiness/article/details/72848372
信号的四种产生方式
(一)通过键盘上的某些组合键完成
(二)由硬件产生信号
****前面两种在上一篇中已经详细介绍过了,再次就不在叙述
(三)调用相应的函数实现
1)调用kill函数
#include
#include
int kill(pid_t pid, int sig);
功能:一个进程调用kill(2)函数可以发送信号给另一个进程;如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作是终止进程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)执行完毕从内核态返回用户态时,到达主流程当时中断或者异常处继续执行。
图示表示
sigaction
#include
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
参数说明:
signum:指定信号的编号
act:若指针非空,根据act修改该信号的处理动作
cldact:若指针非空,通过oldact传出原来的处理动作
sigaction结构体
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