Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

269
Visualizações
¿Deberíamos usar exit() en C?

Hay una pregunta sobre el uso de exit en C++. La respuesta discute que no es una buena idea principalmente debido a RAII, por ejemplo, si se llama a exit en algún lugar del código, no se llamará a los destructores de objetos, por lo tanto, si, por ejemplo, un destructor estaba destinado a escribir datos en un archivo, esto no lo hará suceder, porque el destructor no fue llamado.

Me interesó cómo es esta situación en C. ¿Se aplican problemas similares también en C? Pensé que dado que en C no usamos constructores/destructores, la situación podría ser diferente en C. Entonces, ¿está bien usar exit en C? Por ejemplo, he visto las siguientes funciones que a veces se usan en C:

 void die(const char *message) { if(errno) { perror(message); } else { printf("ERROR: %s\n", message); } exit(1); }
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

En lugar de abort() , la función exit() en C se considera una salida "elegante".

Desde C11 (N1570) 7.22.4.4/p2 La función de salida (énfasis mío):

La función de exit hace que se produzca la terminación normal del programa.

El Estándar también dice en 7.22.4.4/p4 que:

A continuación, se vacían todos los flujos abiertos con datos almacenados en búfer no escritos , se cierran todos los flujos abiertos y se eliminan todos los archivos creados por la función tmpfile .

También vale la pena mirar los archivos 7.21.3/p5:

Si la función main vuelve a su llamador original, o si se llama a la función de exit , todos los archivos abiertos se cierran (por lo tanto, todos los flujos de salida se vacían) antes de la finalización del programa. Otras rutas para la finalización del programa, como llamar a la función de abort , no necesitan cerrar todos los archivos correctamente.

Sin embargo, como se menciona en los comentarios a continuación, no puede asumir que cubrirá todos los demás recursos , por lo que es posible que deba recurrir a atexit() y definir las devoluciones de llamada para su lanzamiento individualmente. De hecho, es exactamente lo que pretende hacer atexit() , como dice en 7.22.4.2/p2 La función atexit :

La función atexit registra la función a la que apunta func , para ser llamada sin argumentos en la terminación normal del programa.

En particular, el estándar C no dice con precisión qué debería suceder con los objetos de duración de almacenamiento asignada (es decir malloc() ), por lo que requiere que sepa cómo se hace en una implementación particular. Para los sistemas operativos modernos orientados al host, es probable que el sistema se encargue de ello, pero aún así es posible que desee manejar esto usted mismo para silenciar los depuradores de memoria como Valgrind .

over 4 years ago · Santiago Trujillo Relatório

0

Sí, está bien usar exit en C.

Para garantizar todos los búferes y un cierre correcto y ordenado, se recomienda usar esta función atexit , más información sobre esto aquí

Un código de ejemplo sería así:

 void cleanup(void){ /* example of closing file pointer and free up memory */ if (fp) fclose(fp); if (ptr) free(ptr); } int main(int argc, char **argv){ /* ... */ atexit(cleanup); /* ... */ return 0; }

Ahora, cada vez que se llame a exit , se ejecutará la función de cleanup , que puede albergar un apagado correcto, limpieza de búferes, memoria, etc.

over 4 years ago · Santiago Trujillo Relatório

0

No tiene constructores ni destructores, pero podría tener recursos (por ejemplo, archivos, flujos, sockets) y es importante cerrarlos correctamente. Un búfer no se puede escribir de forma síncrona, por lo que salir del programa sin cerrar correctamente el recurso primero podría provocar daños.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda