Programación del sistema Linux 01

1 función de horquilla

1.1 Introducción al uso de la función fork

Prototipo de función: pid_t fork (void) pid_t es un identificador devuelto, que puede definirse de manera diferente en diferentes plataformas, puede ser de tipo int o long, etc. pid_t se define en sys / types.h

	pid_t pid = fork();
	if (pid == 0) {//子进程
	}
	if(pid>0){ //父进程,此时pid的值是子进程的id号

	}
	if(pid==-1){  //此时创建子进程失败

	}

Razones por las que falla el proceso de creación de la bifurcación: el número de procesos excede el límite o el espacio de memoria es insuficiente

1.2 fork crea un problema de espacio de proceso compartido

Al principio, el proceso hijo creado por fork es diferente del proceso padre, excepto para pcb. El resto del espacio sigue el uso compartido al leer y copiar al escribir. El descriptor de archivo se comparte.

1.3 El problema de los procesos de zombis y huérfanos causados ​​por la creación de procesos secundarios

Proceso zombi: después de que el proceso secundario finaliza antes que el proceso primario, el PCB del proceso secundario necesita que se libere su proceso primario, pero el proceso primario no libera el PCB del proceso secundario. Dicho proceso secundario se denomina proceso zombie. Proceso muerto, pero aún ocupa espacio en la memoria

Proceso huérfano: un proceso padre se cierra mientras uno o más de sus procesos hijos todavía se están ejecutando, luego esos procesos hijos se convertirán en procesos huérfanos. El proceso huérfano será adoptado por el proceso init (proceso número 1), y el proceso init completará el trabajo de recopilación de estado para ellos, y no ocupará la ID como un proceso zombie, lo que dañará el sistema en ejecución.

Formas de resolver el proceso zombie:

  • Elimine el proceso padre, los recursos del proceso hijo serán recuperados por el proceso init, pero generalmente el proceso padre es un programa de servidor, es imposible usar esta forma violenta
  • Use la función wait o waitpid en el proceso padre, use la función wait para recuperar recursos hará que el proceso padre se bloquee, el uso razonable de la función waitpid no hará que el proceso padre se bloquee
  • Al usar el procesamiento de la señal, cuando el proceso secundario sale, enviará la señal SIGCHLD como el proceso principal, por lo que podemos establecer el método de procesamiento de esta señal al comienzo del programa, pero cuando llegan varias señales al mismo tiempo, puede causar la pérdida de la señal.

2 función de espera y función waitpid

2.1 Introducción

Cuando finaliza un proceso, cerrará todos los descriptores de archivos y liberará la memoria asignada en el espacio del usuario, pero su PCB aún lo conserva. El kernel guarda cierta información en él: si se termina normalmente, el estado de salida se guarda, si se termina anormalmente Luego se guarda la señal que provocó la finalización del proceso. El proceso principal de este proceso puede llamar a wait o waitpid para obtener esta información y luego borrar completamente el proceso

2.1 espera

Esta función tiene tres funciones:

  • Bloquear esperando que el proceso hijo salga
  • Recuperar recursos residuales de subprocesos
  • Obtenga el estado final del proceso secundario (motivo de salida).

Una vez que se llama a esperar, se bloqueará aquí hasta que salga un proceso hijo

Prototipo de la función:

pid_t wait(int *status);   //如果不关心程序退出的状态,可以传入NULL

成功:清理掉的子进程ID;失败:-1 (没有子进程)

Use la función de espera para pasar el estado del parámetro para guardar el estado de salida del proceso (terminación normal → valor de salida; terminación anormal → señal de terminación). Con la ayuda de funciones macro para determinar aún más la causa específica de la terminación del proceso, las funciones macro se refieren al comando man en Linux

2.2 waitpid

Prototipo de la función:

pid_t waitpid(pid_t pid,int *status,int options);

//第一个参数
pid<-1  等待进程组号为pid绝对值的任何子进程
pid=-1  等待任何子进程,此时的waitpid()函数就退化成了普通的wait()函数。
pid=0   等待进程组号与目前进程相同的任何子进程,也就是说任何和调用waitpid()函数的进程在同一个进程组的进程。
pid>0   等待进程号为pid的子进程。

//第二个参数需要搭配具体的宏函数来获得其状态,如果不关心具体的状态则传入NULL

//第三个参数,其参数可以用 “|” 运算符连接起来使用。
WNOHANG  如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
WUNTRACED	如果子进程进入暂停状态,则马上返回。

Si la función waitpid () se ejecuta con éxito, se devuelve el número de proceso del proceso secundario; si se produce un error, se devuelve -1 y la causa del error se almacena en la variable errno.

Las principales razones de la falla son: ningún proceso secundario (errno está configurado en ECHILD), la llamada se interrumpe por una señal (errno está configurado en EINTR) o el parámetro de opción no es válido (errno está configurado en EINVAL)

waitpid (-1, estado, 0) Degenerar equivalente a esperar (estado)

3 clúster de funciones ejecutivas

Blog de referencia: https://blog.csdn.net/amoscykl/article/details/80354052

 

123 artículos originales publicados · 31 elogiados · 90,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/qq_40794602/article/details/104646846
Recomendado
Clasificación