Que voulez-vous dire par "démarrer un processus dans son propre groupe de processus" ? Le shell lance les processus dans leurs propres groupes de processus, c'est ainsi qu'il contrôle les tâches (en ayant un groupe de processus pour les processus au premier plan et plusieurs groupes de processus pour chaque pipeline lancé en arrière-plan).
Pour voir que le shell lance un nouveau groupe de processus pour chaque pipeline, vous pouvez faire ceci :
ps fax -o pid,pgid,cmd | less
qui affichera quelque chose comme :
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
Notez que le shell a créé un nouveau groupe de processus pour le pipeline et que chaque processus du pipeline partage le groupe de processus.
Modifier :
Je pense que je sais où vous voulez en venir. Vous appelez le system
de Perle. Apparemment, sh -c
ne crée pas de nouveaux groupes de processus, car il s'agit d'un shell sans contrôle des tâches.
Ce que je ferais serait de fork
, puis sur l'enfant :
setpgrp;
system("ps fax -o pid,pgid,cmd");
et wait
sur le parent.
EDIT :si vous vouliez utiliser setsid mais trouver l'identifiant de session et/ou le pid du processus résultant :
Si vous lancez un processus via la commande setsid, il ne sera pas attaché à votre terminal, donc bien sûr il ne répondra pas à ctrl-c.
Vous pouvez le trouver en parcourant la sortie de
ps x -O sid
ou quelque chose de plus limité comme
ps x -o %c,%p,sid
Ou simplement parcourir proc/[pid]/stat pour toutes les entrées et regarder l'identifiant de session et tout ce qui vous intéresse (voir man proc pour plus de détails)
La page de manuel de setsid ne donne aucun indicateur pour générer directement la sortie, mais vous pouvez créer votre propre version trivialement qui imprime les informations souhaitées, en modifiant la norme.
Par exemple, récupérez une copie de setsid.c à partir de l'un des résultats pour
http://www.google.com/codesearch?as_q=setsid&as_package=util-linux
Commentez l'inclusion nls, les paramètres régionaux et la macro d'erreur _("") qui causera des problèmes, puis ajoutez ceci juste avant la ligne execvp :
printf("process will be pid %d sid %d\n", getpid(), getsid(0));