网站建设相关小论文,seo实战密码第三版pdf,建筑公司图片,手机软件开发工具5 信号捕获
信号的产生是异步事件#xff0c;进程不知道信号何时会递送#xff0c;也不会等待信号到来。 进程可以为信号注册信号处理函数来实现自定义动作。 进程的信号在内核态处理#xff0c;内核为每个进程准备了一个信号向量表#xff0c;记录每个信号所对应的处理机…5 信号捕获
信号的产生是异步事件进程不知道信号何时会递送也不会等待信号到来。 进程可以为信号注册信号处理函数来实现自定义动作。 进程的信号在内核态处理内核为每个进程准备了一个信号向量表记录每个信号所对应的处理机制。如果用户自定义了处理方式则内核会使信号向量表中的指针指向新的信号处理函数。 Linux提供了两个捕获信号的函数
signalsigaction
5.1 signal函数
#include signal.htypedef void(* sighandler_t)(int); //sighandler_t就是一个函数指针指向的函数接受一个整型参数并返回一个无类型指针。加上typedef之后sighandler_t就是一种新的类型就可以像int一样地去用它不同的是它声明是一种函数指针
sighandler_t signal(int signum, sighandler_t handler);函数功能能实现信号屏蔽但其主要功能仍为捕获信号修改信号向量表中该信号的处理函数指针。
参数说明
signum信号编号handler自定义信号处理函数的函数指针。
返回值说明
成功返回先前信号处理函数指针不成功返回SIG_ERR。
【案例1】为2号信号SIGINT设置自定义信号处理函数并在信号处理函数中将信号恢复为默认处理函数。
#include stdio.h
#include stdlib.h
#include unistd.h
#include string.h
#include signal.hvoid sig_int(int paraSigno){ //自定义信号处理函数printf(......catch you, SIGINT\n);signal(SIGINT, SIG_DEL); //信号处理函数执行
}//of sig_intint main(){signal(SIGINT, sig_int); //捕获信号SIGINT修改信号处理函数while(1); //等待信号递达return 0;
}//of main执行后使用组合键CtrlC或kill命令发送信号到当前进程signal(SIGINT, SIG_DEL)恢复为默认处理函数后程序将终止运行。
5.2 sigaction函数
#include signal.hint sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);struct sigaction{void (*sa_handler)(int);void (*sa_sigaction)(int, siginfo_t *, void *);sigset_t sa_mask; //一个用于指定函数执行期间捕获屏蔽信号的位图int sa_flags; //设置是否使用默认值默认情况下函数会屏蔽自己发送的信号避免重新进入函数void (*sa_restorer)(void);
};函数功能与signal相比最大的优点是支持信息传递。
参数说明
signum信号编号act传入参数包含自定义信息处理函数和一些携带的参数oldact传出参数包含旧的信息处理函数等信息。
返回值说明
成功0不成功-1。
【案例2】使用sigaction函数修改2号信号SIGINT的默认动作。
#include stdio.h
#include stdlib.h
#include unistd.h
#include string.h
#include signal.hvoid sig_int(int paraSigno){printf(......catch you, SIGINT, signo %d\n, paraSigno);sleep(5); //模拟信号处理函数执行时间
}//of sig_intint main(){struct sigaction act, oldact;act.sa_handler sig_int; //修改信号处理函数指针sigemptyset(act.sa_mask); //初始化位图表示不屏蔽任何信号sigaddset(act.sa_mask, SIGINT);//更改信号SIGINT的信号处理函数act.sa_flags 0; //设置flags屏蔽自身所发信号sigaction(SIGINT, act, oldact);while(1);return 0;
}//of main执行后使用组合键CtrlC或kill命令发送信号到当前进程观察运行结果。
6 课后编程题
利用所学的信号处理函数实现sleep函数的功能。