本节介绍 SunOS 中作为与实时处理相关的接口的进程间通信 (Interprocess Communication, IPC) 接口。信号、管道、FIFO、消息队列、共享内存、文件映射和信号量都将在此处介绍。有关对进程间通信有用的库、接口和例程的更多信息,请参见第 7 章。
发送者可以使用 sigqueue(3RT) 将信号与少量信息一起发送至目标进程。
要将待处理信号的后续出现排入队列,目标进程必须为指定的信号设置 SA_SIGINFO 位。请参见 sigaction(2) 手册页。
目标进程通常异步接收信号。要同步接收信号,请阻塞信号并调用 sigwaitinfo(3RT) 或 sigtimedwait(3RT)。请参见 sigprocmask(2) 手册页。此过程会导致同步接收信号。sigqueue(3RT) 的调用者发送的值存储在 siginfo_t 参数的 si_value 成员中。使信号保持解除阻塞状态会导致将信号传送至 sigaction(2) 指定的信号处理程序,并在该处理程序的 siginfo_t 参数的 si_value 中显示值。
具有关联值的指定数量的信号可以通过进程发送,也可以保持不传送。{SIGQUEUE_MAX} 信号的存储在首次调用 sigqueue(3RT) 时分配。随后,sigqueue(3RT) 的调用要么成功排入目标进程的队列,要么在限制的时间内失败。
管道、命名管道和消息队列的行为类似于字符 I/O 设备。这些接口具有不同的连接方法。有关管道的更多信息,请参见进程之间的管道。有关命名管道的更多信息,请参见命名管道。有关消息队列的更多信息,请参见System V 消息和POSIX 消息。
信号量还以 System V 和 POSIX 形式提供。有关更多信息,请参见System V 信号量和POSIX 信号量。
请注意,使用信号量可能会导致优先级倒置,除非通过本章前面所述的技术明确避免优先级倒置。
进程通信的最快方式是直接通过共享内存段。当超过两个进程尝试同时读取和写入共享内存时,内存内容可能变得不准确。这种潜在的不准确性是使用共享内存的主要困难。