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

我不被翻转我真的不明白。 我只是阅读了大量的资料,而我无法弄清楚用例。 我不是在谈论那些关于signal()等优点的API。 相反,似乎RT信号是为了生成用户空间,但到底是什么? 唯一的用处似乎是一个原始的IPC,但一切都指向他们是一个糟糕的forms的IPC(例如,尴尬,有限的信息,并不特别高效等)。

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

Solutions Collecting From Web of "谁使用POSIX实时信号,为什么?"

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

这样说,一般来说,信号是一种非常糟糕的做事方式:

  • 信号处理程序是异步的,除非确保它们不会中断异步信号不安全的功能,否则它们只能使用异步信号安全功能,这实际上削弱了它们可以执行的操作。
  • 信号处理程序是全局状态。 如果没有与调用程序的合约,图书馆就不能使用信号来允许使用哪些信号,是否允许系统调用中断等等。一般来说,全局状态只是一件坏事
  • 如果您使用sigwait (或Linux signalfd扩展)而不是信号处理程序来处理信号,那么它们不会比其他IPC /通知机制更好,而且可能更糟糕。

通过忽略错误设计的POSIX AIO API并创建一个线程来执行正常的阻塞IO,并在操作完成时调用pthread_cond_signalsem_post ,异步IO可以更好地完成。 或者,如果你能承受一点性能成本,甚至可以通过管道或套接字将刚刚读取的数据转发回给自己,并且使主线程进程异步 – 就像使用selectpoll一样读取常规文件插座/管/ ttys中。

异步I / O。

实时信号是内核在I / O操作完成时通知系统的机制。

struct aiocb在异步I / O请求和信号编号之间建立连接。

还有其他原因使用实时信号。 我有一个应用程序,与各种外部设备进行交互,并通过组合方式(串行端口IO,甚至直接寻址比您认识的大多数人更老的卡)来实现。 按照定义,这是一个“实时”应用程序 – 它在现实世界中与真实世界交互,而不是“计算机时间”。

它所做的大部分工作是在一个主循环中的守护进程中:处理事件,读取信息,将结果写入串行端口,将数据存储在数据库中等等,然后循环处理另一个事件。 机器上的其他进程(用户进程)从DB读取信息,显示它等。 这些其他进程中的用户可以向守护进程发送各种信号,以提醒各种情况:停止,更改输入数据等等。 例如,用户进程发送一个“停止”信号,守护进程的信号处理程序有约2行代码,设置一个标志变量。 当守护进程得到一个机会,并且它很方便,它停止。 “中断”代码非常简单,快捷,非侵入性。 但它是为了达到目的,不需要复杂的IPC结构,而且工作得很好。

所以,是的,这些信号是有原因的。 在实时应用程序中。 如果处理得当,他们工作得很好,谢谢。