nohup은 재귀적으로 실행되는 동안 eof(또는 다른 데이터) 정보를 내 애플리케이션에 보냅니다. 중지하거나 전혀 보내지 않으려면 어떻게 해야 합니까?

nohup은 재귀적으로 실행되는 동안 eof(또는 다른 데이터) 정보를 내 애플리케이션에 보냅니다. 중지하거나 전혀 보내지 않으려면 어떻게 해야 합니까?

cin지원 / 상호작용 하는 간단한 작은 애플리케이션이 있습니다 cout. 하지만 때로는 (많은 경우) 이 상호 작용에 신경 쓰지 않고 백그라운드에서 앱을 실행하고 싶을 때도 있습니다. 그래서 다음과 같은 명령으로 시작합니다.

nohup ./myServer >& /dev/null &

하지만 내 앱에 그런 것을 보내기 때문에 내 코어 중 하나를 100% 사용하고 있습니다. nohup내 앱은 사용자가 느린 사용자라고 생각하고 그에게 명령 목록과 상호 작용하고 새 명령을 기다리라고 제안하고 nohup은 다시 보냅니다. 재귀적으로.eofendleofendl

따라서 이 형편없는 상호작용으로 인해 코어가 소모됩니다. 내 애플리케이션에 어떤 데이터도 보내지 않도록 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(및 기타 여러 언어)에서도 유사한 문제가 발생할 수 있습니다.

관련 정보