Zamykani souboru v PERLu

Ludvik Tesar tesar na utia.cas.cz
Pondělí Srpen 25 17:05:04 CEST 1997


> 	jsem zacatecnik v PERLu a potreboval bych poradit. Snazim se
> vytvorit skript, ktery ma zamknout urcity soubor pro zapis, potom s nim neco
> provest a zase ho odemknout. Samotne zamykani jsem si vyresil (pres
> vytvareni, mazani a kontrolu existence souboru), ale potrebuju vyresit
> problem, co se stane, kdyz k tomuhle souboru budou pristupovat dva najednou
> (presne v tom samem okamziku). Jde mi o to, ze si jeden zkontroluje, ze
> zamykaci soubor neexistuje, ale nez ho staci vytvorit, tak ho vytvori ten
> druhy. Jak mam osetrit tohle?

Pouzijte prejmenovani nejakeho souboru (/var/lock/mujlock) na
jmeno zavisle na PID procesu. (napr. mam proces s PID 123 a prejmenuji
/var/lock/mujlock na /var/lock/mujlock.123 - muj PID je v nejake promenne
shellu)  Soubor tedy bude zamcen, pokud lock-ovaci soubor
(/var/lock/mujlock) neexistuje a ne jako u vas, pokud existuje.

Kdyz se dva procesy pokousi prejmenovat nejaky soubor na jiny
(napr. proces 123 na /var/lock/mujlock.123 a proces 345 na 
/var/lock/mujlock.345), podari se to vzdy prave jednomu z nich. Vas proces
si pak musi overit, jestli bylo prejmenovani pro neho uspesne a jestlize
ano, ma odemceno, jestlize soubor najednou z niceho nic prestal existovat,
znamena to, ze lock si sebral jiny proces o neco driv a proces musi cekat,
az zacne puvodni soubor (/var/lock/mujsoubor) existovat.

Problem muze byt, kdyz nejaky proces po sobe neuklidi (napr. proces 345
byl ukoncen pomoci "kill -9 345" a zustal tam soubor /var/lock/mujlock.345
a nikoli /var/lock/mujlock). Pak se musi uklidit rucne. Ukonceni pomoci
jinych signalu se da i ve skriptu dobre osetrit.
To je stejne, jako kdyz se zamyka pomoci vytvareni souboru.

Tento zpusob zamykani se da snadno pouzit v jakemkoliv scriptu, nejen v
PERLovem.

Zdravi

        Ludvik Tesar






Další informace o konferenci Linux