1.

const int PATH_MAX = ;   // 默认最大路径长度
inline std::string current_exe_name()
{
char buf[PATH_MAX] = {}; int ret = readlink("/proc/self/exe", buf, PATH_MAX);
if (ret < || ret >= PATH_MAX) {
return "";
} std::string path(buf);
std::size_t pos = path.find_last_of("/");
if (pos == std::string::npos) {
return "";
} path = path.substr(pos + , path.size() - ); return path;
} inline bool check_single_instance()
{
// 打开或创建一个文件
std::string file_path = "./pid.lck";
int fd = open(file_path.c_str(), O_RDWR | O_CREAT, );
if (fd < ) {
printf("Open file failed, error : %s", strerror(errno));
exit();
} // 将该文件锁定
// 锁定后的文件将不能够再次锁定
struct flock fl;
fl.l_type = F_WRLCK; // 写文件锁定
fl.l_start = ;
fl.l_whence = SEEK_SET;
fl.l_len = ;
int ret = fcntl(fd, F_SETLK, &fl);
if (ret < ) {
if (errno == EACCES || errno == EAGAIN) {
printf("%s already locked, error: %s\n", file_path.c_str(), strerror(errno));
close(fd);
return false;
}
} // 锁定文件后,将该进程的pid写入文件
char buf[] = {};
sprintf(buf, "%d", getpid());
ftruncate(fd, );
ret = write(fd, buf, strlen(buf));
if (ret < ) {
printf("Write file failed, file: %s, error: %s\n", file_path.c_str(), strerror(errno));
close(fd);
exit();
} // 函数返回时不需要调用close(fd)
// 不然文件锁将失效
// 程序退出后kernel会自动close
return true;
}

2

inline bool check_single_instance()
{
// 打开或创建一个文件
std::string file_path = "./pid.lck";
int fd = open(file_path.c_str(), O_RDWR | O_CREAT, );
if (fd < ) {
printf("Open file failed, error : %s", strerror(errno));
exit();
} // 将该文件锁定
// 锁定后的文件将不能够再次锁定
int ret = lockf(fd, F_TLOCK, );
if (ret < ) {
if (errno == EACCES || errno == EAGAIN) {
printf("%s already locked, error: %s\n", file_path.c_str(), strerror(errno));
close(fd);
return false;
}
} // 锁定文件后,将该进程的pid写入文件
char buf[] = {};
sprintf(buf, "%d", getpid());
ftruncate(fd, );
ret = write(fd, buf, strlen(buf));
if (ret < ) {
printf("Write file failed, file: %s, error: %s\n", file_path.c_str(), strerror(errno));
close(fd);
exit();
} // 函数返回时不需要调用close(fd)
// 不然文件锁将失效
// 程序退出后kernel会自动close
return true;
}

Linux保证运行一个实例的更多相关文章

  1. Linux编程之《只运行一个实例》

    概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...

  2. Java程序只运行一个实例[转]

    如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...

  3. 如何用Qt写一个同一时间只能运行一个实例的应用程序

    http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...

  4. WinForm判断程序是否已经在运行,且只允许运行一个实例

    我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错. 为了更便于使用,笔者整理了一段自己用的代码,可以判断程序是否在运行,只运行一个实 ...

  5. VC 实现程序只运行一个实例,并激活已运行的程序

    转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...

  6. C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper

    前言 在开发应用程序时,通常只让程序运行一个实例.所以,就要判断程序是否已经运行. 下面是我自己在项目中使用到,封装好的帮助类.有 普通的 C# 应用程序 和 Windows CE 和 Windows ...

  7. Qt之运行一个实例进程

    简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...

  8. winform托盘时,要运行一个实例,解决办法

    需求:winform应用程序,当隐藏到托盘时,再次运行exe程序,让其只运行一个实例,并且把窗口从托盘中显示出来 应用程序名可以通过下面代码,获取到: Process current = Proces ...

  9. wpf只运行一个实例

    原文:wpf只运行一个实例 在winform下,只运行一个实例只需这样就可以: 1. 首先要添加如下的namespace: using System.Threading; 2. 修改系统Main函数, ...

随机推荐

  1. 如约而至(walk)

    LCA大佬的做法: 考虑暴力的高斯消元,我们优化它. $\sum\limits_{j} gcd(i,j)^{c-d} i^d j^d x_j=b_i$ $\sum\limits_{j} gcd(i,j ...

  2. meta标签中设置apple-itunes-app的意义

    告诉iphone的safari浏览器:这个网站对应的是哪个app <meta name="apple-itunes-app" content="app-id=589 ...

  3. python禁止函数修改列表的实现方法

    python禁止函数修改列表的实现方法 有时候,需要禁止函数修改列表.例如要对裂变进行修改操作,也要保留原来的未打印的设计列表,以供备案.为解决这个问题,可向函数传递列表的副本而不是原件:这样函数所做 ...

  4. linux学习 网络系统&文件查找

    被用来配置和操作网络系统的命令数目非常巨大,这里仅仅介绍一些经常会使用的 这一章会介绍ssh远程登录程序哦 ping 命令(掠过) traceroute 会显示主机到指定的主机要经过的跳数的网络流量列 ...

  5. 插头DP智障操作合集

    今天一共四道插头DP[其实都差不多],智障错误出了不下五个:D 来,让我好好数落我自己一下 直接写代码注释里吧 Eat the Trees #include<iostream> #incl ...

  6. iOS -NSOperation并发编程

    http://www.cocoachina.com/game/20151201/14517.html http://blog.csdn.net/qinlicang/article/details/42 ...

  7. Leetcode48. Rotate Image旋转图像

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 1: 给定 m ...

  8. 用js控制video的src_百度知道

    代码如下 <section id="player"> <video id="media" width="100%" hei ...

  9. Windows 调用OpenProcess失败

    OpenProcess 打开|获得进程句柄 函数原型: HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwPro ...

  10. web前端学习(二)html学习笔记部分(3)--range对象

    1.2.8  html5编辑api之range对象(一) 1.2.8.1  Range 对象基本概念 Range 对象的基本概念,通过使用 Range 对象所提供的方法实现一个鼠标选取内容,通过点击按 ...