2014-12-22 36 views
0

我必須弄清楚如何編寫一個循環但無法使用CTRL-C退出5秒的程序,但是5秒後我可以使用CTRL-C結束程序。我一直在閱讀系統調用,什麼不是,但我不知道從哪裏開始。如果有人能指引我朝着正確的方向,這裏有確切的說明。謝謝。使用系統調用的問題

編寫一個C程序,該程序使用系統調用創建一個循環,並且無法用控件C殺死5秒鐘。當它開始時它會打印出「我已經開始循環,不能用^ C殺死。 。 。「然後每秒打印一條消息,說」仍然循環。 。 。「五秒鐘後,允許循環被控制C殺死,並顯示消息」我仍在循環,但我可以用^ C殺死......「每秒顯示一次,直到用戶殺死它爲止。

+1

您可以使用[sigaction](http://man7.org/linux/man-pages/man2/sigaction.2.html)來捕獲Ctrl-C(SIGINT)。可能的[示例代碼](http://stackoverflow.com/questions/4217037/catch-ctrl-c-in-c)上的sigaction。 – SSC

+1

一個有趣的方法是將中斷字符設置爲control-T前5秒,然後將其設置回控制C. –

回答

1

您想查看signal(2)接口。當在UNIX/Linux環境中發生某些與進程相關的事件時,操作系統會向進程發送一個信號(實質上是一個軟件中斷)。您可以使用signal函數「捕捉」信號來設置回調函數,該函數在發生給定信號時得到通知。對於Ctrl-C,您希望查看SIGINT,但您可以使用相同的界面處理其他信號。至於暫停,這很容易 - 只需在循環中使用sleep()即可。

+0

我喜歡你讓提問者學習如何自助服務的方法,但值得一提的是'sleep()'將阻止該線程上發生的任何工作。 –

+0

謝謝,我在最初的答案中加入了「循環」。 OP需要每秒打印一條消息,因此設置信號處理程序後,他們可以執行此操作(當然,只有僞代碼): 'for(秒數)do {sleep 1 second;打印信息}' – frasnian

+0

使用['sigaction()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)比使用 ['signal()']更好(http://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html),但使用'sigaction()'稍微難一些。 'signal()'有很多問題可以通過'sigaction()'來避免。 –

1

你可以使用這個。

void handler(int signo) 
{ 
    signal(SIGINT,SIG_DFL); 
} 

main() 
{ 
    signal(SIGINT,SIG_IGN); 
    signal(SIGALRM,handler); 
    // your code. 
    alarm(5);// for 5 seconds. 
    while(1) 
    { sleep(1); 
    printf("your message\n"); 
    }  
} 

首先忽略使用信號的SIGINT。和sigalrm的處理程序。所以前5秒ctrl+c將無法​​正常工作。在ctrl + c之後找到sigalrm時就可以工作。所以根據你的問題在特定時間段ctrl+c將被停止。

+0

你確定要發佈完整的程序來爲他們做這個人的作業嗎?至少這個OP只是要求指向正確的方向(與許多其他有家庭作業相關問題的人實際上*要求完整的程序不同)。我認爲OP應該有機會爲他/她自己學習。恕我直言。 – frasnian

+0

我不會假設你要求你刪除你的答案 - 這完全取決於你。我只是覺得提問者實際上要求他們做功課而不是要求他們爲他們完成而很少。這讓我想給他們一個「好工作!」電子卡片什麼的。使用'alarm()'是一種與我的不同的方法,它提供了'signal'的其他用途的示例,所以OP可能會從作業中學到更多東西。您可能需要爲他們分配額外的家庭作業:「使用這種方法,您還會如何每秒鐘打印一次?」 – frasnian