cin
지원 / 상호작용 하는 간단한 작은 애플리케이션이 있습니다 cout
. 하지만 때로는 (많은 경우) 이 상호 작용에 신경 쓰지 않고 백그라운드에서 앱을 실행하고 싶을 때도 있습니다. 그래서 다음과 같은 명령으로 시작합니다.
nohup ./myServer >& /dev/null &
하지만 내 앱에 그런 것을 보내기 때문에 내 코어 중 하나를 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(및 기타 여러 언어)에서도 유사한 문제가 발생할 수 있습니다.