当前位置: 技术问答>linux和unix
超级菜鸟问题,请BS我吧!
来源: 互联网 发布时间:2015-09-11
本文导语: UNIX下signal函数是干嘛用的,我似懂非懂的!相关资料、代码和说明,一律重谢 | 你首先要了解信号本身。 当内核管理进程时检查到某种事件发生,而必须要通知进程时,就发送一个信号给进程...
UNIX下signal函数是干嘛用的,我似懂非懂的!相关资料、代码和说明,一律重谢
|
你首先要了解信号本身。
当内核管理进程时检查到某种事件发生,而必须要通知进程时,就发送一个信号给进程,unix的信号有31个(历史原因,内核一直使用一个32位整数的每一位表示该进程的最后收到的每一种信号,也意味着unix只保存每一种信号的最后一次发生),linux也相同,而当一个进程接受到信号时的默认处理,根据信号的不同而不同,31个信号当中有除了10个之外,其他的默认动作都是终止进程。unix被设计为程序员可以安装自己的信号处理函数,最早的出现在SVR V(包括solaris)上边提供了signal来安装信号处理函数,并且是"不可靠信号处理",所谓"不可靠信号处理"就是:1.被安装的信号处理函数在信号发生,被调用之后会立刻卸载,也就是只起一次作用(如果想要保持安装,就要在信号处理函数里再次调用signal进行安装)。2.在该次调用退出之前,不阻挡这个信号本身再次进入。BSD4.2的signal函数提供了"可靠的信号处理":1.信号处理函数不会被复位。2.信号处理返回之前其他信号会被挂起。Linux的signal系统调用执行了标准的SVR V的信号行为,即不可靠的,如果编译时包含了-I/usr/include/bsd头文件及-lbsd的连接开关时会让程序有BSD的可靠信号行为。而且signal后来被作为了ANSI C标准系统调用,但很明显他的缺点是在不同的平台表现了不同的信号处理行为。给可移植性到来了麻烦。
POSIX标准添加了sigaction系统调用来安装信号处理函数,现在不管在哪个平台,sigaction函数允许指定一个标志和一个掩码,它们用来控制安装的信号处理方式"可靠的"或不可靠的,并且拥有了更多对信号处理的控制。
当内核管理进程时检查到某种事件发生,而必须要通知进程时,就发送一个信号给进程,unix的信号有31个(历史原因,内核一直使用一个32位整数的每一位表示该进程的最后收到的每一种信号,也意味着unix只保存每一种信号的最后一次发生),linux也相同,而当一个进程接受到信号时的默认处理,根据信号的不同而不同,31个信号当中有除了10个之外,其他的默认动作都是终止进程。unix被设计为程序员可以安装自己的信号处理函数,最早的出现在SVR V(包括solaris)上边提供了signal来安装信号处理函数,并且是"不可靠信号处理",所谓"不可靠信号处理"就是:1.被安装的信号处理函数在信号发生,被调用之后会立刻卸载,也就是只起一次作用(如果想要保持安装,就要在信号处理函数里再次调用signal进行安装)。2.在该次调用退出之前,不阻挡这个信号本身再次进入。BSD4.2的signal函数提供了"可靠的信号处理":1.信号处理函数不会被复位。2.信号处理返回之前其他信号会被挂起。Linux的signal系统调用执行了标准的SVR V的信号行为,即不可靠的,如果编译时包含了-I/usr/include/bsd头文件及-lbsd的连接开关时会让程序有BSD的可靠信号行为。而且signal后来被作为了ANSI C标准系统调用,但很明显他的缺点是在不同的平台表现了不同的信号处理行为。给可移植性到来了麻烦。
POSIX标准添加了sigaction系统调用来安装信号处理函数,现在不管在哪个平台,sigaction函数允许指定一个标志和一个掩码,它们用来控制安装的信号处理方式"可靠的"或不可靠的,并且拥有了更多对信号处理的控制。
|
相关资料可以查阅,
man 7 signal
man signal
man sigaction.
还有lpg(linux programing guide)网上应该有页面版本的。
alp(advanced linux programing) 网上有pdf版本
solaris内核结构。(这个好像有中文版,不过我觉得还是肯en明白)
man 7 signal
man signal
man sigaction.
还有lpg(linux programing guide)网上应该有页面版本的。
alp(advanced linux programing) 网上有pdf版本
solaris内核结构。(这个好像有中文版,不过我觉得还是肯en明白)