Pergunta

Eu trabalho em código algo como isto

... HEADERS ...

int *var;

void child() {
  ... //some work
  free(var);
  exit(EXIT_SUCCESSFUL);
}

int main(void) {
  ...
  //allocate variable
  var = (int *) malloc(N*sizeof(int));
  ... //work with var

  for(int i; i<PROC_COUNT; i++) {
    pid_t child = fork();
    if(pid == 0) {
      child(); //main function of new proces
      break;
    }
    elseif(pid < 0) {
      //there is enormous problem -> kill every proces
      kill(0, SIGTERM);
      waitpid(0, NULL, 0); //wait for children
      free(var);
      exit(EXIT_FAILURE);
    }

  }
  free(var);
  return EXIT_SUCCESS;
}

Quando o processo é bifurcada, todas as variáveis ??são clonados também. No caso regulares todas as cópias do var são liberados.

Se houver erro fork(), eu enviar SIGTERM sinal para todos os processos criados. E eu preciso escrever manipulador de sinal para SIGTERM que livre var e cessar a aplicação. No entanto, free () não é signal safe function - então eu devia `chamá-lo. Mas como libertar () essa variável?

Um monte de agradecimento por suas respostas ...

EDIT: valgrind também mostra ainda variável alcançáveis:

==5928== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==5928== malloc/free: in use at exit: 20 bytes in 1 blocks.
==5928== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.
==5928== For counts of detected errors, rerun with: -v
==5928== searching for pointers to 1 not-freed blocks.
==5928== checked 49,164 bytes.
Foi útil?

Solução

Eu duvido que você precisa. Qualquer sistema operacional que suporta fork (), também vai alocações automaticamente livres de malloc () quando um processo sai, independentemente de como ele faz isso (incluindo a rescisão).

Não faça ambientes existir onde programas em C não são executados em processos, e onde você tem que ter muito cuidado com o que você deixar em torno de mentir na saída. Mas esses ambientes não são POSIX, e não vai apoiar fork (). Eles podem não suportar sinais, para essa matéria. Se você está escrevendo para qualquer ambiente incomum, verifique a documentação ...

Se você quiser ver um relatório valgrind limpo, então você pode ter o pau manipulador de um evento no ciclo de eventos da criança (ou definir um sinalizador e postar um semáforo, ou qualquer outro), e processar o evento como uma saída limpa. Isso é também o que você faria se o seu programa foi uma aplicação interactiva e você queria salvar os dados do usuário em um SIGTERM, assumindo que o seu quadro UI já não traduzir SIGTERM em um evento para você.

Outras dicas

I podem ser mal-entendido alguma coisa, mas certamente depois de SIGTERM todo o processo irá desaparecer, levando sua variável com ele?

Você pode usar exec para iniciar o processo filho do principal em vez de chamar a função de criança () diretamente. Usar um argumento de linha de comando para notificar o programa de criança para fazer o trabalho no principal. Em seguida, o processo filho será capaz de limpeza corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top