nohup envia eof (ou alguns outros dados) informações do meu aplicativo ao executar recursivamente. Como fazer parar ou não enviar nada?

1

Eu tenho um aplicativo pequeno e simples que suporta cin / cout interação. Mas há momentos (muitos deles) quando não me importo com essa interação e apenas quero executar meu aplicativo em segundo plano. Então eu começo com o comando como

nohup ./myServer >& /dev/null &

mas come 100% de um dos meus núcleos porque nohup envia eof then endl ou algo assim para meu aplicativo, meu aplicativo acha que esse é um usuário chato e o propõe com uma lista de comandos de interação e aguarda por novo commad, nohup envia eof então endl novamente e assim por diante recursivamente.

Então, um núcleo é engolido com essa interação ruim. Eu quero começar nohup para que ele não envie nenhum dado para o meu aplicativo - não eof , endl , etc como fazer isso?

Como fazer o nohup não enviar dados para o meu aplicativo depois de iniciado?

    
por myWallJSON 28.01.2012 / 16:27

1 resposta

3

A correção para isso é corrigir seu aplicativo.

nohup não envia nada para ninguém. Seu aplicativo, por outro lado, está assumindo que stdin é um descritor de arquivo aberto válido. Ele deve estar verificando o código de retorno de qualquer primitivo que esteja usando para obter os dados da entrada padrão e reagir de acordo se o fluxo de entrada for fechado ou inválido.

Como você diz cin , presumo que esteja codificando em C ++. Esta é uma maneira segura de obter seqüências de caracteres de 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;
}

Esta é uma maneira ruim de obter informações do usuário:

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;
}

Como um fluxo em eof não é bad() , isso será repetido para sempre quando cin atingir a OEF. Existem muitas variações para isso (versões boas e ruins), e problemas semelhantes podem surgir em C simples (e muitas outras linguagens) por razões similares.

    
por 28.01.2012 / 17:34

Tags