linux进程通信 信号 alarm()的使用,致命不懂! 求高手解惑!

linux进程通信 信号 alarm()的使用,致命不懂! 求高手解惑!,第1张

一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。需要注意的是,经过指定的秒数后,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一些时间。

有些人吧,一点就透,之后与一反三...你这种思维,就按你标题来讲,确实致命.....自己去悟吧 我懒得跟思维懒惰的人解释什么.....

默认情况下,收到信号后,被阻塞的系统调用(read) 会直接返回-1,同时 errno 被置成 EINTR 。这个error对应的错误信息应该类似于 " Interrupted system call"

但是很不幸,在linux上,你的代码是看不到这个现象的,因为你使用 signal() 来注册信号处理,它会把 SA_RESTART 打开,这个会导致read系统调用不返回,而是重新开始执行read *** 作 (这些重新执行的动作都是发生在内核,用户代码是看不到的),所以你的代码在alarm信号发生后,仍然会继续read。

如果要看到read被中断的情况,你必须使用 sigaction 这个借口来注册信号处理,

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)

把第二个参数 act 的成员 sa_flags 置零 (确保没有打开 SA_RESTART),你就能看到read被中断的现象了。

建议你阅读一下 Advanced Programming in the Unix Environment 这本书中关于信号相关的内容。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7123423.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-01
下一篇2023-04-01

发表评论

登录后才能评论

评论列表(0条)

    保存