我有一个简单的小应用程序,支持cin
/cout
交互。但有时(很多时候)我不关心这种交互,只想在后台运行我的应用程序。所以我用这样的命令启动它
nohup ./myServer >& /dev/null &
但它占用了我的一个核心的 100%,因为将then或类似的内容nohup
发送到我的应用程序,我的应用程序认为这是一个迟钝的用户,并向他建议交互命令列表并等待新的命令,nohup 再次发送then等等递归地。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(和许多其他语言)中也可能出现类似的问题。