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
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
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.