Frage

Ich bin writting eine App und die in der Beschreibung, die ich brauche, um Schloss eine Datei jedes Mal wenn ich schreibe darauf (diese Datei wird für andere Anwendungen gelesen werden dass anderes Team arbeitet an):

Ich habe die folgende Funktion:

int lock_file (int fd)
{
    if (fd == -1)
        return -1;
    struct flock file_locker;
    file_locker.l_type = F_WRLCK;
    file_locker.l_whence = SEEK_SET;
    file_locker.l_start = 0;
    file_locker.l_len = 0; //lock the entire file

    int locked = fcntl(fd, F_SETLK, &file_locker);
    if (locked == -1){
        /*handle errors*/
        return 0;
    }
    return 1;
}

kann ich das 1 return (Mittel alles in Ordnung ist), aber wenn ich einen Testfall gemacht Ich konnte in der gesperrten Datei Oo

schreiben

der Testcode war:

char *file = "lock_test_ok";
int fd = open(file, O_RDWR);
int locked = lock_file(fd);
/* call popen and try write 'ERROR' in the file */

/* if the file contains ERROR, than fail */
War es hilfreich?

Lösung

Locking in Unix ist beratender: nur Programme die Sperre Prüfung wird nicht in sie schreiben. (Einige Angebote obligatorische Verriegelung, aber nicht auf diese Weise. Es handelt sich in der Regel spezielle Eigenschaften auf der gesperrten Datei einrichten.)

Andere Tipps

Die Sperre freigegeben wird, wenn der erste Prozess existiert und seine Filedeskriptoren sind alle geschlossen.

Edit: Ich glaube, ich das Testszenario falsch verstanden - ein popen() Anruf nicht nach dem Sperrprotokoll wird (die nur beratenden, und nicht vom Betriebssystem erzwungen), so dass das Schreiben erfolgt selbst wenn der Prozess, der genannt lock_file() noch existiert und die Sperre hält.

Zusätzlich zu dem, was Jim sagte fcntl Schlösser sind Beratungs . Sie tun nicht verhindern, dass jemand das Öffnen und Schreiben in die Datei. Das einzige, was sie tun, ist andere Prozesse daran hindern, ihre eigenen fcntl Sperren zu erwerben.

Wenn Sie alle Autoren in die Datei zu steuern, ist das in Ordnung, weil man einfach jeden Schriftsteller versuchen, die Datei zu sperren, zuerst hat. Ansonsten sind Sie abgespritzt. Unix bietet keine „mandatory“ Sperren (Sperren, die Ursache open oder write zum Scheitern verurteilt).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top