Como minimizar o uso de recursos enquanto o processo aguarda ser morto por um sinal?

0

Meu programa C ++ faz algum trabalho e aguarda um sinal para matá-lo. Eu gostaria apenas de sair, mas sair envia SIGCHLD para o processo pai, e eu preciso controlar o tempo disso.

Atualmente, eu faço o seguinte:

int main() {
    run(); // do stuff, then free() and close() everything possible.
    for (;;) pause();  // wait for signal to kill us
    return 0;
}

Então, depois que run() for concluído, o programa fica parado e depois morre.

Existe alguma maneira linux-y agradável de dizer "este programa não precisa de nada agora, desalocar stack e tudo mais", ou eu já estou no estágio "barest process possible"?

    
por Andrew Morozko 23.11.2018 / 12:33

1 resposta

2

Suponha que você tenha que fazer o que você diz (o que duvido), e suponha que seu programa seja grande, então usa muita memória.

ideia 1

Você poderia exec outro programa menor, para fazer a espera.

No entanto, a maneira mais eficiente é sair, isso libera quase tudo, exceto sua entrada na tabela de processos e seu valor de saída. O processo se tornará um zumbi, até que o pai lide com o SIGCHLD (ou o pai morre, no caso em que 'init se torna pai e manipula SIGCHLD muito rapidamente).

Idéia 2

Escreva um wrapper. Dessa forma, a criança não precisa modificar, você não está mais distorcendo o código filho, para compensar a má paternidade.

O wrapper pode conter nada mais que, execute child, wait, exit. por exemplo,

int main() {
    fork and exec child
    wait for child
    wait for signal from parent
    return child exit code
}
    
por 23.11.2018 / 12:42

Tags