• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[C++] Wie nur eine Instanz zulassen?

Mr. S

Member
Hallo!

Wie kann ich in einem C++-Programm abfragen ob schon eine Instanz des Programms gestartet wurde? Es soll nämlich nicht mehr als eine Instanz laufen.
 
Wenn dein Programm startet, prüfe ob es ein Pidfile gibt, wenn nicht, erstelle es. So machen das alle (und nicht mit `ps x`).
 
OP
M

Mr. S

Member
jengelh schrieb:
Wenn dein Programm startet, prüfe ob es ein Pidfile gibt, wenn nicht, erstelle es. So machen das alle (und nicht mit `ps x`).
Vielen Dank für den Tip, wie macht man sowas? Ist das einfach nur eine Datei irgendwo erstellen? Steht da die pid drin und man prüft beim start ob ein Programm mit der pid läuft, oder wie geht das?
 
In folgender Methodik wird der File Descriptor bewusst offen gelassen, um sicherzustellen, dass sich hinter der PID auch wirklich der passende Prozess befindet. (Es kann ja vorkommen, dass der Prozess tot ist, das und das PID-File eine PID enthält, die derzeit von einem anderen Programm verwendet wird (PID-Recycling)).
Zum ungetesteten Bleispiel:
Code:
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

bool blafasel()
{
    int fd = open("/var/run/blafasel.pid", O_RDWR | O_CREAT);
    char buf[32] = {};

    if (fd < 0)
        mist();
    if (lockf(fd, F_TLOCK, 0) < 0) {
        close(fd);
        return false;
    }
    snprintf(buf, sizeof(buf), "%u", getpid());
    write(fd, buf, strlen(buf));
    return true;
}

int main(void)
{
    if (!blafasel()) {
        printf("Ne sorry, da läuft wohl schon was.\n");
        return EXIT_FAILURE;
    }
    while (true)
        ;
}
 
Oben