Implementierung der Einzelprozesssteuerung des Linux C-Hintergrunddienstprogramms

Implementierung der Einzelprozesssteuerung des Linux C-Hintergrunddienstprogramms

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.

  • Wenn die Sperre nicht normal ist, bedeutet dies, dass der Dienstprozess im Hintergrund bereits ausgeführt wird. In diesem Fall wird der Fehler gemeldet und das System beendet.
  • Wenn die Sperre erfolgreich ist, bedeutet dies, dass der Hintergrunddienstprozess nicht ausgeführt wird. Anschließend kann der Prozess normal aktiviert werden.

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:
  • Detaillierte Erklärung und Beispiele zur Linux-Prozesssteuerung
  • Zusammenfassung der Befehle zur Steuerung von Prozessen in Linux

<<:  MySQL Community Server 5.6 Installations- und Konfigurations-Tutorial unter Windows 8

>>:  So begrenzen Sie den Wertebereich von Objektschlüsseln in TypeScript

Artikel empfehlen

Detaillierte Erklärung zur Verwendung der vue3 Teleport-Sofortbewegungsfunktion

Die Verwendung der vue3 Teleport-Sofortbewegungsf...

Grafische Einführung in den Unterschied zwischen := und = in MySQL

Der Unterschied zwischen := und = = Nur beim Setz...

Zwei Möglichkeiten zum Verwalten von Volumes in Docker

Im vorherigen Artikel habe ich die Grundkenntniss...

Miniprogramm zur Implementierung des Paging-Effekts

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung der wichtigsten Erkenntnisse des Vue-Entwicklungshandbuchs

Inhaltsverzeichnis Überblick 0. Grundlagen von Ja...

Implementierungscodebeispiel für die lokale Verzeichniszuordnung von Nginx

Manchmal müssen Sie auf einige statische Ressourc...

JavaScript-Implementierung des Spiels des Lebens

Inhaltsverzeichnis Konzept-Einführung Logische Re...

jQuery-Plugin zum Erreichen einer Bildunterbrechung

In diesem Artikel wird der spezifische Code des j...

Docker-Grundlagen

Vorwort: Docker ist eine Open-Source-Anwendungsco...

Navigationsdesign und Informationsarchitektur

<br />Wenn wir über Navigation sprechen, geh...