linux:如何防止程序开启两个实例(进程)?

有时候不小心开启同一个程序两次会造成意想不到的错误,下面介绍一种方法,可以防止出现这种情况,测试可用。

在程序中添加如下代码

 1 #include <unistd.h>
 2 #include <signal.h>
 3 #include <sys/types.h>
 4 #include <sys/stat.h>
 5 #include <errno.h>
 6 #include <fcntl.h>
 7 #include <fstream>
 8
 9
10 #define PIDFILE     "/daemon_shouhu.pid"         //定义你自己的file名
11 #define    write_lock(fd, offset, whence, len) 12     lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
13
14 int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
15 {
16     struct flock    lock;
17
18     lock.l_type = type;        /* F_RDLCK, F_WRLCK, F_UNLCK */
19     lock.l_start = offset;        /* byte offset, relative to l_whence */
20     lock.l_whence = whence;        /* SEEK_SET, SEEK_CUR, SEEK_END */
21     lock.l_len = len;        /* #bytes (0 means to EOF) */
22
23     return( fcntl(fd, cmd, &lock) );    /* -1 upon error */
24 }
25
26
27
28 int Check_Running()
29 {
30     int fd, val;
31
32     if ((fd = open(PIDFILE, O_WRONLY|O_CREAT, "at")) < 0)
33     {
34         printf(" Open file error \n");
35     }
36
37     if (write_lock(fd, 0, SEEK_SET, 0) < 0)
38     {
39         if (errno == EACCES || errno == EAGAIN)
40         {
41             printf(" Server Already running! \n");
42             _exit(-1);
43             return -1;
44         }
45         else
46         {
47             printf(" Write_lock error! \n");
48         }
49     }
50
51     if (ftruncate(fd, 0) < 0)
52     {
53         printf("  ftruncate error  \n");
54     }
55
56     char buf[10] = {0};
57     sprintf(buf, "%d\n", getpid());
58     if (write(fd, buf, strlen(buf)) != (int)strlen(buf))
59         printf(" Write error \n");
60
61     if ((val = fcntl(fd, F_GETFD, 0)) < 0)
62         printf(" fcntl F_GETFD error \n");
63
64     val |= FD_CLOEXEC;
65     if (fcntl(fd, F_SETFD, val) < 0)
66         printf(" fcntl F_SETFD error \n");
67
68     return 0;
69 }

然后在程序入口添加Check_Running()就可以了,重新编译后执行,当第二次打开程序时会输出" Server Already running! ",第二个进程无法打开。

linux:如何防止程序开启两个实例(进程)?

时间: 2024-10-17 21:51:32

linux:如何防止程序开启两个实例(进程)?的相关文章

Winform and WPF 第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例[进程通信 1]

private void Window_Loaded(object sender, RoutedEventArgs e)         {             Process[] pro = Process.GetProcesses();             int n = pro.Where(p => p.ProcessName.Equals("进程名称")).Count();             if (n > 1)             {      

在linux环境下编译运行OpenCV程序的两种方法

原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式. 首先我先粘上我测试的代码吧,文件名为Test.c 1 #include <highgui.h> 2 3 int main(int argc,char ** argv) { 4 5 IplImage* img = cvLoadImage

Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题

Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题问题: 在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题.原因: 先来看Java代码: public final static void process1(String[] cmdarray) {        Process p = null;        BufferedReader br = null

linux wget 命令用法详解(附实例说明)

Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的事务我们只能先从远程服务器下载到我们电脑磁盘,然后再用ftp工具上传到服务器.这样既浪费时间又浪费精力,那不没办法的事.而到了Linux VPS,它则可以直接下载到服务器而不用经过上传这一步.wget工具体积小但功能完善,它支持断点下载功能,同时支持FTP和HTTP下载方式,支持代理服务器和设置起来

Linux及Arm-Linux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一.Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二.Linux开发平台搭建... 5 2.1安装虚拟工作站... 5 2.2安装Linux虚拟

Linux开机启动程序详解

我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核.请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存.因此,内核就必须完整地加载到可用RAM的第一个兆字节之内.为了实现这个目的,内核是被压缩了的.这个文件的头部包含着

Linux及Arm-Linux程序开发

一.Arm-Linux程序开发平台简要介绍 Arm-Linux程序的开发并不像我们以前接触的Windows程序开发那样,关于平台的搭建就繁琐很多,所以在正式进入程序开发之前先对这种开发模式进行简要介绍,让一个即使没有任何Linux开发经验的程序员也能够看懂后面的内容. 1.1程序开发所需系统及开发语言 开发arm-linux程序至少需要三种系统: Windows系统.     主要用来文件传送和一些简单的文本文件编辑.这个系统其实并非必需,只是因为目前PC机上最流行的系统仍然是Windows系统

12个 Linux 中 grep 命令的超级用法实例

12个 Linux 中 grep 命令的超级用法实例 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具.无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和RHEl/CentOS/Fedora系中的yum). $ sudo apt-get install grep #Debian/Ubuntu

OOG:一台服务器两个实例之间的OGG

这里必须报怨,提出这个测试的兄弟做的时候出问题了,然后我说做出来给他.但是他现在网吧打游戏mmp!!! 测试目的及思路 本文主要测试目的:验证一台多实例的服务器上是否可以通过OGG来实习实例之间的同步(一台主机上两个实例之间表数据通过OGG同步)主要思路:一般我们OGG的思路是抽取.传送.应用.虽然OGG有很多种应用方式,但大多都是多台服务器,毕竟很少遇到一台服务器两个库之间做ogg.当我兄弟问我这个环境是否可以通过OGG同步,我第一反应是可以,大概实现方式就是抽取出来放在本地直接应用就好了.(