我正在考虑信号处理程序和主程序之间的通信方式。请注意,我主要使用非阻塞信号(即使执行信号处理程序,新信号也可以到达),因此我正在寻找无锁解决方案。
我目前的想法是这样的:
socketpair(...)
在安装信号处理程序之前创建一个Yet(使用sigaction(...)
)。- 信号处理程序将我需要执行的所有操作发送到该套接字对的文件描述符中。
- 主进程轮询来自其他文件描述符的传入数据,并根据需要进行处理。
当然,我计划设置一个相当高的内部缓冲区大小(带有setSockOptInt(SOL_SOCKET, SO_SNDBUF, size);
),并在溢出时正确终止程序(send(...)
在信号处理程序中返回一些...不可行。
我认为,它可能会违反一些 Posix.* 标准,因为它们非常严格地限制信号安全的 libc 函数。然而,据我所知,写入套接字是原子的(如果我使用send()
数据报套接字,我几乎 100% 确定情况就是如此)。
这是对的吗?能行吗?
答案1
有关信号上下文中安全的函数列表,请查看man 7 signal-safety
。从该页面:
The set of functions required to be async-signal-safe by POSIX.1 is shown in the following table. The functions not otherwise noted were required to be async-signal-safe in POSIX.1-2001; the table details changes in the subsequent standards. Function Notes ... send(2) sendmsg(2) sendto(2) ... write(2)
因此,在与套接字关联的文件描述符(或与此相关的任何文件描述符)上使用send()
或是信号安全的。write()