我没有被翻转我真的不明白。我刚读了一大堆关于它们的材料,我无法弄清楚用例。我并不是在谈论如此多的关于API的问题,因为它比signal()这样的优点足够清晰。相反,似乎RT信号是用户空间生成但是到底是什么?唯一的用途似乎是原始的IPC,但一切都指向它们是一种糟糕的IPC形式(例如笨拙,有限的信息,不是特别有效等)。
那么它们在何处以及如何使用?
答案 0 :(得分:19)
首先,请注意Ben的答案是正确的。据我所知,POSIX中实时信号的整个目的是作为AIO的实时传送机制,消息队列通知,定时器到期和应用程序定义的信号(内部和进程间)。
话虽如此,信号通常是一种非常糟糕的做事方式:
sigwait
(或Linux signalfd
扩展名)而不是信号处理程序来处理信号,那么它们并不比其他IPC /通知机制更好,但仍然可能更糟。通过忽略设计不合理的POSIX AIO API并创建一个线程来执行正常的阻塞IO并在操作完成时调用pthread_cond_signal
或sem_post
,可以更好地实现异步IO。或者,如果您可以承受一点性能成本,您甚至可以通过管道或套接字将正确读取的数据转发给自己,并使主线程进程异步 - 使用select
或{读取常规文件{1}}就像你插座/管道/ ttys一样。
答案 1 :(得分:15)
答案 2 :(得分:1)
使用实时信号还有其他原因。我有一个与各种外部设备交互的应用程序,并通过多种方式组合(串行端口IO,甚至直接寻址比你知道的大多数人更老的一些卡)。根据定义,这是一个“实时”应用程序 - 它在现实世界中与现实世界交互,而不是在“计算机时间”。
它所做的大部分工作是在主循环中的守护进程:处理事件,读取信息,将结果写入串行端口,将数据存储在数据库中等等,然后循环播放另一个事件。机器上的其他进程(用户进程)从DB读取信息,显示它,等等。这些其他进程中的用户可以向守护进程发送各种信号,以向其发出各种条件的警报:停止,更改输入数据等。例如,用户进程发送“停止”信号,守护进程的信号处理程序例程有大约2行代码,设置一个标志变量。当守护进程获得机会时,它很方便,它会停止。 “中断”代码非常简单,快速且无创。但它有助于实现目的,不需要复杂的IPC结构,并且工作得很好。
所以,是的,有这些信号的原因。在实时应用程序中。如果处理得当,它们工作正常,谢谢。
答案 3 :(得分:0)
这是一个古老的问题,但仍然如此。
Linux中的glibc(NPTL)中的 POSIX线程是使用两个实时信号实现的。对用户隐藏了它们(通过调整最小/最大数字常量)。所有必须将库调用传播到所有线程的事件(例如setuid
)都是通过以下事件来完成的:调用线程向所有线程发送信号以应用更改,等待确认并继续。