Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlákno názorů k článku
Hrátky z řádky: pomocné soubory a zamykání

Pavel
Pavel (neregistrovaný)
7. 4. 2008 3:45

lock mkdir

Vytvoreni adresare je atomicke a selze, pokud existuje. To se da celkem lehce vyuzit.
Proto staci zkouset vytvorit adresar a kontrolovat navratovy kod.


# Zamek
LOCKDIR='/tmp/x'

# Cekani na zamek
while (mkdir $LOCKDIR 2> /dev/null; [ "$?" '!=' 0 ] ); do
sleep 1
done

# Tady jsem sam, dokonce muzu pouzivat $LOCKDIR na sve docasne soubory.
date

# Odstraneni zamku
rm -rf $LOCKDIR
matej
matej (neregistrovaný)
7. 4. 2008 10:11

ln -s lock (was Re: lock mkdir)

Podobne je atomicke aj vytvorenie linky.
LOCKFILE="/tmp/my.lock"
trap "rm -f $LOCKFILE" EXIT INT TERM

while ! ln -s lock $LOCKFILE; do
        echo >&2 "cannot obtain lock, waiting"
        sleep 1;
done

# urob co treba atomicky, potom zmaz lock
oldium
oldium (neregistrovaný)
7. 4. 2008 13:50

Re: ln -s lock (was Re: lock mkdir)

Jedna takova ucelena implementace do Gentoo je v bugu http://bugs.gentoo.org/show_bug.cgi?id=118418. Vicenasobne zamykani pro Bash a zaroven automaticke odemykani pri ukoncovani shellu, dokonce i neco jako threadove promenne. Vse dulezite pro zamky je ve funkci trylock. Snad jedina externi zavislost je na bash_variable z /sbin/functions.sh (pouze Gentoo) pro predelani jmena na neco, co lze uchovat v Bashi. Dale staci nastavit promennou svclock na adresar, kde se ukladaji zamky, a uz muzete zacit pouzivat zamykani.

Zakladni myslenka je v pouziti `set -C; echo "$$ 1" > "$path"`, protoze parametr -C zakaze prepisovani souboru.
TomEeK
TomEeK (neregistrovaný)
7. 4. 2008 11:39

Re: lock mkdir

A nebylo by lepsi misto volani bashe pouzival atomicka volani systemu?
tam by pak o nejakem predbihanim nemelo byt ani reci, ne?

cosi jako v Cecku toto:
char *filename;
int fd;

do {
filename = tempnam (NULL, "foo");
fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600);
free (filename);
} while (fd == -1);

Jen nevim jak bych to smolil v bashi.
Neporadite?
Zasílat nově přidané příspěvky e-mailem