Cosa intendi per "avviare un processo nel proprio gruppo di processi"? La shell avvia i processi nei propri gruppi di processi, ecco come esegue il controllo dei processi (avendo un gruppo di processi per i processi in primo piano e diversi gruppi di processi per ogni pipeline avviata in background).
Per vedere che la shell lancia un nuovo gruppo di processi per ogni pipeline, puoi fare questo:
ps fax -o pid,pgid,cmd | less
che mostrerà qualcosa come:
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
Tieni presente che la shell ha creato un nuovo gruppo di processi per la pipeline e ogni processo nella pipeline condivide il gruppo di processi.
Modifica:
Penso di sapere a cosa stai arrivando. Stai chiamando system
di Perl. A quanto pare, sh -c
non crea nuovi gruppi di processi, poiché è una shell senza controllo del lavoro.
Quello che farei sarebbe fork
, quindi sul figlio:
setpgrp;
system("ps fax -o pid,pgid,cmd");
e wait
sul genitore.
EDIT:se quello che volevi fare era utilizzare setsid ma trovare l'id di sessione e/o il pid del processo risultante:
Se avvii un processo tramite il comando setsid, non verrà collegato al tuo terminale, quindi ovviamente non risponderà a ctrl-c.
Potresti trovarlo sfogliando l'output di
ps x -O sid
o qualcosa di più limitato come
ps x -o %c,%p,sid
O semplice trolling attraverso proc/[pid]/stat per tutte le voci e guardando l'id della sessione e qualsiasi altra cosa sia di interesse (vedi man proc per i dettagli)
La pagina man per setsid non fornisce alcun flag per generare direttamente l'output, ma potresti banalmente creare la tua versione che stampa le informazioni desiderate, modificando lo standard.
Ad esempio, prendi una copia di setsid.c da uno dei risultati per
http://www.google.com/codesearch?as_q=setsid&as_package=util-linux
Commenta nls include, le impostazioni locali e la macro di errore _("") che causerà problemi e quindi aggiungi questo subito prima della riga execvp:
printf("process will be pid %d sid %d\n", getpid(), getsid(0));