¿Qué quiere decir con "iniciar un proceso en su propio grupo de procesos"? El shell inicia procesos en sus propios grupos de procesos, así es como controla el trabajo (al tener un grupo de procesos para los procesos en primer plano y varios grupos de procesos para cada canalización iniciada en segundo plano).
Para ver que el shell lanza un nuevo grupo de procesos para cada tubería, puede hacer esto:
ps fax -o pid,pgid,cmd | less
que mostrará algo como:
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
Tenga en cuenta que el shell ha creado un nuevo grupo de procesos para la canalización y todos los procesos de la canalización comparten el grupo de procesos.
Editar:
Creo que sé a lo que te refieres. Estás llamando a system
de Perl. Aparentemente, sh -c
no crea nuevos grupos de procesos, ya que es un shell sin control de trabajos.
Lo que haría sería fork
, luego en el niño:
setpgrp;
system("ps fax -o pid,pgid,cmd");
y wait
en el padre.
EDITAR:si lo que quería hacer era usar setsid pero encontrar la identificación de la sesión y/o el pid del proceso resultante:
Si inicia un proceso a través del comando setsid, no se adjuntará a su terminal, por lo que, por supuesto, no responderá a ctrl-c.
Puede encontrarlo haciendo grepping a través de la salida de
ps x -O sid
o algo más limitado como
ps x -o %c,%p,sid
O simplemente trolear a través de proc/[pid]/stat para todas las entradas y mirar la identificación de la sesión y cualquier otra cosa que sea de interés (ver man proc para más detalles)
La página de manual para setsid no proporciona ningún indicador para generar directamente la salida, pero puede hacer su propia versión de forma trivial que imprima la información deseada, modificando el estándar.
Por ejemplo, tome una copia de setsid.c de uno de los resultados para
http://www.google.com/codesearch?as_q=setsid&as_package=util-linux
Comente la inclusión de nls, las cosas de configuración regional y la macro de error _("") que causará problemas y luego agregue esto justo antes de la línea execvp:
printf("process will be pid %d sid %d\n", getpid(), getsid(0));