Melhor maneira de criar executável "interruptível"

3

A tarefa do meu arquivo executável Unix é executar uma computação longa e Eu adicionei uma funcionalidade de interrupção / retomada conforme explicado abaixo.

Em intervalos regulares, o programa grava todos os dados relevantes encontrados até o momento em um arquivo de ponto de verificação, que pode ser usado como ponto de partida para um "resumo" operação.

Para interromper o programa, eu uso Ctrl + C .
O único problema com esta metodologia é que, se a interrupção ocorrer quando o programa está gravando no arquivo, me resta um meio arquivo inútil escrito.

A única correção que encontrei até agora é a seguinte:

  • faça o programa
  • escreve em dois arquivos, de modo que, no tempo de reinicialização um deles será legível.

Existe uma maneira melhor e mais limpa de criar um executável Unix "interrompível"?

    
por Ewan Delanoy 16.10.2016 / 19:11

2 respostas

5

Depende um pouco se você se preocupa apenas com o próprio programa travando, ou com o travamento de todo o sistema.

No primeiro caso, você pode gravar os novos dados em um novo arquivo e depois renomeá-los para o nome real somente depois de terminar de escrever. Dessa forma, o arquivo conterá os dados anteriores ou novos do ponto de verificação, mas nunca apenas informações parciais. Embora as gravações parciais devam ser raras o suficiente em qualquer caso, se assumirmos que o código de ponto de verificação em si não é provável que falhe, e se for relevante, é relevante que o código de verificação seja sinais são presos para garantir que o programa salva um novo ponto de verificação antes de sair. (Além de SIGINT , acho melhor você pegar SIGHUP e SIGTERM também.)

Se considerarmos a possibilidade de todo o sistema travar, não confiaria em apenas um arquivo de ponto de verificação. Os dados provavelmente não estarão realmente no disco quando o sistema retornar da chamada do sistema de gravação de arquivos. Em vez disso, é provável que o sistema operacional e o próprio disco armazenem os dados em cache e, na verdade, escrevam-nos algum tempo depois. Portanto, deixar um ou dois pontos de verificação anteriores funcionaria como uma proteção contra falhas.

    
por 16.10.2016 / 20:35
4

Você pode capturar o sinal SIGINT que é enviado para o processo quando Ctrl-C é pressionado usando um manipulador de sinal. Então o processo não é morto imediatamente, mas o manipulador de sinal é chamado. No manipulador de sinal, você pode gravar os resultados em um arquivo. Esta é a idéia geral, na prática você pode ter alguns detalhes mais precisos para cuidar.

    
por 16.10.2016 / 19:42

Tags