Programación del entorno Linux - perror, exit,

  
 

perror: # include < stdio.h > # include < stdlib.h >

Definición de funciones

void perror (const char * s); perror (" open_port ");

Descripción de la función

perror () se utiliza para enviar el motivo del error de la función anterior a error estándar (stderr)
. La cadena a la que apunta el parámetro s se imprimirá primero, seguida de la cadena de motivo de error. La causa de este error es la cadena que debe enviarse de acuerdo con el valor del error de variable global. Hay una variable de error en la función de biblioteca, y cada valor de error corresponde al tipo de error representado por una cadena. Cuando llama al error de función " algún ", la función ha restablecido el valor del error. La función perror simplemente genera parte de la información que ingresó con el error correspondiente al error actual. Salir: (# include < stdlib.h >) En la función principal de C usualmente usamos return (0), de esta manera devuelve un valor. Pero esto se limita a situaciones no vacías, es decir, main () no nulas. Exit () se usa generalmente en la subrutina para finalizar el programa. Después de su uso, el programa finaliza automáticamente y salta de OS
. Salir (0) significa que el programa sale normalmente, salida (1) /salir (-1) significa que el programa sale de forma anormal. Exit () Finaliza el proceso actual /programa actual /, y finaliza en todo el programa tan pronto como se llama a exit. Pero si usa exit en main, independientemente de si main está definido como nulo, el valor devuelto es válido, y exit no necesita considerar el tipo, exit (1) es equivalente a return (1). Por ejemplo: # include < stdlib.h > int main () {exit (1); //equivalente a return (1);} exit () es una función que finaliza un proceso que eliminará el espacio de memoria utilizado por el proceso. Al mismo tiempo, el mensaje de error se devuelve al proceso principal y la llamada de espera del sistema recibirá el mensaje de retorno en el proceso principal.

El proceso es como la vida humana. Creamos un proceso a través de la función fork (), ¿entonces cómo detenemos el proceso?

Proceso de salida

1. Permita que cualquier proceso salga en Linux

El proceso se cierra para indicar que el proceso está a punto de finalizar. En Linux, la salida del proceso se divide en salida normal y salida anormal.

1> Salida normal

a. Realice el retorno en la función main ().


b. Llamar a la función exit () #include < stdlib.h > void exit (estado int) -

c.call la función _exit () #include < unistd.h > void _exit (int status)

status es un parámetro entero que se puede usar para pasar el estado al final del proceso. En general, 0 significa final normal, otros valores indican un error y el proceso finaliza de forma anormal. En la programación real, puede utilizar la llamada del sistema de espera para recibir el valor de retorno del proceso hijo, por lo que el procesamiento diferente para diferentes situaciones

2> Salida de excepción

a. Llame a la función about

b. El proceso recibe una señal que hace que el programa finalice.

Tiger-John Descripción: Independientemente del método de salida, el sistema eventualmente ejecutará el mismo código en el núcleo. Este código se utiliza para cerrar el descriptor de archivo abierto utilizado por el proceso, liberando la memoria y otros recursos que ocupa.



3 > Compara las diferencias entre los métodos de salida anteriores

(1) La diferencia entre exit y return:

A.exit es una función con parámetros. Después de que se ejecuta la salida, se le da el control al sistema.

b.return es el retorno después de que se ejecuta la función. Después de que se ejecuta el renturn, el control se da a la función de llamada.

(2) La diferencia entre salir y abortar:

a.exit es el proceso de terminación normal

b.about es una terminación anormal.



Ahora nos centramos en las funciones exit () y _exit ()


2.exit () y _ Las funciones exit () learning

1 > exit y _exit se utilizan para finalizar el proceso.

Cuando el programa se ejecuta para salir o salir, el sistema detiene incondicionalmente todas las operaciones, borra varias estructuras de datos, incluida la PCB, y finaliza la operación del proceso.

2 > exit se declara en el archivo de encabezado stdlib.h, y la declaración _exit () se declara en el archivo de encabezado unistd.h. El parámetro exit_code en exit es 0 para indicar que el proceso termina normalmente. Si otros valores indican que ocurrió un error durante la ejecución del programa.

3 > La diferencia entre exit () y _exit ():

a._exit () regresa al kernel inmediatamente después de la ejecución, y exit () realiza primero una limpieza, luego Se le da el control al kernel.

b. Cuando se llama a la función _exit, cerrará todos los descriptores de archivos del proceso, limpiará la memoria y otras funciones de limpieza del kernel, pero no actualizará la secuencia (stdin, stdout, stderr ...). exit Una función es una envoltura alrededor de la función _exit que llama a _exit y vacía la transmisión antes de llamarla.

Tiger-John Descripción:

La mayor diferencia entre la función exit () y la función _exit () es que la función exit () comprueba el archivo abierto antes de llamar al sistema de salida, almacenando en el búfer el archivo. El contenido del área se vuelve a escribir en el archivo. Debido a la biblioteca estándar de Linux, hay una operación llamada "I /O de búfer", que se caracteriza por un búfer en la memoria para cada archivo abierto. Cada vez que se lee un archivo, se leen varios registros de manera continua, de modo que la próxima vez que se lee el archivo, se puede leer directamente desde el búfer de la memoria, de igual manera, cada vez que se escribe el archivo, es solo un búfer escrito en la memoria. Espere una determinada condición (como alcanzar un cierto número o encontrarse con un carácter específico, etc.) y luego escriba el contenido del búfer en el archivo a la vez. Esta técnica aumenta considerablemente la velocidad de lectura y escritura de archivos, pero también trae un poco de problemas a la programación. Por ejemplo, si hay algunos datos, se considera que el archivo se ha escrito. De hecho, debido a que no se cumplen las condiciones específicas, solo se almacenan en el búfer. En este caso, el proceso se cierra directamente mediante la función _exit () y se pierden los datos del búfer. . Por lo tanto, para garantizar la integridad de sus datos, debe utilizar la función exit ().

c. Echa un vistazo a las diferencias entre ellos mediante una instancia de función:

instancia de función 1: exit.c

1 # include < stdio.h > 2 # Incluya < stdlib.h > 3 4 int main () 5 {6 printf (" utilizando exit ---- \\ n "); 7 printf (" Este es el contenido del búfer \\ n "); 8 exit (0 ); 9}

La función se ha depurado

$ gcc exit.c -o exit $ ./exit

El resultado de la ejecución es:

usando exit ---- Este es el contenido del búfer

instancia de función 2: _exit.c

1 # include < stdio.h > 2 # include < unistd.h > 3 4 int main ( Void) 5 {6 printf (" using _exit - \\ n "); 7 printf (" Este es el contenido del búfer "); 8 _exit (0); 9} Después de que la función se haya depurado

$ gcc _exit.c -o _exit $ ./_exit

Los resultados de ejecución son:

usando _exit--

Tiger-John Descripción:

1 La función .printf es una forma de usar E /S en búfer, que lee automáticamente el registro del búfer cuando encuentra un carácter de nueva línea. Entonces, exit () saldrá después de que se hayan escrito los datos del búfer, y la función _exit () saldrá directamente.

2. También puede cambiar printf (" Este es el contenido del búfer "); en la instancia de la función 2 a printf (" Este es el contenido del búfer \\ n ") (es decir, en printf Al final, agregue un \\ n para ver cuál es el resultado, ¿por qué sucede esto?)



Después de que un proceso salga, el proceso no desaparece por completo de inmediato. Es una estructura de datos llamada proceso zombie. El proceso zombie es un proceso muy especial: casi ha abandonado todo el espacio de memoria, no tiene código ejecutable, no se puede programar, solo mantiene una posición en la lista de procesos, registra el estado de salida del proceso y otra información para otros procesos. Recoge, además, el proceso zombie ya no ocupa ningún espacio de memoria. La función de espera de espera

se usa para bloquear el proceso principal (es decir, el proceso que llamó espera) hasta que finaliza un proceso secundario o el proceso recibe una señal específica. Si el proceso principal no tiene procesos secundarios o sus procesos secundarios han finalizado, la espera regresará inmediatamente. #include < sys /types.h > #include < sys /wait.h > pid_t wait (int * status) waitpid waitpid funciona igual que wait, pero no tiene que esperar el primer proceso secundario terminado. También tiene varias opciones, como una versión sin bloqueo de la función de espera, así como el control de trabajos. De hecho, la función de espera es solo un caso especial de la función waitpid. La función de waitpid se llama directamente cuando la función de espera se implementa dentro de Linux. #include < sys /types.h > #include < sys /wait.h > pid_t waitpid (pid_t pid, int * status, int opciones)

Copyright © Conocimiento de Windows All Rights Reserved