Por qué fork () antes de setsid()


¿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 procesos : uso setsid().

Hacer esto sin bifurcarse antes no funciona.

¿Por qué?

Author: jww, 2010-04-10

3 answers

En primer lugar: setsid() hará de tu proceso un líder de grupo de procesos, pero también te hará el líder de una nueva sesión. Si solo está interesado en obtener su propio grupo de procesos, use setpgid (0,0).

Ahora para entender la razón real por la que setsid() devuelve EPERM si ya es líder de grupo de procesos o líder de sesión, debe entender que los id de grupo de procesos y de sesión se inicializan a partir del id de proceso del proceso que los crea (y por lo tanto ellos, 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 permitiría crear 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 procesos de repente está en una sesión diferente a la que ellos mismos podrían estar. Y eso no se puede permitir, de ahí la EPERM por el núcleo.

Ahora si fork() una vez que ya no es líder de grupo de sesión ni de proceso y por lo tanto establecer su sid y pgid a su pid es seguro, porque no hay otros procesos en dicho grupo.

Entonces, yepp, piénsalo, todo tiene sentido.

 52
Author: user175104,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-10 18:38:19

Es necesario fork() y hacer que el hijo llame a setsid() para asegurarse de que el proceso que llama a setsid() no es ya un líder de grupo de procesos (setsid() quiere hacer que el proceso que llama sea el líder de grupo de procesos de un nuevo grupo de procesos, por lo que falla en ese caso).

 17
Author: caf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-10 11:55:42

man 2 setsid, obtendrá la siguiente descripción:

Setsid() crea una nueva sesión si el proceso que llama no es un líder de grupo de procesos. El proceso que llama es el líder de la nueva sesión, el líder del grupo de procesos del nuevo grupo de procesos, y no tiene terminal de control. El ID de grupo de proceso y el ID de sesión del proceso que llama se establecen en el PID del proceso que llama. El proceso de llamada será el único proceso en este nuevo grupo de procesos y en este nuevo sesion.

Si a un líder de grupo de procesos se le permite llamar a setsid(), crear una nueva sesión y un nuevo grupo de procesos(con el mismo id de grupo de procesos), provocará un conflicto de id de grupo de procesos.

 2
Author: zeekvfu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-05 07:47:48