¿Está bien usar exit (1) para cancelar el programa o debería intentar devolver 1 desde main ()?

He usado exit(1) extensamente en mi código porque hace (espero) exactamente lo que quiero: abortar el programa. Muy bien imprimo un mensaje de error (o lo pongo en stderr), y luego simplemente me voy.

Pero escuché algunas escuelas de pensamiento que esto es malo por alguna razón y no entiendo por qué. La cantidad de trabajo que uno necesitaría para devolver un valor de error de cada función donde sea posible, y luego navegar a través de los retornos en cascada a la pantalla principal para que el programa salga "naturalmente"... ¿Hay alguna diferencia?

¿Hay escenarios específicos en los que importa? Incluso cuando uso errno y perror(), todavía es mucho más fácil simplemente salir (1) desde el punto donde ocurrió el error y sin hacer que el código sea menos legible.

¿Tengo su bendición para usar exit(1) ?

Answer

Es una elección que debes hacer por ti mismo.

Si está escribiendo una biblioteca, realmente debe informar la falla a la persona que llama, que puede recuperarse de maneras que usted no puede internamente, y que podría necesitar realizar otra limpieza que no realizan los atexit()controladores registrados.

Si su código puede llamarse desde C ++ u otros lenguajes de alto nivel, entonces, de nuevo, no salga unilateralmente, ya que eso evita que los destructores se ejecuten para realizar una limpieza similar.

Cuando verifique el uso de la memoria con Valgrind, exit()dejará muchos objetos en el estado "todavía accesible", lo que dificultará encontrar sus fugas reales.

Por lo tanto, generalmente recomiendo regresar de main(), pero toleraría algún uso exit()en el código específico del programa que nunca terminará en una biblioteca.

La función de biblioteca C void exit(int status);finaliza el proceso de llamada inmediatamente. Cualquier descriptor de archivo abierto que pertenezca al proceso se cierra y los hijos del proceso son heredados por el proceso 1, init, y el padre del proceso recibe una señal SIGCHLD.

Por lo tanto, sabemos que la exit()función hace que se elimine el programa actual, pero recuerda free()todos los recursos asignados al montón ( si puedes ) antes de llamar a la exit()función. Entonces, usar el exit()está absolutamente bien.