Jak sprawdzić, czy plik jest już odtwarty?

0

Witam,
piszę projekt dotyczący komunikacji procesów w linuxie i mam następujący problem: jedną z dróg komunikacji mięcy procesami jest pamięć dzielona i moduł dotyczący tego rodzaju komunikacji ma wyglądać tak, że jeden proces (producent) czyta z pliku źródłowego po jednym znaku, zapisuje je w segmencie pamięci dzielonej, z której drugi proces (konsument) pobiera ten znak i zapisuje do pliku wynikowego. Ogólnie wszystko mam już gotowe poza jedną rzeczą: pliki źródłowy jest cały czas otwarty w procesie producent, pliki wynikowy jest cały czas otwarty w procesie konsument. Jak sprawdzać przy uruchomieniu tych procesów, czy te pliki są już otwarte w innych programach? Nazwy plików i ścieżki do nich są znane.

0

fcntl

0

dzęki, ale to nie rozwiązuje moich problemów, tzn nie wiem jak to połączyć z C++, bo ja wszystkie operacje na plikach wykonuje za pomocą funkcji z c++ (open,close,get,put), a nie systemowych... Może jest coś takiego w C++?

0

Hym , moim zaniem C++ [ biblioteka standardowa IO] nie implementuje funkcji
które pozwalają jednoznacznie stwierdzić czy dany plik jest otworzony przez inny proces .
Te zagadnienia dotyczą specyficznych rozwiązań dla danego systemu operacyjnego
i nie mogą zostać powiązane ściśle z standardową biblioteką C++ .
Chyba jednak trzeba się zdać na obsługę plików poprzez funkcje specyficzne
dla danego systemu , w przypadku Linuksa fun. języka C lub bibliotekę C++ która to umożliwia
(jeśli jest taka ..)

Ps. jesli pliki są "własnością" danego procesu (producent) , tworzone przez twój program można
to rozwiązać poprzez dodanie znacznika w samym pliku .
Proces który jako pierwszy otwiera plik zapisuje jego część pewną wartością [ np. jeden początkowy bajt ] , kolejny proces (konsument) po sprawdzeniu zawartości pliku może określić czy jest on obecnie używany .
Jest tu jednak niebezpieczeństwo związane z buforowaniem danych [ flush trzeba stosować bzwzg.] , troche to kalekie ale jeśli nie możesz stosować innych rozwiązań ,,,?
Niestety po zwieszeniu systemu i ponownym uruchomieniu aplikacji nie wiadomo jaki
będzie stan pliku co może zablokować dostęp jeśli pozostanie jako 'zaznaczony' , .. [green]
Ogólnie jednak sądzę że bez użycia fun. systemowych operujących na pliku nie da się tego
rozwiązać na 100% .

0

dzięki za odpowiedź. W takim razie będę musiał to przerobić na funkcje systemowe. Bybłbym jeszcze wdzięczny za info jak funkcjami systemowymi sprawdzić deskryptor danego pliku na dysku. tzn jak otrzymać jego deskryptor, aby potem móc sprawdzić go za pomocą np fcntl. Może ma ktoś linka do jakiejś stronki o deskryptorach i fcntl...

0
matv napisał(a)

Może ma ktoś linka do jakiejś stronki o deskryptorach i fcntl...
Ban na google ?

0

przez google już troche znalazłem, ale dalej nie wiem jak otrzymać deskryptor pliku, którego nie otwieram funkcją systemową... da się tak w ogóle zrobić?

0

fileno(FILE * ble)
zwraca deskryptor pliku

0

o coś takiego mi chodzi, ale tutaj muszę użyć pliku, który mam otwarty. A potrzebuję coś takiego: funkcja("adres_pliku_na_dysku") np: funkcja("~/systemy/plik") - żeby mi to zwracało deskryptor pliku, który później mogę wykorzystać... jak ktoś wie to proszę o pomoc...


edit:
dostałem odpowiedź na angielskojęzycznym forum, że raczej jest to nie możliwe i rozwiązałem w trochę inny sposób.
Dzięki za wszelką pomoc :) pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1