一个好方法是:
#include <sys/file.h>
#include <errno.h>
int pid_file = open("/var/run/whatever.pid", O_CREAT | O_RDWR, 0666);
int rc = flock(pid_file, LOCK_EX | LOCK_NB);
if(rc) {
if(EWOULDBLOCK == errno)
; // another instance is running
}
else {
// this is the first instance
}
请注意,锁定允许您忽略过时的pid文件(即,您不必删除它们).当应用程序因任何原因终止时,操作系统会为您释放文件锁.
PID文件不是特别有用,因为它们可能是陈旧的(文件存在,但进程不存在).因此,可以锁定应用程序可执行文件本身,而不是创建和锁定PID文件.
更高级的方法是使用预定义的套接字名称创建和绑定Unix域套接字.应用程序的第一个实例绑定成功.同样,当应用程序因任何原因终止时,操作系统会解除套接字的绑定.当bind()
失败时,应用程序的另一实例可以connect()
,并使用该套接字将其命令行参数传递给第一实例.