我完全不确定AF_UNIX
在您的情况下(在squid
代理内部)避免使用管道(或套接字或命名管道)是否明智。
正如Duck 回答的那样,您可以考虑使用 POSIX 实时信号。
但是信号处理很棘手(而且很脆弱,很难正确处理,也很难可靠地测试)。仔细阅读多次signal(7)并考虑 Linux 特定的signalfd(2) ...
请注意,在信号处理程序内部仅直接或间接使用异步信号安全函数的限制是非常严格的。您甚至不能调用(甚至间接地)(或在许多标准 C++ 容器中经常使用的 C++ 中)或在信号处理程序中调用。您可以考虑在其中设置一些标志。malloc
operator new
fprintf
volatile sig_atomic_t
您可以使用 Linux 特定的eventfd(2)或signalfd(2);您还可以使用在 Linux 上非常有效的 Posix 标准管道(2)(即使您每次写入(2)一个字节)。
请注意,您可以通过从信号处理程序内部将一个字节 -ing 到fd 来在signalfd
Linux 之外的其他 Posix 系统上进行模拟。这是允许的(并由 Qt 文档建议)。write
pipe
您谈到扩展squid代理(也许ICAP可能是相关的)。并且squid
显然有一个非常可靠的事件循环(可能使用poll(2)或其他多路复用),因此这建议相反使用基于文件描述符的东西,如管道eventfd
、、、signalfd
套接字(例如AF_UNIX
,参见unix(7)或带有mkfifo(3)等的命名管道等....)。
并且可以使文件描述符发出信号(使用SIGIO
signal 和fcntl(2) F_SETOWN
和F_SETFL
)。
实际上,在 Squid 中,我认为使用信号是错误的。
AFAIK,Linux 处理文件描述符比处理信号更好更快。
另请阅读高级 Linux 编程....