为什么信号在代码段中间出现

cymx2002 2010-11-01 09:59:46
APUE上说:

if(intr_flag) /* flag set by our SIGINT handler */
handle_intr(); /* flag set by our SIGALRM handler */
if(alrm_falg)
handle_alrm();
/* signals occurring in here are lost */
while(select(...) < 0) {
if(errno == EINTR) {
if(alrm_falg)
handle_alrm();
else if(intr_flag)
handle_intr();
} else
/* some other error */
}


/* signals occurring in here are lost */

上述代码中标红色的地方,我不理解。
为什么信号会在代码段中间发生?如何理解
linux信号到底是怎么执行的,怎么通知进程的?

希望前辈们赐教

小弟谢过
...全文
143 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
充电宝111 2010-11-03
  • 打赏
  • 举报
回复
实现机制当然不是一两句话能说清的,大概就是任务控制块里面有个flag,每次系统调用返回到用户空间之前都要检查,如果有信号就要设置这个flag,然后好像通过修改堆栈的方法执行你的信号处理函数,很复杂总之~
mengzhiyi 2010-11-02
  • 打赏
  • 举报
回复
信号类似于中断,或者说是软件中断,它随时都可能发生。信号处理函数最好是可重入的(在信号处理函数执行时也可能有信号产生),否则,死锁啊什么莫名奇妙的现象都有可能发生。。。
cymx2002 2010-11-02
  • 打赏
  • 举报
回复
说白了,其实我是想知道信号的实现机制。
justkk 2010-11-02
  • 打赏
  • 举报
回复
信号可能随时发生,睡眠时、执行指令时、等待被调度时 ..
cymx2002 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jianmin09 的回复:]
建议看下linux源代码树下的信号量的接口函数。
[/Quote]
大侠可以说得再明确点吗?谢谢
louyong0571 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mengzhiyi 的回复:]
信号类似于中断,或者说是软件中断,它随时都可能发生。信号处理函数最好是可重入的(在信号处理函数执行时也可能有信号产生),否则,死锁啊什么莫名奇妙的现象都有可能发生。。。
[/Quote]
++
justkk 2010-11-01
  • 打赏
  • 举报
回复
信号是异步的,随时都可能发生..
cymx2002 2010-11-01
  • 打赏
  • 举报
回复
自己先顶一个吧,不能让帖子沉了
jianmin09 2010-11-01
  • 打赏
  • 举报
回复
建议看下linux源代码树下的信号量的接口函数。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