Zamceni souboru - flock/fcntl
Alexandr Malusek
malusek na hroch.ujf.cas.cz
Čtvrtek Říjen 12 10:33:32 CEST 2000
martin.macok na underground.cz (=?iso-8859-2?Q?Martin_Ma=E8ok?=) writes:
> On Thu, Oct 12, 2000 at 07:51:19AM +0200, Juraj Hiľovský wrote:
> > > On Wed, Oct 11, 2000 at 04:58:36PM +0200, David Pavlis wrote:
> > > > Mam dotaz. Potrebuji v programu v C-ku uzamknout soubor tak aby na
> > > > nej nemohly zadne jine aplikace.
Prectete si /usr/src/linux/Documentation/mandatory.txt. Popisuje se tam
implementace "mandatory locking" na Linuxu.
> > > > Zkousel jsem to jak s flock,
Mimo jine se dozvite:
1. Mandatory locks can only be applied via the fcntl()/lockf() locking
interface - in other words the System V/POSIX interface. BSD style
locks using flock() never result in a mandatory lock.
> > > > tak s fcntl,
Zrejme jste spravne nenastavil pristupova prava k souboru:
A file is marked as a candidate for mandatory locking by setting the
group-id bit in its file mode but removing the group-execute bit. This
is an otherwise meaningless combination, and was chosen by the System
V implementors so as not to break existing user programs.
Na Solarisu se to nastavuje "chmod g+l file", vypis pak vypada takto:
$ ls -l t1
-rw-r-lr-- 1 malusek guests 0 Oct 12 10:11 t1
Duvod, proc tuto metodu Linux neprevzal, mi neni znam.
Pokud to nenastavite, pouzije se tzv. advisory lock. Ten nebrani
zapisu, ale jine aplikace si mohou zjistit, ze byl nastaven.
> > > > ale vzdy je mozne soubor otevrit jinym programem - napr.
> > > > "vi" a zapsat do nej.
Do detailu "vi" nevidim, nicmene domnivam se, ze si napred vytvori
lokalni kopii (napr. v /tmp), a v te se provadeji zmeny. (Jak jinak by
se dalo rozumne implementovat :q!, ze). V te kopii puvodni zamek
samozrejme neni. No a nakonec dojde k prejmenovani lokalni kopie na
puvodni jmeno. Tim se zamykani obejde. Zaver: na testovani zamykani
nepouzivejte vi.
> > Ked to takto obecne nejde, tak by ma zaujimalo, preco je to tak. Preco
> > treba pouzivat nejake triky na nieco, co by mal zvladnut samotny OS ?
Mandatory locking byl v Linuxu implementovan davno, zadne triky nejsou
potreba.
> Je pravda, ze napriklad pristup k /etc/passwd by tento systemovy zamek
> jiste uvital ...
Tento problem je hlubsi - viz vyse uvedena zminka o vi.
> Ale UNIX byl proste takto navrzen a je dohodou, ze takoveto veci se resi
> v userlandu a explicitne.
Mandatory locking existoval jiz v SVR4. Nevim, jestli to byla prvni
implementace, ale rozhodne je to jiz mnoho let. Standardizovano to je,
neni potreba znovuvynalezat kolo.
Pozn.: s novymi jadry jsem locking nezkousel, pokud to nefunguje, pak
je to spis chyba nez feature.
--
A. Malusek (malusek na ujf.cas.cz)
UJF AV CR
Další informace o konferenci Linux