2016-12-11 17 views
0
#include <iostream> 
#include <csignal> 

void handler(int signo){ 
    std::cout << "Caught " << (signo == SIGINT) << std::endl; 
} 

int main(){ 
    signal(SIGINT, handler); 
    while(true) ; 

} 

これらは、私はC複数CNTRL + を押したときに、2つの異なることを行うように見えます。 Linuxでは捕捉されたメッセージが複数回表示されますが、Windowsでは捕捉されたメッセージが一度だけ表示され、のCntrl + の2回目のプレスで表示されます。ハンドラは信号を一度だけ捕まえることを意図しているのですか?または、Windowsが2番目のプレスでプログラムを終了させる原因となっている不足しているプロパティがありますか?シグナルハンドラは無期限に実行されますか? WindowsとLinuxの

As far as I can tellCNTRL + Cは、それがLinux上で同じようにWindows上でSIGINTとして扱われます。

+0

https://msdn.microsoft.com/en-us/library/xdkz3x12.aspx –

+0

@lateeveloperありがとう、私はそれを言及していないcppreference.comのドキュメントを見ていた。関連する行: "指定された関数が実行される前に、funcの値はSIG_DFL_に設定されています" – SergeantPenguin

+0

Windowsでは、SIGINTハンドラは別のスレッドで実行されます。 –

答えて

2

これはセットまたはクリアSA_RESETHANDフラグでsigactionと同等であるかもしれないsignalの実装に依存する - のいずれかPOSIXとC規格にaccoding許容可能です。

この動作を制御する場合は、signalの代わりにsigactionを使用して、信号ハンドラを設定し、フラグを設定して目的の動作を取得する必要があります。

+1

また、posixシグナルハンドラでstd :: coutを使用することは安全ではありません。安全な関数のリストがここにあります:http://man7.org/linux/man-pages/man7/signal.7.html –

関連する問題