nohup 在递归运行时发送 eof (或其他一些数据)信息我的应用程序。如何让它停止或根本不发送?

nohup 在递归运行时发送 eof (或其他一些数据)信息我的应用程序。如何让它停止或根本不发送?

我有一个简单的小应用程序,支持cin/cout交互。但有时(很多时候)我不关心这种交互,只想在后台运行我的应用程序。所以我用这样的命令启动它

nohup ./myServer >& /dev/null &

但它占用了我的一个核心的 100%,因为将then或类似的内容nohup发送到我的应用程序,我的应用程序认为这是一个迟钝的用户,并向他建议交互命令列表并等待新的命令,nohup 再次发送then等等递归地。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(和许多其他语言)中也可能出现类似的问题。

相关内容