Jo, rozhodně bych místo textového souboru použil databázi, klidně něco malého ko sqllite nebo embeded firebird. Nevýhoda ale je, že tydle jednoúčelové databáze jsou povětšinou jednouživatlské. To jde ale snadno vyřešit jedním centrálním správcem + komunikací např. pomocí UDP protokolu nebo třeba message queues (klient pošle do message queueu serveru zprávu s identifikací svojí message queue). Další možnost je thready a kritická sekce. Ale to by byl jiný program :-)
Dej si do lock a unlock logovací výpisy PID, Akce a stav semaforu (viz sem_getvalue). Možná Ti to napoví, kde je chyba, třeba něco omylem zamykáš dvakrát nebo tak.