1、问题
(1)因为守护进程时长时间运行而不退出,因此某一程序,如:./a.out执行一次就有一个进程,执行多次就有多个进程。
(2)这样并不是我们想要的。我们守护进程一般都是服务器,服务器程序只要运行一个就够了,多次同时运行并没有意义甚至会带来错误。
(3)因此我们希望我们的程序具有一个单例运行的功能。意思就是说当我们的./a.out去运行程序时,如果当前还没有这个程序的进程在运行,就运行它,如果之前已经有一个这个程序的进程在运行则本次运行直接退出(提示程序已经在运行)。
2、解决方法:
(1)最常用的一种方法就是:用一个文件的存在与否来做标志。具体做法是程序在执行之初去判断一个特定的文件是否存在,若存在则标明进程已经在运行,若不存在则标明进程没有在运行。然后运行程序时去创建这个文件。当程序结束的时候去删除这个文件即可。
(2)这个特定的文件要怪一点,确保不会凑巧真的是在电脑中存在的。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#define FILE "/tmp/xuwei_test_single"
void delete_file(void);
int main(void)
{
int fd = -1;
fd = open(FILE, O_RDWR | O_TRUNC | O_CREAT | O_EXCL, 0664);
//程序执行之初,先判断文件是否存在
if(fd < 0)
{
if(errno == EEXIST)
{
printf("进程已经存在,并不需要重复执行\n");
exit(-1);
}
}
atexit(delete_file); //注册进程清理函数
int i;
for(i=0; i<10; i++)
{
printf("I am running...%d\n", i);
sleep(1); //睡眠1秒
}
return 0;
}
//函数定义
void delete_file(void)
{
remove(FILE);
}