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

Linux-Installation Apache-Server-Konfigurationsprozess

Bereiten Sie die Taschen vor Installieren Überprü...

vue + springboot realisiert den Login-Bestätigungscode

In diesem Artikelbeispiel wird der spezifische Co...

Tutorial zum Erstellen des File-Sharing-Dienstes Samba unter CentOS6.5

Samba-Dienste: Dieser Inhalt dient als Referenz f...

Integrierte Objekte, Werttypen und Referenztypen in JavaScript-Objekten erklärt

Inhaltsverzeichnis Objekt Objektdefinition Iterie...

Implementierungsprinzip und Nutzungsanalyse des Apache Bench-Stresstest-Tools

1: Durchsatz (Anfragen pro Sekunde) Eine quantita...

JS praktisches objektorientiertes Schlangenspielbeispiel

Inhaltsverzeichnis denken 1. Bild mit dem gierige...

Vue implementiert eine Countdown-Schaltfläche für den Bestätigungscode

In diesem Artikelbeispiel wird der spezifische Co...

SSM VUE Axios Detaillierte Erklärung

Inhaltsverzeichnis Wie wird das SQL-Protokoll ang...

Ein kurzer Vortrag über den Diff-Algorithmus in Vue

Inhaltsverzeichnis Überblick Virtueller Dom Prinz...

Analyse des Prinzips und der Erstellungsmethode der temporären MySQL-Tabelle

In diesem Artikel werden hauptsächlich das Prinzi...

So konfigurieren Sie eine statische Netzwerkverbindung in Linux

Das Konfigurieren der Netzwerkkonnektivität für L...

HTML-Hyperlink ein Tag_Powernode Java Academy

Jeder, der HTML studiert oder verwendet hat, soll...

Lernen Sie MySQL Index Pushdown in fünf Minuten

Inhaltsverzeichnis Vorwort Was ist Index-Pushdown...