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

| 我不是在翻转我真的不明白。我只是阅读了很多有关它们的资料,但无法弄清楚用例。我不是在谈论太多关于API的信息,相对于signal()而言,API的优势很明显。相反,RT信号似乎是要由用户空间生成的,但目的是什么?唯一的用途似乎是原始IPC,但一切都表明它们是IPC的糟糕形式(例如,笨拙,信息有限,效率不高等)。 那么它们在哪里以及如何使用?     
已邀请:
        首先,请注意Ben \'s答案是正确的。据我所知,POSIX中实时信号的全部目的是作为AIO,消息队列通知,计时器到期和应用程序定义的信号(内部和进程间)的实时传递机制。 话虽如此,一般而言,信号是做事的一种非常糟糕的方式: 信号处理程序是异步的,除非您确保它们不会中断异步信号不安全功能,否则它们只能使用异步信号安全功能,这严重限制了它们的功能。 信号处理程序是全局状态。如果没有与调用程序签订允许使用哪个信号,是否允许它们进行系统调用中断的协议,那么一个库就不能使用信号。通常,全局状态只是一件坏事。 如果您使用
sigwait
(或Linux
signalfd
扩展名)而不是信号处理程序来处理信号,则它们并不比其他IPC /通知机制好,并且可能还会更糟。 通过忽略设计不良的POSIX AIO API并仅创建一个线程以执行常规阻塞IO并在操作完成时调用
pthread_cond_signal
sem_post
,可以更好地实现异步IO。或者,如果您可以负担得起一点性能成本,则甚至可以通过管道或套接字对将刚刚读取的数据转发回自己,并让主线程以
select
poll
的方式异步读取常规文件,就像您将套接字/管道/ ttys。     
        异步I / O。 实时信号是内核在I / O操作完成时通知系统的机制。
struct aiocb
在异步I / O请求和信号编号之间建立连接。     
        这是一个老问题,但仍然存在。 Linux中的glibc(NPTL)中的POSIX线程是使用两个实时信号实现的。对用户隐藏了它们(通过调整最小/最大数字常量)。所有必须将库调用传播到所有线程的事件(例如ѭ7)都是通过以下事件完成的:调用线程向所有线程发送信号以应用更改,等待确认并继续。     
        还有其他使用实时信号的原因。我有一个可以与各种外部设备进行交互的应用程序,并且通过多种方式(串行端口IO,甚至直接寻址某些比大多数人都知道的卡直接寻址)来实现。根据定义,这是一个“实时”应用程序-它与现实世界互动,而不是“计算机时间”。 它的大部分工作是在主循环中的守护进程中进行的:处理事件,读取信息,将结果写到串行端口,将内容存储在数据库中等等,然后为另一个事件循环。机器上的其他进程(用户进程)从数据库读取信息,显示信息,等等。这些其他进程中的用户可以向守护程序发送各种信号,以警告它各种条件:停止,更改的输入数据等。例如,用户进程发送一个“ stop”信号,守护程序的信号处理程序例程大约有2行代码,并设置了一个标志变量。当守护程序有机会且很方便时,它将停止。 “中断”代码非常简单,快速且无创。但这达到了目的,不需要复杂的IPC结构,并且工作正常。 因此,是的,有这些信号的原因。实时应用。如果处理得当,它们可以正常工作,谢谢。     

要回复问题请先登录注册