linux文件锁(保证只能同时启动一个实例,不同时启动多个实例)

news2024/11/26 8:50:15

文章目录

    • C++
      • 如果程序异常退出,会自动释放锁码?
    • shell脚本
    • python脚本

在这里插入图片描述

C++

可以使用Linux中的进程锁来实现只能启动一个实例的功能。一种常见的方法是使用文件锁(File Locking)。

可以在程序启动时创建一个特定的文件,并尝试对该文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序可以选择退出或者进行其他处理。

以下是一个使用文件锁的示例代码,使用C语言编写:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/file.h>

int main() {
    // 打开一个特定的文件
    int fd = open("/tmp/my_program.lock", O_RDWR | O_CREAT, 0644);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    // 尝试对文件加锁
    int ret = flock(fd, LOCK_EX | LOCK_NB);
    if (ret == -1) {
        printf("Another instance is already running.\n");
        exit(0);
    }

    // 加锁成功,程序继续执行
    printf("Running...\n");
    sleep(10);

    // 解锁并关闭文件
    flock(fd, LOCK_UN);
    close(fd);

    return 0;
}

在上面的示例中,程序会尝试对/tmp/my_program.lock文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序会输出提示信息并退出。

可以将上述代码保存为一个C文件(例如single_instance.c),然后使用以下命令编译并生成可执行文件:

gcc single_instance.c -o single_instance

然后,可以运行生成的可执行文件,只能启动一个实例:

./single_instance

如果尝试再次运行该可执行文件,会输出提示信息并退出。

如果程序异常退出,会自动释放锁码?

如果程序异常退出,操作系统会自动释放文件锁。这是因为文件锁是与文件描述符关联的,当文件描述符关闭时,文件锁也会被释放。

在上述示例代码中,当程序正常退出时,会显式地解锁并关闭文件描述符,这是为了确保文件锁被正确释放。但是,如果程序异常退出(例如由于信号中断或崩溃),操作系统会自动关闭文件描述符,并释放文件锁。

因此,无论程序是正常退出还是异常退出,文件锁都会被正确释放。这样可以确保下次运行程序时,能够再次获得文件锁。

shell脚本

在Shell脚本中,可以使用文件锁的概念来实现只能启动一个实例的功能。一种常见的方法是使用flock命令。

flock命令可以对文件进行加锁,如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序可以选择退出或者进行其他处理。

以下是一个使用flock命令的示例代码:

#!/bin/bash

# 尝试对文件加锁
exec 200>/tmp/my_script.lock
flock -n 200 || { echo "Another instance is already running."; exit 0; }

# 加锁成功,程序继续执行
echo "Running..."
sleep 10

# 解锁并关闭文件描述符
flock -u 200
exec 200>&-

在上面的示例中,程序会尝试对/tmp/my_script.lock文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序会输出提示信息并退出。

可以将上述代码保存为一个Shell脚本文件(例如single_instance.sh),然后使用以下命令给脚本文件添加执行权限:

chmod +x single_instance.sh

然后,可以运行该脚本文件,只能启动一个实例:

./single_instance.sh

如果尝试再次运行该脚本文件,会输出提示信息并退出。

python脚本

在Python脚本中,可以使用文件锁的概念来实现只能启动一个实例的功能。一种常见的方法是使用fcntl模块。

以下是一个使用fcntl模块的示例代码:

import fcntl
import os

# 打开一个特定的文件
lock_file = open('/tmp/my_script.lock', 'w')

# 尝试对文件加锁
try:
    fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    print("Another instance is already running.")
    exit(0)

# 加锁成功,程序继续执行
print("Running...")
os.sleep(10)

# 解锁并关闭文件
fcntl.flock(lock_file, fcntl.LOCK_UN)
lock_file.close()

在上面的示例中,程序会尝试对/tmp/my_script.lock文件进行加锁。如果加锁成功,则表示程序是第一个实例,可以继续执行。如果加锁失败,则表示已经有一个实例在运行,程序会输出提示信息并退出。

可以将上述代码保存为一个Python脚本文件(例如single_instance.py),然后使用以下命令运行该脚本文件:

python single_instance.py

如果尝试再次运行该脚本文件,会输出提示信息并退出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unknown column ‘str_time‘ in ‘field list‘

报这个错说明这个strTime在对象里有&#xff0c;在数据表里没有&#xff0c;数据库表里加上这个属性字段就行了。 或者可以加个注解忽略此映射字段&#xff1a; TableField(existfalse) 问题解决&#xff01;&#xff01;&#xff01;

常用语言的线程模型(Java、go、C++、python3) | 京东云技术团队

背景知识 软件是如何驱动硬件的&#xff1f; 硬件是需要相关的驱动程序才能执行&#xff0c;而驱动程序是安装在操作系统内核中。如果写了一个程序A&#xff0c;A程序想操作硬件工作&#xff0c;首先需要进行系统调用&#xff0c;由内核去找对应的驱动程序驱使硬件工作。而驱动…

Python学习笔记-WSGI接口

Web服务器网关接口&#xff08;Python Web Server Gateway Interface&#xff0c;缩写为WSGI&#xff09;是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后&#xff0c;许多其它语言中也出现了类似接口。 是CGI和FastCGI…

企业拥抱开源的同时,该如何做好风险防范?- 对话新思科技杨国梁

“软件供应链安全”相关文章合集 杨国梁 新思科技软件质量与安全部门高级安全架构师 当前&#xff0c;开源组件已成为软件应用程序中不可或缺的一部分。然而&#xff0c;随着开源软件数量的快速增长&#xff0c;应用领域的不断扩大&#xff0c;随之而来的安全问题也变得愈发严峻…

