Diferencia entre el comando de salida de Linux y el comando _exit

  
                

En el comando del sistema Linux, el comando exit y el comando _exit parecen ser los mismos, pero la diferencia entre el comando exit y el comando _exit es diferente. Vamos a conocerlo.

NOTA: exit () es el parámetro de código de estado de salida pasan al salir del programa, 0 representa una salida normal, el otro representa una salida no normal, por lo general con 1 o -1, estándar C Hay dos macros EXIT_SUCCESS y EXIT_FAILURE, con exit (EXIT_SUCCESS); la legibilidad es mejor.

Como llamada al sistema, _exit y exit son un par de hermanos gemelos. En qué medida son similares, podemos encontrar la respuesta en el código fuente de Linux:

#define __NR__exit __NR_exit /* Extracto del archivo incluye /asm-i386 /unistd.h línea 334 * /

" __ NR_ " es el prefijo para cada llamada al sistema en el código fuente de Linux, tenga en cuenta que hay antes de la primera salida 2 subrayados, solo un subrayado antes de la segunda salida. Cualquiera que sepa C y tenga la cabeza clara dirá que no hay diferencia entre _exit y exit, pero hablemos de la diferencia entre los dos, que se refleja principalmente en su definición en la biblioteca. El prototipo de _exit en la biblioteca de Linux es:

#i nclude "unistd.h" void _exit (estado int);

Comparada con exit, la función exit () está definida en stdlib. h, y _exit () se define en unistd.h. Desde el nombre, stdlib.h parece ser un poco más alto que unistd.h. Entonces, ¿cuál es la diferencia entre ellos? La función _exit () es la más simple: para detener el proceso directamente, despejar el espacio de memoria que utiliza y destruir sus diversas estructuras de datos en el kernel; la función exit () crea algunas envolturas en estos cimientos, Algunos pasos se agregaron antes de la salida y, por este motivo, algunas personas piensan que salir no es una simple llamada al sistema. La mayor diferencia entre la función exit () y la función _exit () es que la función exit () comprueba la apertura del archivo antes de llamar a la llamada del sistema exit, y vuelve a escribir el contenido del búfer en el archivo, es decir, "limpia la E /S". Buffer y ".

exit () Antes de finalizar el proceso que lo llamó, realice los siguientes pasos:

1. Llame a la función registrada por atexit () (función de exportación); llame en el orden inverso al registro ATEXIT Todas las funciones registradas por él, lo que nos permite especificar que realizaremos nuestras propias acciones de limpieza cuando finalice el programa. Por ejemplo, guardar la información de estado del programa en un archivo, desbloquear bloqueos en una base de datos compartida, etc.

2.cleanup (); cierra todas las secuencias abiertas, lo que provocará que se escriba toda la salida en búfer, y se eliminarán todos los archivos temporales creados con la función TMPFILE.

3. Finalmente, se llama a la función _exit () para finalizar el proceso.

_exit hace 3 cosas (man): 1, todos los descriptores de archivos abiertos que pertenecen al proceso están cerrados 2, cualquier proceso secundario es heredado por el proceso 1, init 3, se envía el padre del proceso una señal SIGCHLD

salir Después de que se realiza la limpieza, se llama a _exit para finalizar el proceso.

Además, otra explicación:

En pocas palabras, la función de salida terminará el proceso de llamada. Antes de salir del programa, todos los archivos se cierran, la salida almacenada en búfer actualizará la definición y se llamarán todas las funciones actualizadas de < export " (definidas por atexit).

_exit: esta función está definida por Posix y no ejecuta manejadores de salida ni manejadores de señales. No descarga flujos de E /S estándar en sistemas UNIX.

En pocas palabras, _exit finaliza el proceso de llamada, pero no cierra el archivo, no borra la caché de salida y no llama a la función de salida.

Común:

Independientemente de cómo termine el proceso, el núcleo cerrará todos los descriptores de archivos abiertos por el proceso, ¡liberando la memoria utilizada por el proceso!
Anterior12Siguiente Total 2 Páginas

Copyright © Conocimiento de Windows All Rights Reserved