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$'