У меня есть простое небольшое приложение, которое поддерживает взаимодействие cin
/ cout
. Но есть моменты (многие из них), когда я не забочусь об этом взаимодействии и просто хочу запустить свое приложение в фоновом режиме. Поэтому я начинаю с команды, как
nohup ./myServer >& /dev/null &
но он ест 100% одного из моих ядер, потому что nohup
отправляет eof
затем eof
или что-то в этом приложении, мое приложение думает, что это тупой пользователь и предлагает ему список команд взаимодействия и ждет нового commad, nohup отправляет eof
затем endl
снова и так далее рекурсивно.
Таким образом, одно ядро съедается с этим дрянным взаимодействием. Я хочу начать nohup, чтобы он не отправлял никаких данных на мое приложение – no eof
, eof
и т. Д., Как это сделать?
Как заставить nohup отправлять данные вообще в мое приложение после его запуска?
Исправить это – исправить ваше приложение.
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()
, это будет циклически навсегда, как только cin
достигнет OEF. Для этого существует множество вариаций (как хороших, так и плохих), и аналогичные проблемы могут возникать на простых C (и многих других языках) по аналогичным причинам.