Linux Prog: Sperren von Dateien mit Kindprozessen?
-
Hi,
Also, ich wollte ein eine Datei sperren (Kein W&R mehr möglich) im Eltern-Prozess, diesen nun 10 Sekunden suspendieren, und danach die Datei wieder freigeben. Während dessen so der Kind-Prozess die Datei checken, ob die Datei frei ist (all Sekunde) und den Inhalt gegebenenfalls ausgeben.
Wo ist der Fehler? Mein Kind-Prozess kann sofort die Datei lesen. Ich mein der KP hat ein eigenen FileDeskriptor und erbt somit nicht den vom Eltern, oder?
#include <cstdio> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <iostream> using namespace std; int main(int argc, char **argv) { flock *f; flock *fk; FILE *file; FILE *file_kind; int pro; char ausgabe[9]; // f->l_type = F_WRLCK; // f->l_start = 0; // f->l_len = 50; pro = fork(); cout << "GO: " << endl; if(pro > 0) { f = new flock; f->l_type = F_WRLCK; f->l_len = 0; cout << "Sperre setzen: " << endl; file = fopen("testFile", "r"); fcntl(fileno(file), F_SETLK, f); sleep(10); cout << "Sperre aufheben: " << endl; fcntl(fileno(file), F_UNLCK, f); cout << "Eltern ist fertig" << endl; } else { file_kind = fopen("testFile", "r"); fk = new flock; while(fk->l_type != F_UNLCK) { fcntl(fileno(file_kind), F_GETLK, fk); cout << "Datei gesperrt" << endl; sleep(1); } while(!feof(file_kind)) { fgets(ausgabe, 9, file_kind); cout << ausgabe << endl; } cout << "Kind ist fertig" << endl; } return 0; }
-
hmm,
race condition ...
parent und child laufen parallel.du baust den lock im parent.
währenddessen öffnet und liest das child schon mal das file während das parent noch das lock baut.wie sind denn eigentlich die defaults von flock-new ??
ist da l_type schon gesetzt ??
wenn nicht, wie soll er dann in die erste while() reinkommen ??mach doch mal vorher noch nen F_GETLK.