c - 谁使用 POSIX 实时信号,为什么?

标签 c linux embedded signals posix

我没有被轻视,我真的不明白。我刚刚阅读了一大堆关于它们的 Material ,但我无法弄清楚用例。我并不是在谈论 API,因为 API 相对于 signal() 之类的东西的优势已经足够明显了。相反,RT 信号似乎是用户空间生成的,但目的是什么?唯一的用途似乎是一个原始的 IPC,但一切都表明它们是一种糟糕的 IPC 形式(例如笨拙、信息有限、效率不高等)。

那么它们在哪里以及如何使用?

最佳答案

首先,请注意本的回答是正确的。据我所知,POSIX 中实时信号的全部目的是作为 AIO、消息队列通知、计时器到期和应用程序定义的信号(内部和进程间)的实时传递机制。

话虽如此,信号通常是一种非常糟糕的做事方式:

  • 信号处理程序是异步的,除非您确保它们不会中断异步信号不安全的函数,否则它们只能使用异步信号安全的函数,这严重限制了它们的功能。
  • 信号处理程序是全局状态。一个库不能在没有与调用程序签订契约(Contract)的情况下使用信号,关于它允许使用哪些信号,是否允许它们中断系统调用等等。一般来说,全局状态只是一件坏事 .
  • 如果您使用 sigwait(或 Linux signalfd 扩展)而不是信号处理程序来处理信号,它们并不比其他 IPC/通知机制好,而且仍有可能更糟。

通过忽略设计不当的 POSIX AIO API 并仅创建一个线程来执行正常的阻塞 IO 并在操作时调用 pthread_cond_signalsem_post 可以更好地实现异步 IO完成。或者,如果你能负担得起一点性能成本,你甚至可以通过管道或套接字对将刚刚读取的数据转发回自己,并让主线程处理异步读取常规文件 selectpoll 就像 sockets/pipes/ttys 一样。

关于c - 谁使用 POSIX 实时信号,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6345973/

相关文章:

ruby - 从 Ruby 脚本运行 Linux 系统命令

linux - 嵌入式 linux 中的 busybox 显示 "applet not found"

C 嵌入式自动单元测试生成

caching - 尝试刷新 PowerPC 750 数据缓存

检查 C 中是否有可变参数

c - fread 无法读取无符号整数? [C]

c++ - 动态分配数组时出现奇怪的段错误

c - 在 C 中是一个查找表,替代 bash||php 中的变量

linux - 如何检查启动时是否调用了 init 脚本?

linux - 如何从同一个父进程中 fork 多个进程?