Posiadanie otwartego pliku nie jest kłódką, ponieważ jeśli każdy proces musi najpierw sprawdzić, czy plik jest otwarty, a nie kontynuować, jeśli jest, lub stworzyć/otworzyć go, jeśli nie jest, to dwa procesy mogą sprawdzić jednocześnie, oba stwierdzą, że nie jest otwarty, a następnie oba stworzą lub otworzą go.
Aby użyć pliku jako kłódki, operacja “check-and-lock” musi być pojedynczą nieprzerywaną operacją. Można to osiągnąć w uniksowym systemie plików, tworząc plik w trybie tylko do odczytu i usuwając go w celu odblokowania. Jeżeli plik istnieje (i jest tylko do odczytu), to jego utworzenie nie powiedzie się, więc w pojedynczej operacji atomowej otrzymujemy operację “check-and-lock”.
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 dla każdego procesu, które ustawia uprawnienia, za pomocą których tworzone są nowe pliki:
oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask
To także zapisuje do pliku PID własnego procesu, co rozwiązuje Twój inny problem: cat /var/lock/foo
* *
W odniesieniu do konkretnego pytania “Które procesy mają ten plik otwarty? ”, może to być użyteczne, gdy chcesz odmontować system plików, ale nie możesz, ponieważ jakiś proces ma w nim otwarty plik. Jeśli nie masz 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$'