如何中断libfcgi中的Accept方法

How to interrupt Accept method in libfcgi?

本文关键字:libfcgi 中的 Accept 方法 中断 何中断      更新时间:2023-10-16

我正在使用libfcgi(fcgiapp)库编写一个FastCGI应用程序。问题出现在FCGX_Accept_r方法中,该方法等待传入连接并阻塞线程。正如我所看到的,它没有任何类型的超时,所以程序流在请求到达之前无法继续执行。

我试图在FCGX_InitRequest方法中设置FCGI_FAIL_ACCEPT_ON_INTR标志,使accept函数中断,但没有成功。

设置FCGI_FAIL_ACCEPT_ON_INTR可防止FCGX_ACCEPT()在中断时重新启动。

我还试着呼叫FCGX_ShutdownPending,但它似乎拒绝了新的传入连接,并且没有停止侦听下一个连接。

阻止lib接受任何新请求。信号处理器安全。

你能告诉我还有什么办法可以打破FCGX_Accept_r等待吗?

作为一种解决方法,只需关闭套接字:

FCGX_Request request;
// ...
close(request.listen_sock);
如果未设置信号处理程序SA_RESTART标志,则

FCGX_Accept_r将在信号上以负返回值中断。

如果您希望您的进程在信号(例如SIGINT)上正常关闭,请注册一个伪信号处理程序,如下所示:

struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = your_handler;
sigaction(signo, &act, NULL);

确保使用sigactionsignal默认设置SA_RESTART标志,因为它会影响某些基元对信号的行为。

Macro:intSA_RESTART此标志控制当信号在某些基元(如打开、读取或写入)期间交付,以及信号处理程序正常返回。有两种选择:库函数可以恢复,也可以返回失败并返回错误代码EINTR。

我也遇到了类似的问题。如果您在linux上运行,则需要关闭套接字以使FCGX_Accept_r返回并设置FCGI_FAIL_Accept_on_INTR。

我在Linux上用来停止FCGI的代码是:

FCGX_ShutdownPending();
if (miSocket != -1)
{
    shutdown(miSocket, SHUT_RD);
}