进程间通信之:信号
1.信号处理函数
(1)函数说明。
使用signal()函数处理时,只需要指出要处理的信号和处理函数即可。它主要是用于前32种非实时信号的处理,不支持信号传递信息,但是由于使用简单、易于理解,因此也受到很多程序员的欢迎。
Linux还支持一个更健壮、更新的信号处理函数sigaction(),推荐使用该函数。
(2)函数格式。
signal()函数的语法要点如表8.11所示。
表8.11 signal()函数语法要点
所需头文件 | #includesignal.h> | |
函数原型 | void(*signal(intsignum,void(*handler)(int)))(int) | |
函数传入值 | signum:指定信号代码 | |
handler: | SIG_IGN:忽略该信号 | |
SIG_DFL:采用系统默认方式处理信号 | ||
自定义的信号处理函数指针 | ||
函数返回值 | 成功:以前的信号处理配置 | |
出错:-1 |
这里需要对这个函数原型进行说明。这个函数原型有点复杂。可先用如下的typedef进行替换说明:
typedefvoidsign(int);
sign*signal(int,handler*);
可见,首先该函数原型整体指向一个无返回值并且带一个整型参数的函数指针,也就是信号的原始配置函数。接着该原型又带有两个参数,其中的第二个参数可以是用户自定义的信号处理函数的函数指针。
表8.12列举了sigaction()的语法要点。
表8.12 sigaction()函数语法要点
所需头文件 | #includesignal.h> |
函数原型 | intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact) |
函数传入值 | signum:信号代码,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号 |
act:指向结构sigaction的一个实例的指针,指定对特定信号的处理 | |
oldact:保存原来对相应信号的处理 | |
函数返回值 | 成功:0 |
出错:-1 |
这里要说明的是sigaction()函数中第2个和第3个参数用到的sigaction结构。这是一个看似非常复杂的结构,希望读者能够慢慢阅读此段内容。
首先给出了sigaction的定义,如下所示:
structsigaction
{
void(*sa_handler)(intsigno);
sigset_tsa_mask;
intsa_flags;
void(*sa_restore)(void);
}
sa_handler是一个函数指针,指定信号处理函数,这里除可以是用户自定义的处理函数外,还可以为SIG_DFL(采用缺省的处理方式)或SIG_IGN(忽略信号)。它的处理函数只有一个参数,即信号值。
sa_mask是一个信号集,它可以指定在信号处理程序执行过程中哪些信号应当被屏蔽,在调用信号捕获函数之前,该信号集要加入到信号的信号屏蔽字中。
sa_flags中包含了许多标志位,是对信号进行处理的各个选择项。它的常见可选值如表8.13所示。
表8.13 常见信号的含义及其默认操作
选项 | 含义 |
SA_NODEFERSA_NOMASK | 当捕捉到此信号时,在执行其信号捕捉函数时,系统不会自动屏蔽此信号 |
SA_NOCLDSTOP | 进程忽略子进程产生的任何SIGSTOP、SIGTSTP、SIGTTIN和SIGTTOU信号 |
SA_RESTART | 令重启的系统调用起作用 |
SA_ONESHOTSA_RESETHAND | 自定义信号只执行一次,在执行完毕后恢复信号的系统默认动作 |
模拟信号相关文章:什么是模拟信号
linux相关文章:linux教程
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论