2010-07-06 75 views
3

打我寫一個程序,反覆做,直到按Ctrl + C的操作是通過在Linux終端的用戶打。我在C編程。任何想法,我可以如何實現這一點。執行C程序,直至按Ctrl + C在終端

我以「爲」測試我的程序與條件循環,但現在我希望把它只要按Ctrl + C被用戶打和中斷運行。

我在想什麼是寫一個做,而像下面

環做的{ /計算/ } 而(按Ctrl + C是打不到)

但我不知道如何檢查用戶的Ctrl + C輸入。

任何建議將不勝感激。

感謝

+0

你只想讓程序在CTRL + C上退出,還是想以編程方式捕捉CTRL + C並採取一些操作? – nos 2010-07-06 19:56:20

+0

是的,我想在它檢測到一個Ctrl + C然後返回後打印一行。基本上來自while循環並打印一行。 – 2010-07-06 20:07:35

回答

12

的信號陷阱會做的伎倆更清潔比spudd86的建議。不過,這個例子可以大大改善。

#include <signal.h> 
/* ... */ 

int execute; 
void trap(int signal){ execute = 0; } 

int main() { 
    /* ... */ 
    signal(SIGINT, &trap); 
    execute = 1; 
    while(execute){ 
     /* ... */ 
    } 
    signal(SIGINT, SIG_DFL); 
    /* ... */ 
} 
+0

你能詳細說明爲什麼這種方式更可取? – 2010-07-06 19:57:48

+1

如果您需要清理(空閒內存,保存設置,關閉文件句柄等),當用戶中斷無限循環時,它不會完成。這樣,你可以在循環被破壞後自由地繼續做事。這可能是一個簡單的清理,或者是程序流程的延續。 – You 2010-07-06 20:01:54

+0

(想象一下,一個基於菜單的程序進行重計算;用戶可以中止計算,並用這種方法你可以送他們回到菜單這是不可能的無限循環。) – You 2010-07-06 20:02:58

6

按Ctrl + C將發送你的程序的信號(SIGINT),如果不建立一個處理程序,它會導致程序退出。因此,所有你需要做的就是寫

do { 
    //computation 
} while(1); 

,並且會做你想要

編輯什麼:做你真正想要的,而無需在信號處理,避免做的事情,可能會導致編譯器優化打破您的代碼,你可以這樣做:

#include <signal.h> 
/* ... */ 

int main() { 
    sigset_t set, oldset; 

    sigemptyset(&set); 

    /* ... */ 

    sigaddset(&set, SIGINT); 
    sigprocmask(SIG_BLOCK, &set, &oldset); 
    do { 
     sigset_t pending_set; 
     /* ... */ 
     sigpending(&pending_set); 
    } while(!sigismember(&pending_set, SIGINT)); 
    sigprocmask(SIG_SETMASK, &oldset, NULL); 
    /* ... */ 
} 
+0

如果在循環被破壞後預計執行將繼續,則這將不起作用。 – You 2010-07-06 19:55:27

+0

我嘗試了你的建議,但由於某種原因程序進入了無限循環,並沒有檢測到我的Ctrl + C。 據我所知,該程序將簡單地退出,但我想打印出一行後檢測到一個Ctrl + C.Hence它應該只能離開這個循環,打印一條線,然後返回。 – 2010-07-06 20:05:44

+0

感謝spudd86的詳細回覆。讚賞它 – 2010-07-07 18:06:36

0

當按Ctrl-C被擊中,一個信號發送到程序。默認行爲是程序被終止。

這意味着,你可以讓你的程序運行永遠不斷地循環。當用戶點擊Ctrl-C時,程序將中止。