C Fcntl Abstraktionsfunktion nicht funktioniert
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
schreibender 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 */
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).