Probleme mit lockf / fcntl bzw. flock



  • Hallo,
    ich versuche seit einiger Zeit ein Programm so zu modifizieren, damit mehrere Prozesse nicht zur selben Zeit auf die gleiche Datei zugreifen können. Zum Sperren der Dateien wollte ich die Funktion lockf verwenden. Leider funktioniert diese Funktion nicht (Fehlermeldung: Lock not available). Anschließend habe ich auch die Funktionen fcntl() und flock ausprobiert, auch hier treten wiederum Fehler auf und das Programm stürzt ab.

    Mittlerweile habe ich das Programm so umgeschrieben, dass .lok-Files erstellt werden, durch die das Programm erkennen soll, ob schon andere Prozesse auf die Datei zugreifen. Leider hat diese Vorgehensweise den Nachteil, dass bei Absturz des Progs, die .lok-Files nicht gelöscht werden, wie im Forum auch schon öfters berichtet wurde.

    Daher meine Frage: Woran kann es liegen dass die Funktionen flock/fcntl bzw. lockf nicht funktionieren?
    Gibt es noch andere Möglichkeiten, das Sperren von Dateien unter Unix zu ermöglichen?

    Danke schon mal für Eure Hilfe!

    Andi



  • du könntest (wenn du mit open/read/write/close arbeitest) die datei mittels

    int fd = open("<file>", O_RDWR | O_EXCL, 0755);
    

    zum beispiel anlegen, dann ist die automatisch gelockt, allerdings musste dich halt dann auf der low-level api bewegn und nicht auf der c-abstraktion mit FILE *.
    kommt drauf an, was dir lieber ist. mit der lösung kannste z.b. auch mutex über files realisieren



  • Danke für den Tip, ich benutze schon die ganze Zeit open, allerdings ist mir neu, dass dadurch die Files für andere Prozesse gesperrt werden.
    Dies erreicht man aber nur mit dem flag O_EXCL, oder? Das Manual zu dem flag O_EXCL find ich eher verwirrend , dachte dass O_EXCL nur in Verbindung mit O_CREAT verwendet werden kann. 🙄

    Hab es mal ausprobiert, bei meinen Versuchen konnte ich allerdings trotzdem auf die Datei zugreifen, obwohl sie gesperrt sein sollte. 😕



  • wenns wirklich nur mit O_CREAT geht, musst dir halt quasi nen "workaround" baun, die eigentliche datei einlesen, unlink(), neu erstellen und O_EXCL drauf anwenden. dann hast nur des problem, dass quasi während du ein liest, des gleiche auch n anderer prozess machen könnte



  • ja, das ist mir schon klar, und das habe ich ja auch schon gemacht (mithilfe von lockfiles), was allerdings wiederum nachteile mit sich bringt, s.o..

    daher gibt es meiner Ansicht nach eben die funktionen flock und lockf bzw. fcntl, um ein File zu locken.

    das compilieren funktioniert ohne probleme, allerdings tritt beim anschließenden Ausführen meines prgs dann immer die Fehlermeldung "Error 37: Lock not available" auf. Ich denke, dass der Fehler systembasiert ist. Vielleicht hatte ja auch jemand anders schon das Problem in Unix und kann mir weiterhelfen.

    ps:Habs jetzt auch mal mit Semaphoren probiert, hier stürzt das Prog aber auch ab.


Anmelden zum Antworten