2017-09-29 15 views
1

を通して私はstd::getline()経由stdinからユーザー入力を読んで、私はSIGINTでプログラムを終了することができるようにしたいです。残念ながら、std::getline()はどの信号でも目を覚まさないようです。したがって、以下のコードは、CTRL-C RETURNを押した後アボート。ウェイクアップのstd :: getlineの信号

#include <csignal> 
#include <string> 
#include <iostream> 

bool abort_ = false; 

void SigIntHandler(int signum) { 
    std::cout << "Received SIGINT" << std::endl; 
    abort_ = true; 
} 


int main(int argc, char *argv[]) { 
    signal(SIGINT, SigIntHandler); 

    while (!abort_) { 
    std::string line; 

    std::cout << "> "; 
    std::getline(std::cin, line); 
    if (!std::cin) 
     std::cin.clear(); 

    std::cout << line << std::endl; 
    } 
} 

なぜそうですか?ユーザー入力以外でstd::getline()を起動する機会はありますか?あるいは、信号にも反応するstdinから読み取る他の方法がありますか?プロセスは、信号を受信した場合

答えて

1

std::getline、そして一般に、入力/出力ライブラリーは、指定された動作を有していません。 C++ライブラリと言語は、特定の動作を指定しません。信号のみを簡単に最も顕著な参照のみのことをされた状態で、通過に記載されている:機能信号に

コールのでインストールシグナルハンドラの任意得 呼び出しに同期させます。

ヘッダファイルの列挙は、C++ライブラリのシグナルへの参照の合計です。シグナルは高度にオペレーティングシステム固有の機能であり、C++ライブラリではカバーされていません。ここで説明するC++ライブラリ関数やクラスの

なしシグナルセーフではありません。示されたコードでは、シグナルハンドラは内部状態が不確定であり、全体がシグナルセーフではないため、入力ストリームに対して何もできません。代わりにC++入力/出力ライブラリーを使用する、open()read()、及びwrite()ように、低レベルのオペレーティングシステム固有の呼び出しに頼ることが必要であろう信号に対応するなど

、。もちろん、オプションの一つは、低レベルのシステムコールを使用して、その機能を実装し、適切な信号を扱う、std::streambufの独自のサブクラスを作成しています。独自の実装が適切に入力の上、ブロッキングし、失敗した状態にストリームバッファを設定することにより、任意の受信信号を処理(または、おそらく、ENTERキーを受け取るシミュレートする、ちょっと、それはあなたのショーだ)と返すとなります。

+0

基本的な点には影響しませんが、C++ 11ではシグナルハンドラと同期できる関数std :: atomic_signal_fenceが追加されました。 –

関連する問題