信号捕捉 :如果信号的处理动作是用户自定义函数 ,在信号递达时就调用这个函数的种种行为。
/*************************************************************************************************************/
一、sigaction 函数(功能与 signal()函数功能一样,都是捕捉信号)
sigaction函数可以读取和修改与指定信号相关联的处理动作。调用成功则返回 0,出错则返回- 1。
#include <signal.h>
int sigaction(int signo, const struct sigaction *act, struct,sigaction *oact);
参数意义:
signo是指定信号的编号。
若act指针非空,则根据act修改该信号的处理动作。
若oact指针非 空 ,则通过 oact传出该信号原来的处理动作。
act和oact指向sigaction结构体:
(1)sa_handler参数:
1、sa_handler赋值为常数 SIG_IGN传给sigaction 表示忽略信号 ,
2、赋值为常数SIG_DFL表示执行系统默认动作 ,
3、赋值一个函数指针表示用自定义函数捕捉信号(信号处理函数是一个回调函数 ,不是被 main函数调用 ,而是被系
统所调用)
(2)sa_mask字段说明这些需要额外屏蔽的信号 ,当信号处理函数返回时自动恢复原来的信号屏蔽字。
(3)sa_flags字段包含一些选项,本章的代码都把 sa_flags设为 0
(4)sa_sigaction是实时信号的处理函 数;
应用举例:当在程序运行的过程中,按Ctrl+C,将不再是结束进程,而是执行自定义的handler函数)
/*************************************************************************************************************/
二、pause函数
#include <unistd.h>
int pause(void);
pause函数使调用进程挂起直到有信号递达。
如果信号的处理动作是终止进程,则进程终止,pause 函数没有机会返回 ;
如果信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回 、
如果信号的处理动作是捕捉,则调用了信号处理函数之后pause返回-1,errno设置为EINTR(EINTR表 示信号被中断)
所以pause只有出错的返回值(想想以前还学过什么函数只有出错返回值?)。
/*************************************************************************************************************/
三、利用 pause 函数与 alarm 函数实现与sleep()函数功能相同的函数 mysleep
(1)把宏 SIGALRM 的处理动作设置为自定义的 handler 函数后,再调用 alarm 函数,等过了seconds
秒后,就不再是终止进程;
(2)由于是对于自定义函数,所以 pause 返回-1,继续向下执行,取消闹钟,恢复SIGALRM信号的
默认处理动作。
/*************************************************************************************************************/
/*************************************************************************************************************/