Linux只有两个用户定义的信号,SIGUSER1和SIGUSER2,但是它们已经在squid中使用了。
我想使用另一个用户定义的信号在squid中调用我自己的处理函数,如果我想要另一个用户定义的信号,我该怎么办?我不希望socket作为进程间通信的方式。
任何人都知道怎么做?
答案 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)或其他一些多路复用),所以这反过来建议使用类似管道的文件描述符,eventfd
,signalfd
,套接字(例如AF_UNIX
个,请参阅unix(7),或使用mkfifo(3)等命名管道。)。
文件描述符可以发出信号(SIGIO
信号和fcntl(2) F_SETOWN
和F_SETFL
)。
实际上,在Squid中,我认为使用信号是错误的。
AFAIK,Linux使用文件描述符比使用信号更好,更快。
另请阅读Advanced Linux Programming ....
答案 1 :(得分:2)