Was meinst du mit "einen Prozess in einer eigenen Prozessgruppe starten"? Die Shell startet Prozesse in ihren eigenen Prozessgruppen, so übernimmt sie die Jobsteuerung (indem sie eine Prozessgruppe für Prozesse im Vordergrund und mehrere Prozessgruppen für jede im Hintergrund gestartete Pipeline hat).
Um zu sehen, dass die Shell für jede Pipeline eine neue Prozessgruppe startet, können Sie Folgendes tun:
ps fax -o pid,pgid,cmd | less
das zeigt so etwas wie:
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
Beachten Sie, dass die Shell eine neue Prozessgruppe für die Pipeline erstellt hat und jeder Prozess in der Pipeline die Prozessgruppe gemeinsam nutzt.
Bearbeiten:
Ich glaube ich weiß worauf du hinaus willst. Sie rufen system
an von Perl. Anscheinend sh -c
erstellt keine neuen Prozessgruppen, da es sich um eine Shell ohne Jobkontrolle handelt.
Was ich tun würde, wäre fork
, dann auf das Kind:
setpgrp;
system("ps fax -o pid,pgid,cmd");
und wait
auf dem Elternteil.
BEARBEITEN:Wenn Sie setsid verwenden wollten, aber die Sitzungs-ID und/oder PID des resultierenden Prozesses finden:
Wenn Sie einen Prozess über den Befehl setsid starten, wird er nicht an Ihr Terminal angehängt, daher reagiert er natürlich nicht auf Strg-C.
Sie können es finden, indem Sie die Ausgabe von
durchsuchenps x -O sid
oder etwas eingeschränkteres wie
ps x -o %c,%p,sid
Oder einfach durch proc/[PID]/stat nach allen Einträgen suchen und sich die Session-ID und was sonst noch Interessantes ansieht (siehe man proc für Details)
Die Manpage für setsid gibt keine Flags zum direkten Generieren von Ausgaben an, aber Sie könnten trivialerweise Ihre eigene Version erstellen, die die gewünschten Informationen ausdruckt, indem Sie den Standard ändern.
Holen Sie sich zum Beispiel eine Kopie von setsid.c aus einem der Ergebnisse für
http://www.google.com/codesearch?as_q=setid&as_package=util-linux
Kommentieren Sie das nls-Include, das Locale-Zeug und das _("")-Fehlermakro aus, das Probleme verursachen wird, und fügen Sie dann Folgendes direkt vor der execvp-Zeile hinzu:
printf("process will be pid %d sid %d\n", getpid(), getsid(0));