打我寫一個程序,反覆做,直到按Ctrl + C的操作是通過在Linux終端的用戶打。我在C編程。任何想法,我可以如何實現這一點。執行C程序,直至按Ctrl + C在終端
我以「爲」測試我的程序與條件循環,但現在我希望把它只要按Ctrl + C被用戶打和中斷運行。
我在想什麼是寫一個做,而像下面
環做的{ /計算/ } 而(按Ctrl + C是打不到)
但我不知道如何檢查用戶的Ctrl + C輸入。
任何建議將不勝感激。
感謝
打我寫一個程序,反覆做,直到按Ctrl + C的操作是通過在Linux終端的用戶打。我在C編程。任何想法,我可以如何實現這一點。執行C程序,直至按Ctrl + C在終端
我以「爲」測試我的程序與條件循環,但現在我希望把它只要按Ctrl + C被用戶打和中斷運行。
我在想什麼是寫一個做,而像下面
環做的{ /計算/ } 而(按Ctrl + C是打不到)
但我不知道如何檢查用戶的Ctrl + C輸入。
任何建議將不勝感激。
感謝
的信號陷阱會做的伎倆更清潔比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);
/* ... */
}
按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);
/* ... */
}
如果在循環被破壞後預計執行將繼續,則這將不起作用。 – You 2010-07-06 19:55:27
我嘗試了你的建議,但由於某種原因程序進入了無限循環,並沒有檢測到我的Ctrl + C。 據我所知,該程序將簡單地退出,但我想打印出一行後檢測到一個Ctrl + C.Hence它應該只能離開這個循環,打印一條線,然後返回。 – 2010-07-06 20:05:44
感謝spudd86的詳細回覆。讚賞它 – 2010-07-07 18:06:36
當按Ctrl-C被擊中,一個信號發送到程序。默認行爲是程序被終止。
這意味着,你可以讓你的程序運行永遠不斷地循環。當用戶點擊Ctrl-C時,程序將中止。
你只想讓程序在CTRL + C上退出,還是想以編程方式捕捉CTRL + C並採取一些操作? – nos 2010-07-06 19:56:20
是的,我想在它檢測到一個Ctrl + C然後返回後打印一行。基本上來自while循環並打印一行。 – 2010-07-06 20:07:35