TTY (virtuelles Terminal) -Session | -Prozessgruppe | -Prozess
"TTY = Sitzung 1> N Prozessgruppe 1> N Prozess"
Einer der Prozesse ist ein Sitzungsleiter, und mehrere von ihnen sind Prozessgruppenleiter.
Eine mit TTY verknüpfte Anmeldesitzung. Es ist eine Gruppe von einer oder mehreren Prozessgruppen, und der Prozess, der zum Sitzungsleiter wird, hat die Aufgabe, mit dem Steuerterminal zu interagieren und alle untergeordneten Prozesse zu beenden, wenn das Terminal getrennt wird. Prozessgruppen können nur innerhalb der Sitzung erstellt werden, zu der sie gehören.
Eine Sammlung von Prozessen, die Signale an andere Prozesse senden können. Mitglieder haben die Prozess-ID des Prozessgruppenleiters als Gruppen-ID. Rufen Sie setpgid () oder setsid () auf, um Leiter einer Prozessgruppe zu werden.
fork() Durch Aufrufen dieser Funktion wird der Vorgang dupliziert. Wenn der Rückgabewert 0 ist, wird er vom untergeordneten Prozess verarbeitet, und wenn der Rückgabewert 0 oder mehr ist, wird er vom übergeordneten Prozess verarbeitet. Die beiden fahren gleichzeitig mit demselben Quellcode fort. Daher ist es erforderlich, mit einer if-Anweisung zu verzweigen und zwei Quellcodes für den übergeordneten Prozess und den untergeordneten Prozess zu schreiben.
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <sysexits.h>
#include <unistd.h>
#include <syslog.h>
#define MAXFD 64
int demonize(int chdir_flg){
int i = 0;
int fd = 0;
pid_t pid = 0;
//------------------------------------------------------
//Status.
//Übergeordneter Prozess beim Programmstart(shell)Habe und habe einen TTY.
//------------------------------------------------------
//------------------------------------------------------
//Erstellen Sie einen untergeordneten Prozess, um den übergeordneten Prozess zu trennen und die Steuerung an die Shell zurückzugeben.
//------------------------------------------------------
if((pid = fork()) == -1){
return -1;
//Der übergeordnete Prozess wird nach dem Erstellen des untergeordneten Prozesses beendet.
}else if(pid != 0){
//Rufen Sie keine benutzerdefinierten Bereinigungsfunktionen auf_exit()ich mache.
_exit(0);
}
//------------------------------------------------------
//Status.
//Nur untergeordnete Prozesse, aber TTY bleibt erhalten.
//------------------------------------------------------
//------------------------------------------------------
//Trennen Sie TTY, um Sitzungsleiter und Prozessgruppenleiter zu werden.
//------------------------------------------------------
setsid();
//------------------------------------------------------
//HUP-Signal ignorieren.
//Weil HUP-Signale an das Kind gesendet werden können, wenn das Elternteil stirbt.
//------------------------------------------------------
signal(SIGHUP, SIG_IGN);
//------------------------------------------------------
//Status.
//Da es sich bei dieser Rate um einen Sitzungsleiter handelt, wird diese TTY zugeordnet, wenn Sie eine TTY öffnen..
//------------------------------------------------------
//------------------------------------------------------
//Übergeordneter Prozess(Sitzungsgruppenleiter)Trennen.
//Werden Sie ein elternloser, TTYloser und Nicht-Sitzungsleiter.
//------------------------------------------------------
if((pid = fork()) == 0){
//Untergeordneten Prozess beenden.
_exit(0);
}
//------------------------------------------------------
//Bereite dich darauf vor, als Dämon zu rennen.
//------------------------------------------------------
//Ändern Sie das aktuelle Verzeichnis.
if(chdir_flg == 0){
//In das Stammverzeichnis wechseln.
chdir("/");
}
//Schließen Sie alle vom übergeordneten Element geerbten Dateideskriptoren.
for(i = 0; i < MAXFD; i++){
close(i);
}
// stdin,stdout,dev stderr/Mit null öffnen.
//Wenn Sie nur den Deskriptor schließen, führen diese Ausgaben zu einem Fehler, also dev/Auf null umleiten.
if((fd = open("/dev/null", O_RDWR, 0) != -1)){
//Doppelter Dateideskriptor.
//0 dieses Prozesses,1,Dev zeigte auf 2 von fd/Zeigen Sie auf null.
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if(fd < 2){
close(fd);
}
}
return (0);
}
int main(int argc, const char * argv[]) {
char buf[256];
demonize(1);
//Aktuelles Verzeichnis anzeigen.
syslog(LOG_USER | LOG_NOTICE, "demon:cwd=%s¥n", getcwd(buf, sizeof(buf)));
return 0;
}
Es kann einfach durch Aufrufen von demonstr () mit der Funktion main () in einen Dämon umgewandelt werden. Wenn Sie einen Befehl zum Starten eines daemonisierten Programms in "/etc/rc.local" schreiben, können Sie ihn beim Start des Servers im Hintergrund starten.
["Linux Network Programming Bible"](http://www.amazon.co.jp/Linux Network Programming Bible-Mitsuyuki Omata-ebook / dp / B00O8GIL62 / ref = sr_1_1? Ie = UTF8 & qid = 1429337305 & sr = 8-1 & keywords = Linux + Netzwerkprogrammierbibel) Scyphus Draft - Wie man einen Dämon macht
Recommended Posts