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

So verhindern Sie, dass Website-Inhalte in Suchmaschinen aufgenommen werden

Normalerweise besteht das Ziel beim Erstellen ein...

Zwei Möglichkeiten zum Beenden von Bash im Docker-Container unter Linux

Wenn Sie Bash beenden möchten, haben Sie zwei Mög...

So fragen Sie die Schnittmenge von Zeiträumen in MySQL ab

Mysql-Abfragezeitraum-Schnittmenge Anwendungsszen...

Die perfekte Lösung für das AutoFill-Problem in Google Chrome

In Google Chrome werden Sie nach der erfolgreiche...

So verwenden Sie ein HTML-Formular mit mehreren Beispielen

Neun einfache Beispiele analysieren die Verwendun...

Backup zwischen MySQL-Datenbank und Oracle-Datenbank importieren

Importieren Sie die aus der Oracle-Datenbank expo...

Spezifische Verwendungsanweisungen für MySQL-Joins

Inhaltsverzeichnis Join-Syntax: 1. InnerJOIN: (In...

Analyse der MySql CURRENT_TIMESTAMP-Funktion anhand eines Beispiels

Beim Erstellen eines Zeitfelds STANDARD CURRENT_T...

Codebeispiel für die Verwendung der MySql COALESCE-Funktion

COALESCE ist eine Funktion, die sich nacheinander...

Vue SPA-Lösung zur Optimierung des ersten Bildschirms

Inhaltsverzeichnis Vorwort Optimierung SSR Import...