如果用户定义的信号不够,我该怎么办?

时间:2013-11-13 19:26:59

标签: linux unix signals posix

Linux只有两个用户定义的信号,SIGUSER1和SIGUSER2,但是它们已经在squid中使用了。

我想使用另一个用户定义的信号在squid中调用我自己的处理函数,如果我想要另一个用户定义的信号,我该怎么办?我不希望socket作为进程间通信的方式。

任何人都知道怎么做?

2 个答案:

答案 0 :(得分:4)

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

作为Duck answered,您可以考虑使用POSIX实时信号。

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

请注意,限制仅使用 async-signal-safe函数 - 直接或间接在信号处理程序内部是非常一个人。您甚至无法调用(甚至间接)malloc(或许多标准C ++容器中经常使用的C ++中的operator new)或信号处理程序内的fprintf。您可以考虑在其中设置一些volatile sig_atomic_t标记。

您可以使用特定于Linux的eventfd(2)signalfd(2);你也可以使用在Linux上非常有效的Posix标准pipe(2)(即使你每次write(2)一个字节)。

请注意,您可以通过signalfd将一个字节模拟到write f.d,在其他Posix系统上模拟Linux之外的pipe。来自信号处理程序内部。这是允许的(并由Qt文档建议)。

您谈到扩展squid代理(或许ICAP可能相关)。并且squid显然有一个非常可靠event loop(可能使用poll(2)或其他一些多路复用),所以这反过来建议使用类似管道的文件描述符,eventfdsignalfd,套接字(例如AF_UNIX个,请参阅unix(7),或使用mkfifo(3)等命名管道。)。

文件描述符可以发出信号(SIGIO信号和fcntl(2) F_SETOWNF_SETFL)。

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

AFAIK,Linux使用文件描述符比使用信号更好,更快。

另请阅读Advanced Linux Programming ....

答案 1 :(得分:2)

您可以使用POSIX real-time signals。从链接的手册页:

  

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

建议先阅读并理解它们。