【问题标题】:How to interrupt Accept method in libfcgi?如何中断 libfcgi 中的 Accept 方法?
【发布时间】:2016-02-13 20:16:52
【问题描述】:

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

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

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

我也尝试拨打FCGX_ShutdownPending,但它似乎拒绝传入连接,并且没有停止监听下一个。

防止库接受任何新请求。信号处理程序安全。

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

【问题讨论】:

  • @SergeyA 感谢您的关注。我从std::thread 实例中调用FCGX_Accept_r。我尝试将 SIGTERM 和 SIGINT 发送到正在运行的应用程序,它们由处理函数处理,但这不会影响 FCGX_Accept_r 正在运行的线程。
  • 需要转发到运行这个函数的线程。您需要设置线程信号处置方式,使该线程能够看到信号。

标签: c++ multithreading fastcgi


【解决方案1】:

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

FCGX_Request request;
// ...
close(request.listen_sock);

【讨论】:

    【解决方案2】:

    如果未设置信号处理程序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: int SA_RESTART 这个标志控制当信号被触发时会发生什么 在某些原语(例如打开、读取或写入)期间交付,以及 信号处理程序正常返回。有两种选择: 库函数可以恢复,也可以返回失败并返回错误代码 EINTR。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多