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

Val*_*ron 25 c linux embedded posix signals

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

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

R..*_*R.. 21

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

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

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

异步IO被忽略了设计不当的POSIX AIO API,只是创建线程更好的完成执行正常阻塞的IO和呼叫pthread_cond_signalsem_post在操作完成时.或者,如果您可以承受一点性能成本,您甚至可以通过管道或套接字将正确读取的数据转发给自己,并让主线程进程异步 - 读取常规文件select或者poll像插槽/ 读取一样管道/ ttys中.

  • 虽然我不喜欢POSIX aio几乎和Win32重叠I/O一样多,但它仍然比为每个操作启动一个线程更好.谈论用洗澡水把婴儿扔出去. (3认同)
  • `select`对普通文件没用.它总是表明它们已准备好进行读写.这不是设计缺陷; 即使select只在可以从缓存中立即读取数据时显示它们是可读的(或者当有空闲缓存可用时可写),也会出现竞争条件 - 在返回`select`之后,缓存可用性状态可能会改变并且`read`/`write`可以在内核空间中休眠.当然,一种替代解决方案是`mmap`和`mlock`(和`fallocate`,如果写),你要访问的文件部分,然后使用普通的IO. (3认同)
  • 如果文件位于慢速介质(例如带有划痕的光盘)或NFS上,则正常读取它们可能会导致程序长时间死机.对于从单个线程处理多个客户端的交互式应用程序或服务器,这可能是不可接受的."mmap"和"mlock"在内核空间中休眠的问题可以通过专用线程(甚至是一个单独的进程)来解决(如果共享映射是从一个进程锁定的,它应该总是被交换为映射它的其他过程). (3认同)
  • 不适用于每个操作。对于许多用途,每个文件一个线程就足够了。如果您需要同时对同一个文件进行多个读取器/写入器,则文件的每个“用户”(而不是每次访问)一个线程仍然足够。glibc 的 AIO 实现是这样实现的;它只是将丑陋的 POSIX AIO API 放在其之上,而不是让您自由地创建一个好的 API。 (2认同)

Ben*_*igt 17

异步I/O.

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

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


Lap*_*try 5

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

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