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
Vlákno názorů k článku
Hrátky z řádky: pomocné soubory a zamykání
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 (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.
Zakladni myslenka je v pouziti `set -C; echo "$$ 1" > "$path"`, protoze parametr -C zakaze prepisovani souboru.
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?
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?

