Pergunta

Existe alguma diferença entre

   int on_exit(void (*function)(int , void *), void *arg);

e

   int atexit(void (*function)(void));

além do fato de que a função usada por on_exit obtém o status de saída?

Ou seja, se eu não me importo com o status de saída, há algum motivo para usar um ou outro?

Editar: Muitas das respostas alertaram contra on_exit porque não é padrão.Se estou desenvolvendo um aplicativo para uso corporativo interno e com garantia de execução em configurações específicas, devo me preocupar com isso?

Foi útil?

Solução

De acordo com esse link Eu descobri que parece que existem algumas diferenças. on_exit permitirá que você passe um argumento que é passado para o on_exit funciona quando é chamado ...o que pode permitir que você configure algumas dicas para fazer algum trabalho de limpeza quando for hora de sair.

Além disso, parece que on_exit era uma função específica do SunOS que pode não ser compatível em todas as plataformas...então você pode querer continuar com atexit, apesar de ser mais restritivo.

Outras dicas

Você deveria usar atexit() se possível. on_exit() é fora do padrão e menos comum.Por exemplo, não está disponível no OS X.

Kernel.org - on_exit():

Esta função vem de Sunos 4, mas também está presente no LIBC4, LIBC5 e GLIBC.Não ocorre mais no Solaris (SunOS 5).Evite essa função e use o Acexit padrão (3).

A diferença é que atexit é C e on_exit é alguma extensão estranha disponível no GNU e sabe-se lá o que outros sistemas Unixy (mas NÃO parte do POSIX).

@Nathan, não consigo encontrar nenhuma função que retorne o código de saída do processo em execução atual.Espero que ainda não esteja definido no momento em que atexit() é chamado, de qualquer maneira.Com isso quero dizer que o tempo de execução sabe o que é, mas provavelmente não relatou ao sistema operacional.No entanto, isso é apenas uma conjectura.

Parece que você precisará usar on_exit() ou estruture seu programa para que o código de saída não importe.Não seria irracional fazer com que a última instrução em sua função principal virasse um valor global exited_cleanly variável para verdadeiro.Na função em que você se registra atexit(), você pode verificar essa variável para determinar como o programa foi encerrado.Isso lhe dará apenas dois estados, mas espero que seja suficiente para a maioria das necessidades.Você também pode expandir esse tipo de esquema para apoiar mais estados de saída, se necessário.

@Nathan

Primeiro, veja se há outra chamada de API para determinar o status de saída...uma rápida olhada e não vejo nenhuma, mas não sou muito versado na API C padrão.

Uma alternativa fácil é ter uma variável global que armazene o status de saída...o padrão é uma causa de erro desconhecida (para se o programa terminar de forma anormal).Então, ao chamar exit, você pode armazenar o status de saída no global e recuperá-lo de qualquer função atexit.Isso requer o armazenamento diligente do status de saída antes de cada chamada de saída e claramente não é o ideal, mas se não houver API e você não quiser arriscar on_exit não estar na plataforma...pode ser a única opção.

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