[英]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.