TTY (terminal virtuel) | -Session | -Groupe de processus | -Processus
"TTY = session 1> N processus groupe 1> N processus"
L'un des processus est un chef de session, et plusieurs d'entre eux sont des chefs de groupe de processus.
Une session de connexion associée à TTY. Il s'agit d'un groupe d'un ou plusieurs groupes de processus, et le processus qui devient le chef de session a le rôle d'interagir avec le terminal de contrôle et de terminer tous les processus enfants lorsque le terminal est déconnecté. Les groupes de processus ne peuvent être créés que dans la session à laquelle ils appartiennent.
Un ensemble de processus qui peuvent envoyer des signaux à d'autres processus. Les membres ont l'ID de processus du chef de groupe de processus comme ID de groupe. Appelez setpgid () ou setsid () pour devenir le leader d'un groupe de processus.
fork() L'appel de cette fonction duplique le processus. Si la valeur de retour est 0, elle est traitée par le processus enfant et si la valeur de retour est égale ou supérieure à 0, elle est traitée par le processus parent. Les deux procèdent simultanément avec le même code source. Par conséquent, il est nécessaire de créer une branche avec une instruction if et d'écrire deux codes source pour le processus parent et le processus enfant.
#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;
//------------------------------------------------------
//Statut.
//Processus parent au démarrage du programme(shell)Avoir et avoir un ATS.
//------------------------------------------------------
//------------------------------------------------------
//Créer un processus enfant pour détacher le parent et renvoyer le contrôle au shell.
//------------------------------------------------------
if((pid = fork()) == -1){
return -1;
//Le processus parent se termine après la création du processus enfant.
}else if(pid != 0){
//N'appelez pas les fonctions de nettoyage définies par l'utilisateur_exit()je fais.
_exit(0);
}
//------------------------------------------------------
//Statut.
//Seuls les processus enfants, mais TTY est conservé.
//------------------------------------------------------
//------------------------------------------------------
//Séparer TTY pour devenir un chef de session et un chef de groupe de processus.
//------------------------------------------------------
setsid();
//------------------------------------------------------
//Ignorer le signal HUP.
//Parce que les signaux HUP peuvent être envoyés à l'enfant lorsque le parent meurt.
//------------------------------------------------------
signal(SIGHUP, SIG_IGN);
//------------------------------------------------------
//Statut.
//Puisqu'il s'agit d'un leader de session à ce rythme, si vous ouvrez un TTY, ce TTY sera associé..
//------------------------------------------------------
//------------------------------------------------------
//Processus parent(Chef de groupe de session)Débrancher.
//Devenir un leader sans parent, sans TTY et sans session.
//------------------------------------------------------
if((pid = fork()) == 0){
//Fin du processus enfant.
_exit(0);
}
//------------------------------------------------------
//Préparez-vous à courir en démon.
//------------------------------------------------------
//Changer le répertoire courant.
if(chdir_flg == 0){
//Déplacer vers le répertoire racine.
chdir("/");
}
//Fermer tous les descripteurs de fichiers hérités du parent.
for(i = 0; i < MAXFD; i++){
close(i);
}
// stdin,stdout,dev stderr/Ouvrir avec null.
//Si vous fermez simplement le descripteur, ces sorties entraîneront une erreur, donc dev/Rediriger vers null.
if((fd = open("/dev/null", O_RDWR, 0) != -1)){
//Dupliquer le descripteur de fichier.
//0 de ce processus,1,Dev a pointé 2 par fd/Pointez sur 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);
//Afficher le répertoire actuel.
syslog(LOG_USER | LOG_NOTICE, "demon:cwd=%s¥n", getcwd(buf, sizeof(buf)));
return 0;
}
Il peut être transformé en démon simplement en appelant demontrez () avec la fonction main (). Si vous écrivez une commande pour démarrer un programme démonisé dans "/etc/rc.local", vous pouvez le démarrer en arrière-plan au démarrage du serveur.
["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 + bible de programmation réseau) Scyphus Draft - Comment créer un démon
Recommended Posts