c++ - 如何在 C 或 C++ 中创建单实例应用程序

标签 c++ c linux single-instance

您对创建单实例应用程序有什么建议,以便一次只允许运行一个进程?文件锁、互斥锁还是什么?

最佳答案

一个好办法是:

#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/

相关文章:

linux - 从父文件夹和所有子文件夹中删除特定的命名目录

linux - libssl.so.6 : cannot open shared object file: No such file or directory

c++ - 用另一个子字符串 C++ 替换子字符串

c++ - 在 OpenCV 中隐藏鼠标光标

c - 为什么下面的冒泡排序代码会出现段错误?

c - 结构体中的结构体没有成员

linux - linux内核调度代码中ttwu的完整形式

c++ - C++中字符串的下标有什么问题

c++ - 为什么在下面的代码中复制构造函数是私有(private)的时会出现错误 C2248?

c - 从 lex 和 yacc 文法生成编译器