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

推荐答案

一个好方法是:

#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(),并使用该套接字将其命令行参数传递给第一实例.

C++相关问答推荐

代码打印正确输出次数过多(CS50)

如何避免使用相对路径包含在c中

C:gcc返回多个错误定义,但msvc—不""'

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

不会停在空格或换行符上的错误

在编译时参数化类型定义

当输入负数时,排序算法存在问题

在for循环中指向数组开头之前

不同出处的指针可以相等吗?

为什么用非常数指针变量改变常量静态变量时会出现分段错误?

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

为什么这个分配做得不好呢?

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

OMP并行嵌套循环

可以';t从A9G模块拨打电话

';malloc():损坏的顶部大小';分配超过20万整数后

未使用sem_open正确初始化信号量

从系统派生线程调用CRT

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果

使用共享变量同步多线程 C 中的函数