Proceso de Linux en espera, reemplazo de programa

1. Proceso en espera

El llamado proceso en espera es el proceso padre que espera a que salga el proceso hijo. El propósito del proceso padre que espera a que salga el proceso hijo es:

  1. Obtenga el valor de retorno de salida del proceso hijo
  2. Libere los recursos del proceso hijo para evitar procesos zombies. (Los procesos zombies provocarán pérdidas de memoria)

Hay dos formas de esperar un proceso, que se describen a continuación:

  1. pid_t esperar (int * estado);

Espere a que salga cualquier proceso secundario (siempre que haya procesos secundarios, se procesará).

Lista de parámetros: estado (puntero): Obtiene el valor de retorno de la salida del proceso hijo.
Valor de retorno: pid_t se divide en 2 casos:
(1) Si tiene éxito, devuelve el pid del proceso hijo
(2) Si falla, devuelve -1

La interfaz de espera es una función de bloqueo. El llamado bloqueo es para completar una función e iniciar una llamada. Si las condiciones de finalización no se cumplen actualmente, esperará para siempre. (Es como ir al jardín de infancia a recoger a tu bebé. Si no recibes a tu bebé, siempre esperarás (es imposible que esperes un rato y te vayas directamente a casa)).

  1. pid_t waitpid (pid_t pid, int * status, int options);
    Puede esperar a que salga cualquier proceso hijo o puede esperar a que salga un proceso hijo especificado. La interfaz se puede bloquear de forma predeterminada o no se puede bloquear de forma predeterminada.

El llamado no bloqueo consiste en completar una función e iniciar una llamada.Si las condiciones de finalización no se cumplen actualmente, se devolverá un error.

lista de parámetros:

  1. pid_t pid: cuando pid = -1, significa esperar cualquier proceso hijo; cuando pid> 0, significa esperar el proceso hijo especificado.
  2. status: Obtiene el valor de retorno de salida del proceso hijo. Este puntero de estado contiene el valor de retorno de salida (alto 8 bits), archivo de volcado de núcleo (1 bit) y valor de señal anormal (bajo 7 bits);

Notas: Para el valor de la señal anormal, cuando el valor de la señal anormal es 0, significa que el proceso sale normalmente, si no es 0, significa que el proceso sale anormalmente.

Hay dos formas de obtener el valor de la señal de salida anormal:

  1. (Recomendado) Utilice la interfaz de llamada del sistema: WIFEXITED (estado) / WEXITEDSTATUS (estado)
  2. Operaciones lógicas y operaciones de turno: estado y 0x7f / (estado >> 8) y 0xff

Notas: el archivo de volcado del núcleo guarda la información y los datos del proceso cuando el programa se cierra de forma anormal, lo que es conveniente para gdb posteriores.

  1. opciones: 0 significa bloqueo de espera de forma predeterminada; WHOHANG se puede establecer en no bloqueo.

Valor de retorno pid_t:

Cuando el valor de retorno es mayor que 0, significa salir del pid del proceso hijo. Cuando el valor de retorno es igual a 0, significa que no sale ningún proceso hijo. El error devuelve -1.

Echemos un vistazo al funcionamiento del código de estas dos interfaces:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Notas: Aquí establezca directamente el tercer parámetro de waitpid en WNOHANG, si options = 0, en realidad no es diferente de wait.

El proceso zombie aún se generará después de que se ejecute el código anterior
Inserte la descripción de la imagen aquí
porque waitpid espera cualquier proceso secundario y luego lo procesa directamente, y el proceso secundario posterior no se puede procesar y se convierte en un proceso zombie. Para evitar esta situación, agregue un bucle a waitpid:

Inserte la descripción de la imagen aquí

Obteniendo estatus:

Inserte la descripción de la imagen aquí
Aquí, después de obtener el valor de retorno de la salida del proceso hijo con éxito, el valor de estado es 99 (accidentalmente perdí el resultado ... un poco vergonzoso).

Dos, reemplazo de programa

El reemplazo de procesos consiste en reemplazar un programa cuya ejecución está programada para un proceso. Cargue un nuevo programa en el contenido, actualice la información de mapeo de la tabla de páginas del proceso actual y deje que el proceso actual mapee al programa.

Inserte la descripción de la imagen aquí

grupo de funciones ejecutivas:

Inserte la descripción de la imagen aquí
El primer parámetro: el nombre de la ruta del nuevo archivo de programa El
segundo parámetro: los parámetros operativos del programa El
tercer parámetro: las variables de entorno del programa.

Por ejemplo:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
podemos ver que el resultado de la ejecución del código anterior no imprime "Linux true tm es difícil" porque el comando ls se ejecuta después de que se reemplaza execl, y sale directamente después de la ejecución, por lo que no se imprime "Linux true tm es difícil "

En el clúster de funciones, la diferencia entre execl y execlp radica en si el archivo del programa necesita una ruta. Cuando hay una p, la ruta se puede omitir, pero hay una restricción de que el programa debe estar en la ruta especificada por el entorno PATH. variable.

Inserte la descripción de la imagen aquí
La diferencia entre execle y execl radica en
si el programa establece sus propias variables de entorno, si hay e, se establece por sí mismo (anular), y si no hay e, usa la ruta predeterminada.

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Podemos ver que cuando usamos execle, solo queda una variable de entorno, que es configurada por nosotros mismos.

La diferencia entre execl y execv radica en la forma en que los
parámetros de ejecución del programa se dan de manera diferente, yv es una matriz de punteros de cadena.

Supongo que te gusta

Origin blog.csdn.net/xhuyang111/article/details/115322643
Recomendado
Clasificación