2014-07-12 189 views
0

我正在編寫一個循環執行某些指令(在for中)的代碼,但如果當前執行由於某種原因需要很長時間才能完成,我想中斷執行,並跳到下一個一。這是我的代碼:SIGALRM:在執行後繼續執行

int i =0; //global var 
for (i = 0; i < 5; i++) { 
     signal(SIGALRM, timeout_function); 
     alarm(TIMEOUT); 
     if (i == 2) { 
      int number; 
      scanf("%d", &number); 
      //simulate long operation 

     } else { 
      printf("current cycle: %d\n ", i); 
      alarm(0); 
     } 
    } 

timeout_function只是打印一條消息。 ,現在這是印在執行:

current cycle: 0 
current cycle: 1 
cycle 2 interrupted 
cycle 2 interrupted 
cycle 2 interrupted 
... 

所以對於被阻止的執行。如何在sigalarm之後繼續正常執行?

EDIT

TIMEOUT是作爲參數時啓動代碼傳遞的值。 超時函數是一個簡單的printf:

void timeout_function() { 
    printf("cycle %d interrupted\n", i); 

} 
+0

1個
超時設爲i = 2
2 //用戶從標準
當前週期輸入什麼是超時值 –

+0

你在哪裏打印'「循環x中斷」'?請創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們顯示。 –

回答

0

直到i的值是大於2較小,所有的報警設定使用報警(0)
可能的原因是取消,一旦的值i> = 2,程序執行等待用戶輸入到
然後調用信號處理函數「timeout_function」。 這意味着執行未被阻止,但系統正在等待用戶輸入。

同樣的程序後TIMEOUT設置爲1我得到了以下結果如預期。

當前週期:0
當前週期:3
當前週期:4

+0

好吧,但scanf只用於模擬需要很多時間的操作,所以我會跳過它,然後繼續下一個循環(我i = 3) – giozh

+0

@giozh你能詳細說明上面的評論,我明白了當scanf被執行時,它需要很多時間是的,它會等待直到輸入被輸入 –