signal 函数

2014-08-13 21:35:19   最后更新: 2014-08-13 21:35:19   访问数量:1067




UNIX 系统信号机制最简单的接口是 signal 函数,定义于 signal.h 头文件中

void (*signal(int signo, void (*func)(int)))(int);

 

调用成功返回信号以前的处理配置,出错返回 SIG_ERR

 

signal 函数是由 ISO C 定义的,不涉及多进程、进程组以及终端IO等,所以他对信号的定义非常含糊,所以对UNIX而言几乎毫无用处

因为 signal 的语义与具体实现有关,所以不建议使用

 

signo 参数是信号名,func 的值是常量 SIG_IGN(忽略信号)、SIG_DFL(执行系统默认信号)或当接到此信号后要调用的函数的地址

用指定函数处理信号称为“捕捉”该信号,此函数称为“信号处理函数”或“信号捕捉函数”

 

下面的程序展示了捕捉UNIX用户定义信号 SIGUSR1 和 SIGUSR2

#include "../apue.2e/include/apue.h" static void sig_usr(int); int main () { if (signal (SIGUSR1, sig_usr) == SIG_ERR) err_sys ("can't catch SIGUSR1"); if (signal (SIGUSR2, sig_usr) == SIG_ERR) err_sys ("can't catch SIGUSR2"); while (1) pause(); } static void sig_usr (int signo) { if (signo == SIGUSR1) printf ("received SIGUSR1\n"); else if (signo == SIGUSR2) printf ("received SIGUSR2\n"); else err_dump ("received signal %d\n", signo); }

 

输出结果如下图所示:

 

 

下面的代码让进程忽略中断键,这样在程序运行过程中,即使按下中断键,也不会影响到程序的继续运行

void sig_int(int), sig_quit(int); if (signal (SIGINT, SIG_IGN) != SIG_IGN) signal (SIGINT, sig_int); if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) signal (SIGQUIT, sig_quit);

 

 

从上面的例子可以看出,signal 函数最大的缺点是如果想要获取一个信号的当前处理方式,则必须首先改变他的处理方式

 






读书笔记      技术帖      c语言      龙潭书斋      apue      unix环境高级编程      signal      信号     


京ICP备15018585号