офффф.... манился я оооочень долго, но так и не понял аргумент NULL это дефолтное значение в pthread_mutex_init, а какое значение аргумент принимает для глобального мьютекса?
Можно и через семафоры. Только вышеупомянутая libunique позволяет ещё и сообщения посылать. Например, второй экземпляр программы запущен с параметрами, их можно передать в первый экземпляр и завершиться.
У себя проверку запущено приложение или нет я делал через расшаренную память, в которую писал пид процесса. Если память расшарена, то происходит поиск приложения по пиду (что позволяет определить, живо ли приложение). Работает и в линуксе, и в винде, и в макоси.