Zalockowanie pliku

Zalockowanie pliku
JC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

Hej, napotkałem pewien problem.

A mianowicie: plik json który w danym momencie może być update'owany przez kilka wątków / osobnych programów. Potrzebuję zalockować plik na czas edycji ... Program pisany jest pod Linuxem, kojarzę funckcję o nazwię flock, która przyjmuje file descryptor do otworzonego pliku ...

Aplikacja jest pisana w c++ więc używam streamów, w jaki sposób mogę dostać file descryptor z fstream ? (nie mogę użyć boosta).

A może jest lepszy pomysł na napisania takiego programu ? (uprzedzając, tak lepszym pomysłem byłaby baza danych a nie plik json, ale to już muszę się dostosować).

Pzdr, ;-)

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

A może jest lepszy pomysł na napisania takiego programu ?
Tak - napisz aplikację-serwer, która jako jedyna będzie miała dostęp do tego pliku, i każdy, kto będzie chciał coś w nim zmienić, będzie się musiał do tej aplikacji-serwera połączyć.
Wtedy nie będzie problemu z konkurencyjnością - ba! może to być nawet całkiem ciekawe zadanie uczące obsługi wielowątkowości~wieloklientowości :)

Btw, nie baw się w yoda-ify - zawsze porównuj zmiennik do niezmiennika, w takiej właśnie kolejności.
Czyli nie: if ("" != dataFromFile), tylko if (dataFromFile != ""), a najlepiej if (dataFromFile.length() > 0).

JC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
0

Tak byłoby najlepiej, ale jak już pisałem nie mogę zmienić architektury ani miejsca do pisania...

yoda - ify, tak mnie nauczono :) że stała ma stać po lewej stronie co by nie napisać = zamiast == w ifie :)

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1493
0

Jeśli chodzi o sam deskryptor:
To bardzo brzydkie, ale dopóki nie używasz wątków wewnątrz Twojej aplikacji to powinno zadziałać:

Kopiuj
int fd;
fd = dup(0);
close(fd);
//dodaj test na -1 dla dup i close
std::fstream("path/to/file");

I voila, jako że deskryptory lecą kolejno to masz numer. Z tym, że flock/lockf/fcntl nic Ci nie pomoże: jeśli inna aplikacja sprawdzi lock na pliku to go nie ruszy, ale nadal może swobodnie do niego pisać...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.