如何禁止程序启动多个实例

某些特定需求下(比如创建守护进程)我们需要禁止程序启动多个实例,如何让后启动的程序检测到程序已经在运行,我们可以简单的使用互斥信号来实现


VC 6.0 项目下编译通过,可在程序启动处(如控制台程序的main函数,form程序的winmain函数)加入如下代码(需要包含windows.h头文件),结合GetLastError函数判断是否程序已经在运行。

#include<stdio.h>
#include<windows.h>

int main(int argc, char* argv[])
{
    HANDLE m_mutex = NULL;

    m_mutex = CreateMutex(NULL,FALSE,"test_mutex");
    if(GetLastError()==ERROR_ALREADY_EXISTS){
        printf("program is already running\n");
        CloseHandle(m_mutex);
        m_mutex = NULL;
        return false;
    }

    ...
}

linux C的测试,我们还可以考虑可以采用对文件加锁的方式实现保证单实例的运行,比如让进程启动时创建一个文件(自定义),并且在整个文件上

加上一个写锁,由于只允许创建一个写锁,第二次运行该程序就会加写锁失败。示例如下

#include<sys/stat.h>
#include<fcntl.h>

#define LOCKFILE "lock.pid"
#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)

int main(){
    int fd;
    fd = open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE) ;
    if (fd < 0) {
        printf("can't open %s", LOCKFILE);
        return -1;
    }

    if (flock(fd, LOCK_EX|LOCK_NB) < 0) {
        printf("can't lock %s", LOCKFILE);
        return -1;
    }

    ...
} 
对文件加锁或者引入互斥量是两种比较典型的解决方法,其它程序设计语言也可以照葫芦画瓢,如C#采用互斥量的实现如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

namespace TestConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            bool res;
            Mutex mutex = new Mutex(false, "test_mutex", out res);
            if (!res) {
                Console.WriteLine("program is already running");
                Environment.Exit(1);
            }

            ...
        }
    }
}
有趣的是,我们发现上面的VC示例程序和C# 示例程序也是不能同时运行的,因为它们都申请了同一个互斥信号量“test_mutex”,由此可知,互斥量不仅仅能够在同一应用程序中实现资源的安全共享访问,而且可以在不同应用程序之间实现对资源的安全共享访问。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值