funcion - system syscall
Por qué tenedor() antes de setsid() (3)
¿Por qué fork()
antes de setsid()
para demonizar un proceso?
Básicamente, si quiero separar un proceso de su terminal de control y convertirlo en un líder de grupo de proceso: uso setsid()
.
Hacer esto sin bifurcar antes no funciona.
¿Por qué?
En primer lugar: setsid () hará que su proceso sea un líder de grupo de proceso, pero también lo convertirá en el líder de una nueva sesión. Si solo está interesado en obtener su propio grupo de procesos, entonces use setpgid (0,0).
Ahora, para comprender la razón real por la que setsid () devuelve EPERM si ya es líder del grupo de procesos o sesión, debe comprender que el grupo de procesos y los identificadores de sesión se inicializan a partir de la identificación del proceso del proceso que los crea (y, por lo tanto, los lidera, es decir para un líder de sesión pid == sid y para un líder de grupo de proceso pid == pgid). Además, los grupos de procesos no pueden moverse entre sesiones.
Eso significa que si usted es un líder de grupo de procesos, y se crearía una nueva sesión, entonces el sid y el pgid se establecerían en su pid, dejando a los otros procesos en su antiguo grupo de procesos en un estado extraño: su líder de grupo de proceso repentinamente está en una sesión diferente, entonces ellos mismos podrían estarlo. Y eso no se puede permitir, de ahí el EPERM por kernel.
Ahora bien, si fork () ya no es ni la sesión ni el líder del grupo de procesos y, por lo tanto, configurar su sid y pgid para su pid es seguro, porque no hay otros procesos en dicho grupo.
Entonces, yepp, piénselo, todo tiene sentido.
Se requiere fork()
y hacer que el niño setsid()
para garantizar que el proceso llamando a setsid()
ya no sea un líder de grupo de proceso ( setsid()
quiere hacer del proceso de llamada el líder del grupo de proceso de un nuevo proceso grupo, por lo que falla en ese caso).
man 2 setsid
, obtendrás la siguiente descripción:
setsid () crea una nueva sesión si el proceso de llamada no es un líder de grupo de proceso. El proceso de llamada es el líder de la nueva sesión, el líder del grupo de procesos del nuevo grupo de procesos, y no tiene una terminal de control. El ID del grupo de procesos y el ID de sesión del proceso de llamada se configuran en el PID del proceso de llamada. El proceso de llamada será el único proceso en este nuevo grupo de procesos y en esta nueva sesión.
Si un líder del grupo de procesos puede llamar a setsid()
, crear una nueva sesión y un nuevo grupo de procesos (con el mismo ID de grupo de procesos), se generará un conflicto de id de grupo de procesos.