Unterschied zwischen Prozess-Gruppen-id und Auftrags-id in UNIX
Bitte sagen Sie mir den Unterschied zwischen einem Prozess-Gruppen-ID und eine jobid. Ist jobid eine vordefinierte shell-Programm oder ist das mit dem kernel? Was sind die Verwendungen von jedem von Ihnen? Wenn ein Prozess im hintergrund laufen, ist nur jobid festgelegt ist oder die pgid-set so gut?
Was sind die Verwendungen des setpgid () - Funktion?
Werden, wenn ein Prozess im hintergrund laufen, ist der kernel auch beteiligt oder hat die Schale kümmern sich um die hintergrund-oder Vordergrund?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gute Fragen. Die Auftrags-id wird zumeist nur eine Hülle zu konstruieren. Es ist die Unterstützung in den kernel in der form der Signale, die beteiligt sind, in die job-Kontrolle, und die Art und Weise, in der der kernel weiß genau, welche Prozesse zum senden der job-control-Signale.
Genaugenommen die Antwort auf Ihre erste Frage ist, dass die job-id ist eine Reine shell Schöpfung. Es existiert, weil eine pipeline (oder, selten, eine andere shell gruppiert konstruieren) kann aus mehreren Prozessen, die gesteuert werden soll, als eine Einheit.
Zur Beantwortung Ihrer letzten Frage, die shell gestartet werden alle Prozesse, indem Sie zuerst tun, eine
fork(2)
und dann eineexecve(2)
. Der einzige Unterschied mit&
ist, dass die shell nichtwait(2)
(oder eine entsprechende Variante), so kann das Programm weiterhin "im hintergrund". Es ist tatsächlich wenig Unterschied in Unix zwischen Vorder-und hintergrund.Prozess-Gruppe ist eine Vereinigung, die definiert ist durch die Schalen, so dass der kernel weiß, über einen einzigen "Vordergrund" - Prozess behandelt eine Reihe von verschiedenen "hintergrund" - Prozesse. Dies ist vor allem wichtig, damit die Prozesse im hintergrund generieren ein signal, sollten Sie entscheiden, zu plötzlich, zu Lesen von einem terminal. (Wie terminal-wahrscheinlich angeschlossen an standard-Eingabe.) Dadurch wird der "job" zu generieren ein signal, und die shell wird der Benutzer aufgefordert, etwas zu tun.
Versuchen
(sleep 5; read x)&
und nach 6 Sekunden geben Sie eine Absender-oder etwas, so dass die Schale wacht. Das ist, wenn Sie so was sehen......und dann geben Sie
fg
ziehen Sie es in den Vordergrund zu stellen.Ursprünglich Unix hatte pipelines, und es hatte
&
, aber es gab keine Möglichkeit sich zu bewegen ein Befehl oder eine pipeline zwischen Vorder-und hintergrund und keine Möglichkeit zu helfen, ein Hintergrundprozess, der plötzlich beschlossen, read standard input.Job-Kontrolle und die kernel-Unterstützung für " es wurden Hinzugefügt, die von Bill Joy und andere, die in frühen Versionen der BSD-Lizenz und die csh(1). Diese wurden aufgegriffen Linie-für-Linie von kommerziellen Unix und in geklonten für die Arbeit-ähnlich Linux-kernel.
Bezüglich der Fragen zur Prozess-Gruppen und -
ps(1)
...Zur Unterstützung der job-Steuerung in Schalen, den kernel-Prozess-Status schließt einen Prozess-Gruppen-ID und eine session-ID. Ein - Prozess-Gruppe und ein job sind die gleiche Sache, aber ein job Nummer ist nur ein Griff der shell macht. Ein Prozess ist eine "session leader", wenn die session-ID ist die gleiche wie die pid, und ein Prozess ist ein Prozess, der Anführer der Gruppe, falls die pgid ist die gleiche wie die pid. Ich glaube, dass etwas ein bisschen subtiler ist, was mit den
+
dassps(1)
druckt. Jedes terminal weiß, was seine Vordergrund-Prozessgruppe ist, so glaube ich, ein Prozess bekommt ein +, wenn pid == pgid && (pgid ist die Vorder-pg für seine controlling-terminal).In der Zusammenfassung, die der kernel hält mehrere Positionen state: pid pgid, sid, und ein Prozess kann einen kontrollierenden terminal und ein terminal kann eine Vordergrund pgid. Diese Anmeldeinformationen werden meist zur Unterstützung der job-Kontrolle, sondern werden auch verwendet, zu widerrufen Zugang zum terminal, wenn ein Benutzer sich abmeldet.