为什么sem_wait
不能用于信号处理程序(特别是每个线程的SIGSEGV信号)?有人能给我一个例子,它会使应用程序崩溃吗?我猜sem_wait
是折返和线程安全,所以这里有什么问题?为什么不是异步安全?sem_wait和信号处理程序
3
A
回答
1
如果应用程序在信号量的值为零时接收到信号,并且接收信号的线程碰巧是应该增加信号量值(sem_post)的那个线程?如果你在信号处理程序中调用sem_wait,这个过程将会死锁,不是吗?
另一个参数当然可以是,如果sem_wait不在async-signal-safe函数列表中,则实现可以自由调用鼻子恶魔。
3
异步安全是比线程安全更严格的要求。您可以使用基元编写线程安全代码,以保护关键部分的全局数据。信号处理程序不能依赖于此。例如,你可能在sem_wait中的关键部分内,同时做一些导致段错误的事情。这会破坏sem_wait的线程安全保护。
1
sem_wait不能在这个原因的信号处理程序使用:
线程A是调用sem_wait上SEM1。线程A完成后,它会发送到sem1。但是,在它完成之前,收到信号并输入处理程序,在sem1上调用sem_wait。由于A是会发布到sem1的,所以处理程序将永远不会返回,并且会产生死锁。这就是为什么永远不要在信号处理程序中等待任何东西。 ASFAIK的问题与死机相关的问题多于崩溃。此外,这违反了信号处理程序的理想目的,即处理外部中断,然后回到您正在做的事情上。
最后,摆脱SIGSEGV而不是处理它不是更好的目标吗?
相关问题
- 1. SIGKILL信号处理程序
- 2. 读信号处理程序
- 3. scanf循环和信号处理程序
- 4. Perl信号处理程序和WIndows
- 5. 线程中的信号处理程序
- 6. C:信号处理和信号灯
- 7. django:模拟post_save信号处理程序?
- 8. 信号处理程序的问题
- 9. Perl 5.10.0信号处理程序问题
- 10. 信号处理程序,蟒蛇
- 11. 信号处理程序似乎工作
- 12. 移植OS-9信号处理程序
- 13. 启用信号处理程序
- 14. 执行默认信号处理程序
- 15. 信号处理程序问题
- 16. 网络程序员的信号处理
- 17. 信号处理 - 异步函数和多线程应用程序,信号栈
- 18. 主/从线程和信号处理
- 19. 多线程信号处理
- 20. 如何编写sigabrt信号的信号处理程序?
- 21. 发送USR2信号后忽略信号处理程序
- 22. 从信号处理程序返回并将信号屏蔽
- 23. Python:Django:信号处理程序和主线程
- 24. 信号处理
- 25. 信号安全使用sem_wait()/ sem_post()
- 26. 旧窗口的信号处理程序被新的窗口信号处理程序取代GTK +
- 27. 信号处理程序的父级和子级的行为
- 28. 使用fork()和信号处理程序c
- 29. 信号处理程序vs虚函数和继承
- 30. Django信号处理程序,监视组和权限的变化?
我建议你添加哪种类型的操作(线程,中断,异常,...)信号量应该保护你。这有很大的不同。 – gnometorule 2011-12-13 17:42:27