Co tím myslíte "spustit proces ve vlastní skupině procesů"? Shell spouští procesy v jejich vlastních skupinách procesů, tak to řídí úlohy (tím, že má skupinu procesů pro procesy v popředí a několik skupin procesů pro každý kanál spuštěný na pozadí).
Chcete-li vidět, že shell spouští novou skupinu procesů pro každý kanál, můžete to udělat takto:
ps fax -o pid,pgid,cmd | less
což ukáže něco jako:
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
Všimněte si, že shell vytvořil novou skupinu procesů pro kanál a každý proces v kanálu sdílí skupinu procesů.
Upravit:
Myslím, že vím, na co narážíš. Voláte system
z Perlu. Zřejmě sh -c
nevytváří nové skupiny procesů, protože je to shell bez řízení úloh.
Co bych udělal, by bylo fork
, pak na dítě:
setpgrp;
system("ps fax -o pid,pgid,cmd");
a wait
na rodiči.
EDIT:Pokud jste chtěli použít setsid, ale najít ID relace a/nebo pid výsledného procesu:
Pokud spustíte proces pomocí příkazu setsid, nebude připojen k vašemu terminálu, takže samozřejmě nebude reagovat na ctrl-c.
Můžete to najít procházením výstupu
ps x -O sid
nebo něco omezenějšího jako
ps x -o %c,%p,sid
Nebo jednoduchým trollingem přes proc/[pid]/stat pro všechny položky a prohlížením ID relace a čehokoli dalšího, co vás zajímá (podrobnosti viz man proc)
Manuálová stránka pro setsid neposkytuje žádné příznaky pro přímé generování výstupu, ale můžete si triviálně vytvořit svou vlastní verzi, která vytiskne požadované informace, úpravou standardu.
Například vezměte kopii setsid.c z jednoho z výsledků pro
http://www.google.com/codesearch?as_q=setsid&as_package=util-linux
Zakomentujte nls include, locale a makro chyby _(""), které způsobí problémy, a poté přidejte toto přímo před řádek execvp:
printf("process will be pid %d sid %d\n", getpid(), getsid(0));