2013-06-23 18 views
2

我有一個控制檯服務器,它監聽客戶端並執行他們所需的操作。但有時我需要最終服務器,我不知道如何才能正確地做到這一點。因爲我可以按ctrl + c來結束程序,但是我需要做循環之後有重要的代碼。從控制檯的無限循環中斷

main_function(){ 
    while(true){ 
     listen(); 
    } 
    do_something_important(); 
} 

我可以從控制檯捕獲一些信號並運行功能做重要的事情,並正確結束?

end_program(){ 
    do_something_important(); 
    return 0; 
} 

或者在我的情況下我能做什麼最好的方法是什麼?

+0

[關閉C++控制檯應用程序時會發生什麼]可能的重複(http://stackoverflow.com/questions/696117/what-happens-when-you-close-ac-console-application) – GSerg

+0

可能的重複[如何在命令行界面中處理ctrl-break信號](http://stackoverflow.com/q/181413/11683) – GSerg

回答

3

你可以使用信號:像Pragmateek描述

#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

static void on_close(int signal) 
{ 
    puts("Cleaning up..."); 
    exit(EXIT_SUCCESS); 
} 

int main(void) 
{ 
    signal(SIGINT, on_close); 

    while (1) 
    { 
    } 

    return EXIT_SUCCESS; 
} 
4

使用的信號,但請務必只在信號處理程序設置標誌(如exitnow = TRUE),並在主循環檢查該標誌。信號可能會在代碼中的任何時候中斷您的主程序,因此如果您想確保您的邏輯不會被隨機中斷或縮短,請使用信號處理程序來設置標誌。

+1

+1爲最佳實踐如果主循環卡住,您甚至可以添加計數器如果用戶請求結束說3次直接退出。 – Pragmateek