cin
サポート/対話するシンプルな小さなアプリケーションがありますcout
。しかし、時には(多くの場合)このインタラクションに気を使わずにバックグラウンドでアプリを実行したい場合があります。だから私は次のコマンドで始めます。
nohup ./myServer >& /dev/null &
しかし、私のアプリにそのようなものを送るので、私のコアの1つを100%使用しています。nohup
私のアプリは、ユーザーが遅いユーザーだと思って彼にコマンドリストと対話し、新しいコマンドを待つように提案し、nohupは再送信します。再帰的に。eof
endl
eof
endl
したがって、この不都合な相互作用はコアを消費します。私のアプリケーションにデータが送信されないようにnohupを起動したいと思います。いいえeof
、endl
ちょっと待って、このようなことをする方法は?
nohupが起動後にアプリケーションにデータを送信しないようにするにはどうすればよいですか?
ベストアンサー1
この問題に対する解決策は、アプリケーションを修正することです。
nohup
誰にも何も送らないでください。一方、アプリケーションはこれがstdin
有効なオープンファイル記述子であると仮定します。標準入力からデータを取得するために使用される基本要素の戻りコードを確認し、入力ストリームが閉じられているか無効であることを確認したら、それに応じて応答する必要があります。
あなたがそう言ったので、cin
私はあなたがC ++でコーディングしているとします。これは文字列を取得する安全な方法です。std::cin
void get_input()
{
std::cout << "getting input" << std::endl;
std::string input;
while (std::cin >> input) {
// Good, got something from cin
std::cout << " * " << input << std::endl;
}
std::cout << "out of input loop" << std::endl;
std::cout << std::cin.eof() << std::endl;
std::cout << std::cin.bad() << std::endl;
}
これは悪いユーザー入力を取得するには:
void bad_input()
{
std::cout << "getting input" << std::endl;
std::string input;
while (!std::cin.bad()) {
std::cin >> input; // BAD: not checking if the extractor succeeded
std::cout << input << std::endl;
// do stuff
}
// Not reached if `std::cin` reaches EOF
std::cout << "out of input loop" << std::endl;
}
ストリームeof
ではないため、bad()
OEFに達すると永久に繰り返されますcin
。これにはさまざまなバリエーション(良いバージョンと悪いバージョン)があり、同様の理由で純粋なC(および他の多くの言語)でも同様の問題が発生する可能性があります。