1

Linux just have two user-defined signal, SIGUSER1 and SIGUSER2, but they have been used in squid.

I want to use another user-defined signal to invoke my own handler function in squid, what can I do if I want another user-defined signal. I don't want socket as the way to communicate between processes.

Anyone know how to do?

4

2 回答 2

4

我完全不确定AF_UNIX在您的情况下(在squid代理内部)避免使用管道(或套接字或命名管道)是否明智。

正如Duck 回答的那样,您可以考虑使用 POSIX 实时信号。

但是信号处理很棘手(而且很脆弱,很难正确处理,也很难可靠地测试)。仔细阅读多次signal(7)并考虑 Linux 特定的signalfd(2) ...

请注意,在信号处理程序内部仅直接或间接使用异步信号安全函数的限制是非常严格的。您甚至不能调用(甚至间接地)(或在许多标准 C++ 容器中经常使用的 C++ 中)或在信号处理程序中调用。您可以考虑在其中设置一些标志。mallocoperator newfprintfvolatile sig_atomic_t

您可以使用 Linux 特定的eventfd(2)signalfd(2);您还可以使用在 Linux 上非常有效的 Posix 标准管道(2)(即使您每次写入(2)一个字节)。

请注意,您可以通过从信号处理程序内部将一个字节 -ing 到fd 来在signalfdLinux 之外的其他 Posix 系统上进行模拟。这是允许的(并由 Qt 文档建议)。writepipe

您谈到扩展squid代理(也许ICAP可能是相关的)。并且squid显然有一个非常可靠的事件循环(可能使用poll(2)或其他多路复用),因此这建议相反使用基于文件描述符的东西,如管道eventfd、、、signalfd套接字(例如AF_UNIX,参见unix(7)或带有mkfifo(3)等的命名管道等....)。

并且可以使文件描述符发出信号(使用SIGIOsignal 和fcntl(2) F_SETOWNF_SETFL)。

实际上,在 Squid 中,我认为使用信号是错误的。

AFAIK,Linux 处理文件描述符比处理信号更好更快。

另请阅读高级 Linux 编程....

于 2013-11-13T21:31:08.850 回答
2

您可以使用POSIX 实时信号。从链接的手册页:

与标准信号不同,实时信号没有预定义的含义:整套实时信号可用于应用定义的目的。

建议先阅读并理解它们。

于 2013-11-13T20:45:05.090 回答