分页列表缓存,你真的会吗

看了很多关于缓存的文章&#xff0c;其中多级缓存思路&#xff0c;分页列表缓存这些知识点给了我很大的启发性。 写这篇文章&#xff0c;我们聊聊分页列表缓存&#xff0c;希望能帮助大家提升缓存技术认知。 1 直接缓存分页列表结果 显而易见&#xff0c;这是最简单易懂的方…

终点与起点,“玄魂工作室”的最后一篇推文

本文原载于 微信公众号 “VisActor”&#xff0c;https://mp.weixin.qq.com/s/tAjcPT8FjIQ6qbhSNWr2hw 做一个决绝的人 用了一天时间&#xff0c;我手工删除了500多篇原创文章&#xff0c;200多篇转载文章&#xff0c;删除了所有菜单、清空了所有自动回复、修改了公众号简介、…

JS事件及相关操作

JS如何处理事件&#xff1a;&#xff08;有三种处理方式&#xff09; this指向事件源 this指向事件源&#xff1a; this指向事件源&#xff1a; 冒泡流是从里向外&#xff0c;一层一层向父级抛&#xff0c;目前只有ie浏览器支持 捕获流是从外向里

2023年7月济南/郑州/深圳DAMA-CDGP数据治理专家认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

C++ 南科大于仕琪课程

目录 课程信息 7.4 function pointers 7.5 递归函数(Recursive functions) 课程信息 作者&#xff1a;于仕琪(南方科技大学计算机系副教授/opencv中国团队负责人) 视频地址&#xff1a;快速学习C和C&#xff0c;基础语法和优化策略&#xff0c;学了不再怕指针(南科大计算机…

Android事件高级手势处理

原文链接 Android事件高级手势处理 GestureDetector只能帮我们处理并识别一些常用的简单的手势&#xff0c;如点击&#xff0c;双击&#xff0c;长按&#xff0c;滑动&#xff08;Scroll&#xff09;和快速滑动&#xff08;Fling&#xff09;等&#xff0c;一般情况下&#xf…

js 实现导入导出功能(FileSave.js)

点击导出按钮弹出文件框导出文件&#xff0c;点击导入选择文件获取文件数据&#xff0c;以下我保存的是json。 html&#xff1a; <div class"layui-inline"> <div class"layui-btn-group"><button type"button" class"la…

文心一言 VS 讯飞星火 VS chatgpt (61)-- 算法导论6.4 5题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;61&#xff09;-- 算法导论6.4 5题 五、证明:在所有元素都不同的情况下&#xff0c;HEAPSORT 的时间复杂度是 Ω (nlgn)。 文心一言&#xff1a; 要证明在所有元素都不同的情况下&#xff0c;HEAPSORT 的时间复杂度是 Ω(n log…

音视频H265编码; Socket通信实现N对N连接代码示例

H.265编码和Socket通信是两个不同的概念&#xff0c;它们分别涉及视频编码和网络通信。在实现N对N连接时&#xff0c;您可以将它们结合起来&#xff0c;但要注意每个方面的具体实现。 H.265编码&#xff08;视频编码&#xff09;&#xff1a; H.265编码涉及将视频数据进行压缩…

速腾robosense-sdk配置和使用方法

官方的安装和配置教程https://github.com/RoboSense-LiDAR/rslidar_sdk/ 1.手动下载sdk&#xff0c;下载tar.gz&#xff0c;然后解压缩:Releases RoboSense-LiDAR/rslidar_sdk GitHub 2.个人电脑连接速腾激光雷达后&#xff0c;确保能够ping通。当连接网线后&#xff0c;电…

使用 appium 进行微信小程序的自动化测试

目录 前言&#xff1a; 微信小程序结构 自动化用例的调整 示例代码 后记 前言&#xff1a; 微信小程序是一种流行的移动应用程序&#xff0c;它在移动设备上提供了丰富的功能和用户体验。为了确保微信小程序的质量和稳定性&#xff0c;自动化测试是必不可少的一环。Appiu…

视频融合平台EasyCVR级联后上级平台播放失败的问题排查与优化

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制等视频能力与服务&#xff0c;可支持多协议、多类型的海量设备接入与分发。 …

MATLAB数据类型及代码实现

本推文是MATLAB基础与统计实战课程中的S02-1数据类型及代码实现 矩阵(Matrix) MATLAB最基础的数据单位是矩阵。什么是矩阵&#xff1f; 如下图可以看作M行乘以N列的数的组。这就是矩阵最基础的显示 ■区别于其他数据分 析软件或者编程语言的最大一 个特点(如&#xff0c;转…

DOM4j及源码分析

文章目录 DOM4jXML 解析技术原理XML 解析技术介绍 DOM4J 介绍DOM4j 中&#xff0c;获得 Document 对象的方式有三种源码增删改查代码 DOM4j 文档: https://dom4j.github.io/javadoc/1.6.1/ 本地文档: dom4j-1.6.1\docs\index.html XML 解析技术原理 不管是 html 文件还是 x…

OAuth2.0详细介绍与实践(通俗易懂)

一、OAuth2.0介绍 1.1 概述 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息&#xff08;如用户名与密码&#xff09;&#xff0c;即第三方无需使用用户的用户名与密码就可以申请获…

[Juc进阶]Callable、Future和FutureTask

一、Callable 与 Runnable 先说一下java.lang.Runnable吧&#xff0c;它是一个接口&#xff0c;在它里面只声明了一个run()方法&#xff1a; public interface Runnable {public abstract void run(); }由于run()方法返回值为void类型&#xff0c;所以在执行完任务之后无法返…