Otwarcie pliku nie jest blokadą, ponieważ jeśli każdy proces musi najpierw sprawdzić, czy plik jest otwarty i nie kontynuować, jeśli jest, lub utworzyć / otworzyć, jeśli nie jest, wówczas dwa procesy mogą całkiem dobrze sprawdzić jednocześnie, oba że nie jest otwarty, a następnie obaj go utwórz lub otwórz.
Aby użyć pliku jako blokady, operacja sprawdzania i blokowania musi być pojedynczą operacją nieprzerwaną. Możesz to osiągnąć w systemie plików Unix, tworząc plik w trybie tylko do odczytu i usuwając go, aby odblokować. Jeśli plik istnieje (i jest tylko do odczytu), tworzenie pliku zakończy się niepowodzeniem, więc otrzymujesz sprawdzenie i zablokowanie w pojedynczej operacji atomowej.
Jeśli twój proces blokowania jest skryptem powłoki, który będzie działał jako demon, możesz uzyskać ten efekt, używając umask
ustawienia na proces, które określa uprawnienia, z którymi tworzone są nowe pliki:
oldumask = $ (umask)
umask 222 # twórz również pliki, których właściciel nie może zapisać
if echo $$> / var / lock / foo
następnie
: blokowanie powiodło się
jeszcze
: blokowanie nie powiodło się
fi
umask $ oldumask
Spowoduje to również zapisanie PID procesu właściciela w pliku, co rozwiązuje inny problem:
cat /var/lock/foo
Jeśli chodzi o konkretne pytanie „Które procesy mają ten plik otwarty?”, Może to być przydatne, gdy chcesz odmontować system plików, ale nie może, ponieważ w niektórych procesach jest otwarty plik. Jeśli nie masz dostępnych tych poleceń, możesz zapytać
/proc
jako root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
lub jako śmiertelny użytkownik:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'