打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
signal()库函数与kernel实现
signal()库函数与kernel实现
2006-11-13 15:37:10
标签:函数 休闲 职场
sys_signal(int sig, __sighandler_t handler)
{
struct k_sigaction new_sa, old_sa;
int ret;

new_sa.sa.sa_handler = handler;
new_sa.sa.sa_flags = SA_ONESHOT │ SA_NOMASK;
               //SA_ONESHOT :表示信号处理函数一旦执行一次 ,信号就恢复为SIG_DFL
               //SA_NOMASK 表示信号处理程序运行过程中不屏蔽同一个信号

ret = do_sigaction(sig, &new_sa, &old_sa);

return ret ? ret : (unsigned long)old_sa.sa.sa_handler;
}
 
进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
信号可能丢失。
因此,早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。
Linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。
glibc中signal的实现函数:

#include <errno.h>
#include <signal.h>


sigset_t _sigintr;/* Set by siginterrupt.  */

/* Set the handler for the signal SIG to HANDLER,
  returning the old handler, or SIG_ERR on error.  */
__sighandler_t
__bsd_signal (sig, handler)
    int sig;
    __sighandler_t handler;
{
 struct sigaction act, oact;

 /* Check signal extents to protect __sigismember.  */
 if (handler == SIG_ERR ││ sig < 1 ││ sig >= NSIG)
   {
     __set_errno (EINVAL);
     return SIG_ERR;
   }

 act.sa_handler = handler;
 if (__sigemptyset (&act.sa_mask) < 0)
   return SIG_ERR;
 act.sa_flags = __sigismember (&_sigintr, sig) ? 0 : SA_RESTART;
 if (__sigaction (sig, &act, &oact) < 0)
   return SIG_ERR;

 return oact.sa_handler;
}
weak_alias (__bsd_signal, bsd_signal)
weak_alias (__bsd_signal, signal)
weak_alias (__bsd_signal, ssignal)
 
 
一旦对给定的信号设置了一个动作,那么在用sigaction改变它之前,该设置就一直有效。
signal库调用和sys_signal核心调用无关.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
signal函数
详解sigaction
linux信号函数
sigaction()
从kernel原始码的角度分析signal的错误用法和注意事项(zt)
linux c信号相关函数学习记录
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服