我没有被轻视,我真的不明白。我刚刚阅读了一大堆关于它们的 Material ,但我无法弄清楚用例。我并不是在谈论 API,因为 API 相对于 signal() 之类的东西的优势已经足够明显了。相反,RT 信号似乎是用户空间生成的,但目的是什么?唯一的用途似乎是一个原始的 IPC,但一切都表明它们是一种糟糕的 IPC 形式(例如笨拙、信息有限、效率不高等)。
那么它们在哪里以及如何使用?
最佳答案
首先,请注意本的回答是正确的。据我所知,POSIX 中实时信号的全部目的是作为 AIO、消息队列通知、计时器到期和应用程序定义的信号(内部和进程间)的实时传递机制。
话虽如此,信号通常是一种非常糟糕的做事方式:
- 信号处理程序是异步的,除非您确保它们不会中断异步信号不安全的函数,否则它们只能使用异步信号安全的函数,这严重限制了它们的功能。
- 信号处理程序是全局状态。一个库不能在没有与调用程序签订契约(Contract)的情况下使用信号,关于它允许使用哪些信号,是否允许它们中断系统调用等等。一般来说,全局状态只是一件坏事 .
- 如果您使用
sigwait
(或 Linuxsignalfd
扩展)而不是信号处理程序来处理信号,它们并不比其他 IPC/通知机制好,而且仍有可能更糟。
通过忽略设计不当的 POSIX AIO API 并仅创建一个线程来执行正常的阻塞 IO 并在操作时调用 pthread_cond_signal
或 sem_post
可以更好地实现异步 IO完成。或者,如果你能负担得起一点性能成本,你甚至可以通过管道或套接字对将刚刚读取的数据转发回自己,并让主线程处理异步读取常规文件 select
或 poll
就像 sockets/pipes/ttys 一样。
关于c - 谁使用 POSIX 实时信号,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6345973/