einführen Normalerweise muss ein Hintergrundserverprogramm genau einen Prozess haben. Wie kann man also einen einzelnen Prozess einrichten? Dieses Beispiel verwendet die Flock-Funktion, um die PID-Datei /var/run/myserver.pid zu sperren.
Hintergrund-Serviceprogramm Einzelprozesssteuerung Ohne ins Detail zu gehen, schauen wir uns den Code direkt an #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #define PID_BUF_LEN (20) #define RUN_PID_FILE "/var/run/myserver.pid" //Einzelinstanz des Serviceprozesses wird ausgeführt //Rückgabewert: 1 – wird ausgeführt, 0 – wird nicht ausgeführt, -1 – Fehler int server_is_running() { int fd = öffnen(RUN_PID_FILE, O_WRONLY|O_CREAT); wenn(fd < 0) { printf("öffne PID-Fehler ausführen (%d)! %s\n", errno, RUN_PID_FILE); Rückgabe -1; } // Sperre // LOCK_SH richtet eine gemeinsame Sperre ein. Mehrere Prozesse können gleichzeitig eine Sperre für die gleiche Datei gemeinsam nutzen. // LOCK_EX richtet eine gegenseitige Ausschlusssperre ein. Für eine Datei kann jeweils nur eine exklusive Sperre gelten. wenn (flock(fd, LOCK_EX|LOCK_NB) == -1) { //Wenn die Sperre nicht hinzugefügt werden kann, läuft der Dienst und wurde gesperrt printf("Server läuft jetzt! errno=%d\n", errno); schließen(fd); Rückgabe 1; } // Das Sperren war erfolgreich, was beweist, dass der Dienst nicht ausgeführt wird. // Schließen oder entsperren Sie den Datei-Handle nicht. // Der Prozess wird beendet und automatisch entsperrt. printf("myserver is not running! beginne zu laufen..... pid=%ld\n", (long)getpid()); char pid_buf[PID_BUF_LEN] = {0}; snprintf(pid_buf, Größe von(pid_buf)-1, "%ld\n", (lang)getpid()); // Schreibe die Prozess-PID in die Datei /var/run/myserver.pid write(fd, pid_buf, strlen(pid_buf)); gebe 0 zurück; } int Haupt(void) { //Erkennung einzelner laufender Instanzen verarbeiten, wenn (0 != server_is_running()) { printf("myserver-Prozess läuft!!!!! Aktueller Prozess wird beendet !\n"); Rückgabe -1; } während(1) { printf("meinServer macht ... \n"); schlaf(2); } gebe 0 zurück; } Ergebnisse der Operation Führen Sie das Programm aus und Sie können sehen, dass die Prozess-PID 6965 ist [root@lincoding-Einzelprozess]# ./meinServer Server läuft nicht! Starten Sie den Server.....pid=6965 mein Server macht … mein Server macht … mein Server macht … mein Server macht … mein Server macht … mein Server macht … mein Server macht … mein Server macht … /var/run/myserver.pid zeichnet auch die PID-Nummer dieses Prozesses auf. ps auxf | grep myserver zeigt, dass der Prozess myserver ausgeführt wurde. [root@lincoding Einzelprozess]# cat /var/run/myserver.pid 6965 [root@lincoding Einzelprozess] [root@lincoding einzelner Prozess]# ps auxf | grep meinServer root 6965 0,0 0,0 3924 460 Punkte/0 S+ 00:32 0:00 | \_ ./meinserver root 9976 0,0 0,0 103256 856 Punkte/1 S+ 00:35 0:00 \_ grep meinserver [root@lincoding Einzelprozess] Wenn Sie zu diesem Zeitpunkt das MyServer-Programm erneut ausführen, wird ein Fehler gemeldet und beendet, da festgestellt wird, dass das MyServer-Programm bereits ausgeführt wird und kein anderer Prozess gestartet werden kann. Dadurch wird eine Einzelprozesssteuerung des Hintergrunddienstprogramms erreicht. [root@lincoding-Einzelprozess]# ./meinServer Server läuft jetzt! errno=11 Der MyServer-Prozess läuft!!!!! Der aktuelle Prozess wird beendet! Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: MySQL Community Server 5.6 Installations- und Konfigurations-Tutorial unter Windows 8
>>: So begrenzen Sie den Wertebereich von Objektschlüsseln in TypeScript
Normalerweise besteht das Ziel beim Erstellen ein...
bei um + Zeit um 17:23 at> touch /mnt/file{1.....
Wenn Sie Bash beenden möchten, haben Sie zwei Mög...
Mysql-Abfragezeitraum-Schnittmenge Anwendungsszen...
Inhaltsverzeichnis Docker-Version Installieren Si...
Dieser Artikel beschreibt die langsame MySQL-Abfr...
In Google Chrome werden Sie nach der erfolgreiche...
Neun einfache Beispiele analysieren die Verwendun...
Importieren Sie die aus der Oracle-Datenbank expo...
Inhaltsverzeichnis 10.000 Daten gingen im Hinterg...
Inhaltsverzeichnis Join-Syntax: 1. InnerJOIN: (In...
Beim Erstellen eines Zeitfelds STANDARD CURRENT_T...
COALESCE ist eine Funktion, die sich nacheinander...
Inhaltsverzeichnis Vorwort Optimierung SSR Import...
Heute werde ich die grundlegendsten Funktionen von...