nohupは、再帰的に実行中にeof(または他のデータ)情報を自分のアプリケーションに送信します。停止したり、まったく送信したくない場合はどうすればよいですか?

nohupは、再帰的に実行中にeof(または他のデータ)情報を自分のアプリケーションに送信します。停止したり、まったく送信したくない場合はどうすればよいですか?

cinサポート/対話するシンプルな小さなアプリケーションがありますcout。しかし、時には(多くの場合)このインタラクションに気を使わずにバックグラウンドでアプリを実行したい場合があります。だから私は次のコマンドで始めます。

nohup ./myServer >& /dev/null &

しかし、私のアプリにそのようなものを送るので、私のコアの1つを100%使用しています。nohup私のアプリは、ユーザーが遅いユーザーだと思って彼にコマンドリストと対話し、新しいコマンドを待つように提案し、nohupは再送信します。再帰的に。eofendleofendl

したがって、この不都合な相互作用はコアを消費します。私のアプリケーションにデータが送信されないようにnohupを起動したいと思います。いいえeofendlちょっと待って、このようなことをする方法は?

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(および他の多くの言語)でも同様の問題が発生する可能性があります。

おすすめ記事