1. Die Konzepte von Prozessgruppe, Job und Sitzung
1. Prozessgruppe: Es handelt sich um eine Sammlung von einem oder mehreren Prozessen. Typischerweise können im Zusammenhang mit demselben Auftrag verschiedene Signale vom selben Terminal empfangen werden. Jeder Prozess verfügt über eine eindeutige Prozessgruppen-ID. Jede Prozessgruppe kann einen Leitprozess haben. Die Identität des Gruppenleiterprozesses besteht darin, dass seine Prozessgruppen-ID mit seiner Prozess-ID übereinstimmt. Der Gruppenleiterprozess kann eine Prozessgruppe erstellen, die Prozesse in der Gruppe erstellen und dann beenden. Solange es einen Prozess in einer Prozessgruppe gibt, existiert die Prozessgruppe, unabhängig davon, ob der Gruppenleiterprozess beendet wird.
2. Job: Shell ist in Front- und Backends unterteilt, um nicht den Prozess, sondern den Job (Job) oder die Prozessgruppe zu steuern. Ein Vordergrundjob kann aus mehreren Prozessen bestehen, und ein Hintergrundjob kann auch aus mehreren Prozessen bestehen. Die Shell kann einen Vordergrundjob und eine beliebige Anzahl von Hintergrundjobs ausführen, was als Jobsteuerung bezeichnet wird.
Der Unterschied zwischen einem Job und einer Prozessgruppe: Wenn ein Prozess im Job einen untergeordneten Prozess erstellt, gehört der untergeordnete Prozess nicht zum Job.
Sobald der Job beendet ist, rückt die Shell in den Vordergrund. Wenn der ursprüngliche Vordergrundprozess noch vorhanden ist (sofern der untergeordnete Prozess nicht beendet wurde), wird er automatisch zu einer Hintergrundprozessgruppe.
3. Sitzung: Es handelt sich um eine Sammlung einer oder mehrerer Prozessgruppen. Eine Sitzung kann ein steuerndes Terminal haben. Der Sitzungsanfangsprozess, der eine Verbindung mit dem steuernden Terminal herstellt, wird als Steuerungsprozess bezeichnet. Mehrere Prozessgruppen in einer Sitzung können in eine Vordergrundprozessgruppe und eine oder mehrere Hintergrundprozessgruppen unterteilt werden. Daher sollte eine Sitzung den Steuerungsprozess (den ersten Prozess der Sitzung), eine Vordergrundprozessgruppe und eine beliebige Hintergrundprozessgruppe umfassen.
******************** (Die Prozessgruppe entspricht einer Klasse und der Gruppenleiter entspricht dem Gruppenleiter. Das Gespräch entspricht einer Note. Jede Note verfügt über ein Büro für akademische Angelegenheiten (Kontrollterminal).
2. Terminal
1. Das Konzept des Terminals: Nachdem sich der Benutzer über das Terminal beim System angemeldet hat, erhält er einen Shell-Prozess. Dieses Terminal wird als Steuerungsterminal des Shell-Prozesses bezeichnet Der Prozess kann eine spezielle Gerätedatei übergeben /dev/tty greift auf sein steuerndes Terminal zu. Tatsächlich entspricht jedes Endgerät
einer anderen Gerätedatei. Ein Prozess kann über /dev/tty oder über die entsprechende Gerätedatei darauf zugreifen. Die Funktion ttyname kann den entsprechenden Dateinamen aus dem Dateideskriptor ermitteln. Der Dateideskriptor muss auf ein Endgerät und nicht auf eine beliebige Datei verweisen.
********************Überprüfen Sie die Gerätedateinamen, die den verschiedenen Terminals entsprechen.
1 #include<stdio.h> 2 #include<unistd.h> 3 int main() 4 { 5 printf("fd: %d -> %s\n",0,ttyname(0)); 6 printf("fd: %d -> %s\n",1,ttyname(1)); 7 printf("fd: %d -> %s\n",2,ttyname(2)); 8 }
2. Terminal-Anmeldevorgang:
Ein PC verfügt normalerweise nur über einen Satz Tastatur und Monitor, also nur einen Satz Endgeräte, auf den aber mit Strg-Alt-F1~ umgeschaltet werden kann Strg-Alt-F6 6-Zeichen-Terminals entsprechen 6 Sätzen virtueller Endgeräte. Sie teilen sich den gleichen Satz physischer Endgeräte. Die entsprechenden Gerätedateien sind /dev/tty1~/dev/tty6, daher werden sie virtuelle Terminals genannt. Die Gerätedatei /dev/tty0 repräsentiert das aktuelle virtuelle Terminal. Wenn Sie beispielsweise zum Zeichenterminal von Strg-Alt-F1 wechseln, stellt /dev/tty0 /dev/tty1 dar. F2, /dev/tty0 repräsentiert /dev/tty2, eine universelle Schnittstelle wie /dev/tty, kann jedoch nicht das Terminal darstellen, das dem grafischen Terminalfenster entspricht.
a. Beim Systemstart ermittelt der Init-Prozess anhand der Konfigurationsdatei /etc/inittab, welche Terminals geöffnet werden müssen.
b. getty öffnet das Endgerät als sein Steuerterminal gemäß den Befehlszeilenparametern, verweist die Dateideskriptoren 0, 1 und 2 auf das Steuerterminal
und fordert den Benutzer dann auf, ein Konto einzugeben. Nachdem der Benutzer das Konto eingegeben hat, ist die Aufgabe von getty abgeschlossen und das Anmeldeprogramm wird ausgeführt:
execle("/bin/login", "login", "-p", username, NULL, envp);
c. Das Anmeldeprogramm fordert den Benutzer zur Eingabe eines Passworts auf (schaltet das Echo des Terminals während der Passworteingabe aus) und überprüft dann die Richtigkeit des Kontopassworts. Wenn das Passwort falsch ist, wird der Anmeldevorgang abgebrochen und init führt einen erneuten Fork/Ausführung eines Getty-Prozesses durch. Wenn das Passwort korrekt ist, legt das Anmeldeprogramm einige Umgebungsvariablen fest, legt das aktuelle Arbeitsverzeichnis auf das Home-Verzeichnis des Benutzers fest und führt dann Shell aus:
execl("/bin/bash", "-bash", NULL);
drei, Daemon-Prozess
1. Der Daemon-Prozess, auch Daemon-Prozess genannt, ist ein spezieller Prozess, der im Hintergrund läuft. Es ist unabhängig vom Steuerterminal und führt regelmäßig eine Aufgabe aus oder wartet auf das Eintreten eines Ereignisses.
2. Verwenden Sie ps axj |. um den Daemon-Prozess anzuzeigen.
Parameter a bedeutet, dass nicht nur die Prozesse des aktuellen Benutzers aufgelistet werden, sondern auch die Prozesse aller anderen Benutzer bedeutet, dass nicht nur die Prozesse des Steuerterminals aufgelistet werden, sondern auch alle Prozesse ohne Steuerterminal.
3. Erstellen Sie einen Daemon-Prozess
Rufen Sie die Funktion „setsid“ auf, um eine neue Sitzung zu erstellen und zum Sitzungsleiter zu werden (der erste Prozess der Sitzung). Wenn der Aufruf erfolgreich ist, wird die neu erstellte Sitzungs-ID verwendet zurückgegeben werden. Wenn ein Fehler auftritt, wird -1 zurückgegeben ). Gründe:
1) Wenn der Daemon als einfacher Shell-Befehl gestartet wird, dann führt die Beendigung des übergeordneten Prozesses dazu, dass die Shell denkt, dass der Befehl ausgeführt wurde.
2) Stellen Sie sicher, dass der untergeordnete Prozess nicht der Führungsprozess einer Prozessgruppe ist.
c. Rufen Sie „setsid“ auf, um eine neue Sitzung zu erstellen. setsid bewirkt Folgendes:
1) Der aufrufende Prozess wird zum ersten Prozess der neuen Sitzung.
2) Der aufrufende Prozess wird zum Leiterprozess einer Prozessgruppe.
3) Der aufrufende Prozess verfügt über kein steuerndes Terminal. (Erneut forken, um sicherzustellen, dass der Daemon-Prozess das TTY-Gerät anschließend nicht öffnet)
d Ändern Sie das aktuelle Arbeitsverzeichnis in das Stammverzeichnis.
e. Schließen Sie Dateideskriptoren, die nicht mehr benötigt werden.
f. Andere: Ignorieren Sie das SIGCHLD-Signal.
Verwenden Sie ps axj |. und Den Inhalt des Daemon-Prozesses. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!
#include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 void mydeamon(void) 5 { 6 pid_t id=fork(); 7 umask(0);//将文件模式创建屏蔽字设置为0. 8 if(id>0) 9 { 10 exit(0);//调用fork,父进程退出(exit) 11 } 12 setsid();//调用setsid创建一个新会话 13 chdir("/");//将当前工作目录更改为根目录。 14 close(0);//关闭不在需要的文件描述符。 15 close(1); 16 close(2); 17 } 18 int main() 19 { 20 mydeamon(); 21 while(1); 22 return 0; 23 }