我試圖寫一個信號處理程序來捕捉任意數量的連續的SIGINT信號並防止程序退出。該程序是一個簡單的文件服務器。該處理程序設置一個全局標誌,使while循環接受新的連接結束,調用pthread_exit()可確保main在退出前讓當前連接完成。這一切都像發條一樣,當我按ctrl-C一次,但第二次立即退出程序。持續信號處理
我第一次嘗試用信號():
signal(SIGINT, catch_sigint);
...
static void catch_sigint(int signo)
{
...
signal(SIGINT, catch_sigint);
}
我也嘗試過使用的sigaction:
struct sigaction sigint_handler;
sigint_handler.sa_handler = catch_sigint;
sigemptyset(&sigint_handler.sa_mask);
sigint_handler.sa_flags = 0;
sigaction(SIGINT, &sigint_handler, NULL);
不確定如何「重新安裝」這一個我只是複製這個代碼在類似的處理程序使用signal()方法處理處理程序。
這兩個都沒有如我所料。
附加信息:
該方案是一個簡單的文件服務器。它接收來自客戶端的請求,該請求只是由所請求的文件名組成的字符串。它利用pthreads,以便傳輸可以同時發生。收到SIGINT後,我希望服務器退出while循環並等待所有當前傳輸完成,然後關閉。就像,不管我如何編碼信號處理程序,第二個SIGINT立即終止程序。
int serverStop = 0;
...
int main()
{
/* set up the server -- socket(), bind() etc. */
struct sigaction sigint_hadler;
sigint_handler.sa_handler = catch_sigint;
sigint_handler.sa_flags = 0;
sigemptyset(&sigint_handler.sa_mask);
sigaction(SIGINT, &sigint_handler, NULL);
/* signal(SIGINT, catch_sigint); */
while(serverStop == 0)
{
/* accept new connections and pthread_create() for each */
}
pthread_exit(NULL);
}
...
static void catch_sigint(int signo)
{
serverStop = 1;
/* signal(SIGINT, catch_sigint) */
}
我不認爲任何其他代碼可能是相關的,但隨時索要闡述
這是一個非常虛假的答案:在主線程中調用pthread_exit *是非常好的*,對於這個特定的信號處理程序,無論信號處理程序調用哪個線程都沒有區別。也不保證在主線程中傳遞'SIGINT'(當它繼續存在時)。 –
目前我沒有限制線程的最大數量(因爲我知道有多少客戶端請求我要做),所以我沒有跟蹤每個線程的ID,爲了使用'pthread_join ()'我相信。但是,您的解釋使問題更清楚。正如我的問題所述,我正在考慮將main中的'pthread_exit()'作爲主要等待,而不是退出主程序而不終止其他線程。使用'pthread_sigmask()'在每個線程中阻止SIGINT已經解決了這個問題。它可能不是最正確的解決方案,但它現在會做。謝謝! – Matt