[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

[C, POSIX/SUS] Jak sprawdzic, czy plik juz jest otwarty?

Bogdan (bogdro)

9/7/2007 5:45:00 PM

Witam.

Mam nastepuj?ce zagadnienie: przed wykonaniem jakiejkolwiek czynno?ci
z danym (poprzez ?cie?ke lub deskryptor/FILE*) plikiem nale?y
sprawdzia, czy plik ten nie jest otwarty przez jakikolwiek inny
proces, najlepiej wliczaj?c w to mapowanie do pamieci.
Pytanie brzmi: czy jest jaki? przeno?ny sposób, by to zrobia?
Ewentualnie mo?e bya biblioteka, ale musi ona bya pod jak?? woln?
licencj?. Najlepiej, je?li da3oby sie bez ?adnych bibliotek.
Otwieranie w trybie wy3?czno?ci jest niewystarczaj?ce,
fcntl(,F_SETLEASE,) - skuteczne (choa nie zawsze tak musi bya), ale
nieprzeno?ne.

Jezyk: C (nie C++).
Docelowy system: g3ównie Linux/Unix i podobne, ale im bardziej
przeno?ne, tym lepiej
Nie nale?y zak3adaa posiadania uprawnien administratora oraz
istnienia systemu /proc (fuser, lsof odpadaj?), lecz badane pliki s?
w3asno?ci? u?ytkownika uruchamiaj?cego kod sprawdzaj?cy.

--
Pozdrawiam/Regards - Bogdan (Linux & FreeDOS)
Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda....
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org

3 Answers

Mariusz Kruk

9/7/2007 9:19:00 PM

0

epsilon$ while read LINE; do echo ">$LINE"; done < Bogdan (bogdro)
> Otwieranie w trybie wy3?czno?ci jest niewystarczaj?ce,
>fcntl(,F_SETLEASE,) - skuteczne (choa nie zawsze tak musi bya), ale
>nieprzeno?ne.

A flock()?

--
\------------------------/ Heavy voodoo here. I can't even believe you
| Kruk@epsilon.eu.org | are reading this. Are you crazy? Don't even
| http://epsil... | think about adjusting these[...](squid.conf)
/------------------------\

Bogdan (bogdro)

9/8/2007 7:49:00 AM

0

Mariusz Kruk pisze:
> epsilon$ while read LINE; do echo ">$LINE"; done < Bogdan (bogdro)
>> Otwieranie w trybie wy3?czno?ci jest niewystarczaj?ce,
>> fcntl(,F_SETLEASE,) - skuteczne (choa nie zawsze tak musi bya), ale
>> nieprzeno?ne.
>
> A flock()?

Je?li dobrze rozumiem opis tej funkcji, to gwarantowane jest jedynie
to, ?e LOCK_EX mo?e bya w danej chwili na danym obiekcie ustawione
przez co najwy?ej 1 proces. Wnioskuje z tego, ?e je?li wykonane jest
open() (w trybie niewy3?cznym), po czym ponownie open() z
flock(LOCK_EX), to wszystkie wywo3ania sie powiod? (bo po pierwszym
open() nie ustawiono blokady), a nie o to chodzi3o - flock() mia3oby
sie nie udaa, by proces wiedzia3, ?e plik ju? jest otwarty. Ta funkcja
nie daje takiej mo?liwo?ci.

--
Pozdrawiam/Regards - Bogdan (Linux & FreeDOS)
Kurs asemblera x86 (DOS & Linux): http://rudy.mif.pg.gda....
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org

Mariusz Kruk

9/8/2007 9:38:00 AM

0

epsilon$ while read LINE; do echo ">$LINE"; done < Bogdan (bogdro)
>przez co najwy?ej 1 proces. Wnioskuje z tego, ?e je?li wykonane jest
>open() (w trybie niewy3?cznym), po czym ponownie open() z
>flock(LOCK_EX), to wszystkie wywo3ania sie powiod? (bo po pierwszym
>open() nie ustawiono blokady),

Fakt, masz racje. Dopiero po zalockowaniu dalsze operacje nie powiod3yby
sie, ale nie zale?y to od wcze?niejszego otwierania pliku.

--
/\-\/\-\/\-\/\-\/\-\/\-\/\ You rang?(TeX)
\ Kruk@epsilon.eu.org /
/ http://epsil... \
\/-/\/-/\/-/\/-/\/-/\/-/\/