簡體   English   中英

如何在libfcgi中中斷Accept方法?

[英]How to interrupt Accept method in libfcgi?

我正在使用libfcgi(fcgiapp)庫編寫FastCGI應用程序。 問題出在FCGX_Accept_r方法中,它等待傳入連接並阻塞線程。 我可以看到,它沒有任何類型的超時,因此程序流無法繼續執行,直到請求到達。

我試圖在FCGX_InitRequest方法中設置FCGI_FAIL_ACCEPT_ON_INTR標志以使接受函數中斷,但沒有成功。

設置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標志,因為它會影響某些基元與信號的行為方式。

宏:int SA_RESTART此標志控制在某些基元(例如打開,讀取或寫入)期間傳遞信號時發生的情況,並且信號處理程序正常返回。 有兩種選擇:庫函數可以恢復,或者它可以返回失敗,錯誤代碼為EINTR。

我有一個類似的問題。 如果您在linux上運行,則需要關閉套接字以使FCGX_Accept_r返回並設置FCGI_FAIL_ACCEPT_ON_INTR。

我在Linux上用來阻止FCGI的代碼是:

FCGX_ShutdownPending();

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM