Вы можете использовать файлы и блокировки файлов для достижения этой цели, но остерегайтесь, что они не идеальны, и не копируйте печально известную ошибку Firefox, когда она иногда отказывается запускаться, даже если она еще не запущена.
Основная логика этого:
Invariant:
File xxxxx will exist if and only if the program is running, and the
contents of the file will contain the PID of that program.
On startup:
If file xxxxx exists:
If there is a process with the PID contained in the file:
Assume there is some instance of the program, and exit
Else:
Assume that the program terminated abnormally, and
overwrite file xxxx with the PID of this program
Else:
Create file xxxx, and save the current PID to that file.
On termination (typically registered via atexit):
Delete file xxxxx
В дополнение к приведенной выше логике вам также следует использовать второй файл, который вы блокируете, чтобы синхронизировать доступ к файлу PID (т.е. действовать как мьютекс, чтобы сделать его безопасным с точки зрения параллелизма на уровне процесса).