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