Robust Interprocess Locks
squadrick.github.io
squadrick.github.io
That's not safe. PIDs are recycled.
The only correct solution I can think of is to place the lock in shared memory, use the futex(2) API, and use set_robust_list (https://linux.die.net/man/2/set_robust_list) to ensure the kernel will unlock a futex if a process dies.
You may (should?) be able to initialize a pthread-based PTHREAD_PROCESS_SHARED + PTHREAD_MUTEX_ROBUST mutex in a shared memory region and have everything just work.
Yup, didn't think of that possibility, thanks for pointing it out.
> You may (should?) be able to initialize a pthread-based PTHREAD_PROCESS_SHARED + PTHREAD_MUTEX_ROBUST mutex in a shared memory region and have everything just work.
Trying this now, I'll make another post if I can get it working. Thanks for the suggestion.
One disgusting technique is to use a file descriptor's "ready" state as a signal. Wait until the fd is readable, then check the shared memory for new data. Surely there's better.
One great (read: terrible) hack is to do signal delivery on process groups.
I know a multicast AF_UNIX patch for Linux has been floating around for years, but I have no idea if it's ever landed in a mainstream kernel.
My go-to for pseudo-multicast on POSIX/Linux is shared memory + semaphores.