手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

[转载]Linux的信号机制

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

sigaddset(sigset_t *set, int signum)在set指向的信号集中加入signum信号;
sigdelset(sigset_t *set, int signum)在set指向的信号集中删除signum信号;
sigismember(const sigset_t *set, int signum)判定信号signum是否在set指向的信号集中。
七、信号阻塞和信号未决:
每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的任何信号在递送到进程后都将被阻塞。下面是和信号阻塞相关的几个函数:

#include
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset));
int sigpending(sigset_t *set));
int sigsuspend(const sigset_t *mask));
sigprocmask()函数能够根据参数how来实现对信号集的操作,操作主要有三种:
参数how 进程当前信号集
SIG_BLOCK 在进程当前阻塞信号集中添加set指向信号集中的信号
SIG_UNBLOCK 假如进程阻塞信号集中包含set指向信号集中的信号,则解除对该信号的阻塞
SIG_SETMASK 更新进程阻塞信号集为set指向的信号集
sigpending(sigset_t *set))获得当前已递送到进程,却被阻塞的任何信号,在set指向的信号集中返回结果。
sigsuspend(const sigset_t *mask))用于在接收到某个信号之前, 临时用mask替换进程的信号掩码, 并暂停进程执行,直到收到信号为止。sigsuspend 返回后将恢复调用之前的信号掩码。信号处理函数完成后,进程将继续执行。该系统调用始终返回-1,并将errno配置为EINTR。
附录1:结构itimerval:

struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
附录2:三参数信号处理函数中第二个参数的说明性描述:

siginfo_t {
int si_signo; /* 信号值,对任何信号有意义*/
int si_errno; /* errno值,对任何信号有意义*/
int si_code; /* 信号产生的原因,对任何信号有意义*/
pid_t si_pid; /* 发送信号的进程ID,对kill(2),实时信号连同SIGCHLD有意义 */
user_id_t si_uid; /* 发送信号进程的真实用户ID,对kill(2),实时信号连同SIGCHLD有意义 */
int si_status; /* 退出状态,对SIGCHLD有意义*/
clock_t si_utime; /* 用户消耗的时间,对SIGCHLD有意义 */
clock_t si_stime; /* 内核消耗的时间,对SIGCHLD有意义 */
sigval_t si_value; /* 信号值,对任何实时有意义,是个联合数据结构,能够为一个整数(由si_int标示,也能够为一个指针,由si_ptr标示)*/

void * si_addr; /* 触发fault的内存地址,对SIGILL,SIGFPE,SIGSEGV,SIGBUS 信号有意义*/
int si_band; /* 对SIGPOLL信号有意义 */
int si_fd; /* 对SIGPOLL信号有意义 */
}
实际上,除了前三个元素外,其他元素组织在一个联合结构中,在联合数据结构中,又根据不同的信号组织成不同的结构。注释中提到的对某种信号有意义指的是,在该信号的处理函数中能够访问这些域来获得和信号相关的有意义的信息,只但是特定信号只对特定信息感兴趣而已。
参考文献:
1. linux内核源代码情景分析(上),毛德操、胡希明著,浙江大学出版社,当要验证某个结论、想法时,最好的参考资料;
2. UNIX环境高级编程,作者:W.Richard Stevens,译者:尤晋元等,机械工业出版社。对信号机制的发展过程阐述的比较周详。
3. signal、sigaction、kill等手册,最直接而可靠的参考资料。
4. http://www.linuxjournal.com/modules.php?op=modload&name=NS-help&file=man提供了许多系统调用、库函数等的在线指南。
5. http://www.opengroup.org/onlinepubs/007904975/能够在这里对许多关键函数(包括系统调用)进行查询,很好的一个网址。
6. http://unix.org/whitepapers/reentrant.html对函数可重入进行了阐述。
7. http://www.uccs.edu/~compsvcs/doc-cdrom/DOCS/HTML/APS33DTE/DOCU_006.HTM对实时信号给出了相当好的描述。
关于作者:
郑彦兴,国防科大攻读博士学位。联系方式: mlinux@163.com



郑彦兴 (mlinux@163.com)
2003 年 01 月
在信号(上)中,讨论了linux信号种类、来源、如何安装一个信号连同对信号集的操作。本部分则首先讨论从信号的生命周期上认识信号,或宏观 上看似简单的信号机制(进程收到信号后,作相应的处理,看上去再简单但是了),在微观上究竟是如何实现的,也是在更深层次上理解信号。接下来还讨论了信号 编程的一些注意事项,最后给出了信号编程的一些实例。
一、信号生命周期
从信号发送到信号处理函数的执行完毕
对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,能够分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔构成信号生命周期的一个阶段。

下面阐述四个事件的实际意义:
1. 信号"诞生"。信号的诞生指的是触发信号的事件发生(如检测到硬件异常、定时器超时连同调用信号发送函数kill()或sigqueue()等)。
2. 信号在目标进程中"注册";进程的task_struct结构中有关于本进程中未决信号的数据成员:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!