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. nslookup获取域名对应的的ip地址

    1.先用nslookup获得域名对应的主机ip:nslookup 域名 2.再根据主机ip获得对应的主机名称: host ip $ nslookup baidu.com Server: 127.0.1 ...

  2. web前端学习(一) j2ee环境搭配+jsp中的编码问题

    jsp中的编码问题 pageEncoding是jsp文件本身的编码  contentType的charset是指服务器发送给客户端时的内容编码 我安装tomcat的方法是 安装j2ee的eclipse ...

  3. Mybatis insert返回主键ID

    Mybatis insert语句书写 <insert id="insertSelective" useGeneratedKeys="true" keyPr ...

  4. https方式nginx 代理tomcat访问不带www的域名301重定向跳转到www的域名帮助seo集中权重

    比如我要把 http://gucanhui.com http://www.gucanhui.com 跳转到https://www.gucanhui.com 用F12的network可以看到状态码301 ...

  5. 基于LSTM对西储大学轴承故障进行分析

    这篇文章是小萌新对西储大学轴承故障进行分析,固定特征为故障直径为0.007,电机转速为1797,12k驱动端故障数据(Drive_End)即DE-time.故障类型y值:滚动体故障,内圈故障,3时,6 ...

  6. php 获取一张图片所有点的颜色值

    image_all_rgb.php <?php //similar_text($numStr, $val, $pre); //计算两个字符串的相似度 //print_r($pre); $imgP ...

  7. Linux巨好用的

    受不了了windows下配置烦死人.linux一站式搞定,无敌 安装python3 机子上py2 py3共存没问题 安装virtualenv (py3)分割实验环境非常稳 安装mysql 先安装了一 ...

  8. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

  9. Codeforces 375A

    这是一道数学题,真是很考验数学思维,之前也遇到过相似的问题,但是依然是想不到点子上,就这提而言,最重要的就是 能否发现由 1, 6, 8,9这四个数字组成的排列对7取模是可以得到0, 1, 2, 3, ...

  10. excel怎么制作实线虚线混排的折线图

    excel怎么制作实线虚线混排的折线图 excel怎么制作实线虚线混排的折线图?excel表格中想要设计的图表是实线的,想要让图标同时显示虚线和实线,该怎么操? 通常在在使用折线图描述数据的趋势时,前 ...