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

时间:2011-06-14 15:21:09

标签: c linux embedded signals posix

我没有被翻转我真的不明白。我刚读了一大堆关于它们的材料,我无法弄清楚用例。我并不是在谈论如此多的关于API的问题,因为它比signal()这样的优点足够清晰。相反,似乎RT信号是用户空间生成但是到底是什么?唯一的用途似乎是原始的IPC,但一切都指向它们是一种糟糕的IPC形式(例如笨拙,有限的信息,不是特别有效等)。

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

4 个答案:

答案 0 :(得分:19)

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

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

  • 信号处理程序是异步的,除非你确保它们不会中断异步信号不安全的功能,否则它们只能使用异步信号安全功能,这实际上会削弱他们能做的事情。
  • 信号处理程序是全局状态。一个库不能在没有与调用程序签订合同的情况下使用信号来确定它允许使用哪些信号,是否允许它们进行系统调用中断等等。通常,全局状态只是 A Bad Thing
  • 如果您使用sigwait(或Linux signalfd扩展名)而不是信号处理程序来处理信号,那么它们并不比其他IPC /通知机制更好,但仍然可能更糟。

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

答案 1 :(得分:15)

异步I / O.

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

这是一个古老的问题,但仍然如此。

Linux中的glibc(NPTL)中的

POSIX线程是使用两个实时信号实现的。对用户隐藏了它们(通过调整最小/最大数字常量)。所有必须将库调用传播到所有线程的事件(例如setuid)都是通过以下事件来完成的:调用线程向所有线程发送信号以应用更改,等待确认并继续。