您的位置:首页 > 运维架构 > Linux

Linux保证运行一个实例

2017-06-19 09:53 127 查看
1.

const int PATH_MAX = 1024;   // 默认最大路径长度
inline std::string current_exe_name()
{
char buf[PATH_MAX] = {0};

int ret = readlink("/proc/self/exe", buf, PATH_MAX);
if (ret < 0 || 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 + 1, path.size() - 1);

return path;
}

inline bool check_single_instance()
{
// 打开或创建一个文件
std::string file_path = "./pid.lck";
int fd = open(file_path.c_str(), O_RDWR | O_CREAT, 0666);
if (fd < 0)  {
printf("Open file failed, error : %s", strerror(errno));
exit(1);
}

// 将该文件锁定
// 锁定后的文件将不能够再次锁定
struct flock fl;
fl.l_type = F_WRLCK; // 写文件锁定
fl.l_start = 0;
fl.l_whence = SEEK_SET;
fl.l_len = 0;
int ret = fcntl(fd, F_SETLK, &fl);
if (ret < 0) {
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[16] = {0};
sprintf(buf, "%d", getpid());
ftruncate(fd, 0);
ret = write(fd, buf, strlen(buf));
if (ret < 0) {
printf("Write file failed, file: %s, error: %s\n", file_path.c_str(), strerror(errno));
close(fd);
exit(1);
}

// 函数返回时不需要调用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, 0666);
if (fd < 0)  {
printf("Open file failed, error : %s", strerror(errno));
exit(1);
}

// 将该文件锁定
// 锁定后的文件将不能够再次锁定
int ret = lockf(fd, F_TLOCK, 0);
if (ret < 0) {
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[16] = {0};
sprintf(buf, "%d", getpid());
ftruncate(fd, 0);
ret = write(fd, buf, strlen(buf));
if (ret < 0) {
printf("Write file failed, file: %s, error: %s\n", file_path.c_str(), strerror(errno));
close(fd);
exit(1);
}

// 函数返回时不需要调用close(fd)
// 不然文件锁将失效
// 程序退出后kernel会自动close
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: