如何中断libfcgi中的Accept方法
How to interrupt Accept method in libfcgi?
我正在使用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);
确保使用sigaction
,signal
默认设置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);
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 用C++中的一个变量定义一个常量
- vector.resize()中的分配错误
- 使用指针从C++中的数组中获取最大值
- arr[-1]在c++中的奇怪行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 将值指定给向量(2D)的向量中的某个位置
- 如何中断libfcgi中的Accept方法