您对创建单实例应用程序有什么建议,以便一次只允许运行一个进程?文件锁、互斥锁还是什么?
最佳答案
一个好办法是:
#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 文件。
更高级的方法是使用预定义的套接字名称创建和绑定(bind) unix 域套接字。您的应用程序的第一个实例绑定(bind)成功。同样,当应用程序因任何原因终止时,操作系统会取消绑定(bind)套接字。当 bind()
失败时,应用程序的另一个实例可以 connect()
并使用此套接字将其命令行参数传递给第一个实例。
关于c++ - 如何在 C 或 C++ 中创建单实例应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339200/