2015-05-07 69 views
2

我正在構建一個處理從RS232端口收到的信號的算法。基本思想是從RS232接收信號,然後用相機抓取圖像。連續信號手柄

現在讓我們忽略照相機和RS232。我的短程序應該進入while循環,並請求「cin」命令。如果command == 'b',應該提高信號並激活signal_handler()功能。現在它工作正常。

我想要做的是改變程序重新回到while循環並繼續。我的程序在中斷後終止。

當我刪除exit(signum)時,程序返回while循環並詢問命令。如果我再次輸入'b'程序結束。

我哪裏錯了?錯誤的信號或整個方法?
謝謝!

void signalHandler(int signum) { 
    cout << "Interrupt signal (" << signum << ") received.\n"; 
} 

int main(){ 
    char Command = 'a'; 

    signal(SIGINT, signalHandler); 

    while (true){ 
     cout << "Command: "; 
     cin >> Command; 
     if (Command == 'b'){ 
      raise(SIGINT); 
     } 
    } 

    return 0; 
} 
+1

爲什麼使用SIGINT(信號中斷),而不是兩個用戶信號SIGUSR1或SIGUSR2中的一個? –

+0

因爲我沒有聽說過他們,你能舉個例子,我應該如何實施他們? – czmafi00

+0

只是一樣,但用例如改爲'SIGUSR1'。這裏真的需要*來使用信號嗎?爲什麼不簡單地調用一個函數? –

回答

1

您遇到的問題是,因爲一個信號被捕獲,信號處理程序是重置到其默認,這在SIGINT的情況下終止進程。

您應該使用sigaction來代替,它允許您指定行爲(請查看關於SA_RESETHAND標誌的部分)。