Het open hebben van een bestand is geen “lock” omdat, als elk proces eerst moet controleren of het bestand open is en niet verder moet gaan als het open is of het aanmaken/openen als het dat niet is, dan kunnen twee processen tegelijk controleren, beide vinden dat het niet open is, dan beide aanmaken of openen.
Om een bestand als “lock” te gebruiken, moet de “check-and-lock” operatie een enkele ononderbroken operatie zijn. U kunt dit bereiken in een Unix bestandssysteem door een bestand met alleen-lezen modus aan te maken en het te verwijderen om te ontgrendelen. Als het bestand bestaat (en alleen-lezen is) zal de bestandsaanmaak mislukken, dus u krijgt check-and-lock in een enkele atomaire operatie.
Als uw locking proces een shell script is dat als een daemon zal draaien, kunt u dit effect krijgen door umask
te gebruiken, een per-proces instelling die de permissies zet dat nieuwe bestanden worden aangemaakt met:
oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask
Dit schrijft ook het eigen proces’ PID in het bestand, wat uw andere probleem oplost: cat /var/lock/foo
* *
Met betrekking tot de specifieke vraag “Welke processen hebben dit bestand openstaan? ”, kan dit nuttig zijn wanneer u een bestandssysteem wilt unmounten, maar kan dit niet omdat een of ander proces een bestand open heeft staan. Als je die commando’s niet beschikbaar hebt, kun je /proc
vragen als root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
of, als sterfelijke gebruiker:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'