热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux进程号会重复吗,Linux下防止重复启动相同程序的俩种处理方式

第一种方式:该防止重复启动相同程序的基本原理是基于父子进程共享内存和文件强制锁,子进程调用实现功能的函数文件强制锁:调用flock函数设置

第一种方式:

//该防止重复启动相同程序的基本原理是基于父子进程共享内存和文件强制锁,子进程调用实现功能的函数

//文件强制锁:调用flock函数设置文件为LOCK_EX强制锁,可防止独立的不同进程访问同一文件,达到判断程序是否已在运/

//行的目的;

//父子进程共享内存:子进程如果得到文件锁,说明该程序没有被启动,同时将共享内存struct shared_use_st中written

//置为1,父进程等待子进程结束;子进程如果得不到文件锁,说明该程序已经被启动,共享内存struct shared_use_st中w

//ritten不会被置为1,父进程会杀死子进程,同时退出,达到关闭死进程的效果;

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define FLOCKFILEPATH "/etc/wifi/WDWifiDetector.flock"//自定义要加文件锁的文件路径

struct shared_use_st

{

int written;//作为一个标志,非0:表示可读,0表示可写

char text[1024];//记录写入和读取的文本

};

int MyMain();//自己要实现功能的函数

int main()

{

pid_t childPid;

void *shm = NULL;

struct shared_use_st *shared;

int shmid;

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);

if(shmid == -1)

{

fprintf(stderr, "shmget failed\n");

exit(0);

}

shm = shmat(shmid, 0, 0);

if(shm == (void*)-1)

{

fprintf(stderr, "shmat failed\n");

exit(0);

}

shared = (struct shared_use_st*)shm;

shared->written = 0;

if((childPid = fork()) 

{

std::cout<

return 1;

}

if(childPid &#61;&#61; 0)

{

int fd &#61; open(FLOCKFILEPATH, O_RDWR | O_CREAT, S_IRWXU);

flock(fd, LOCK_EX);//如果程序已启动&#xff0c;则该次启动会在这里一直等待已启动程序将文件锁释放

shared->written &#61; 1;

MyMain();//调用实现功能的函数

}

else

{

sleep(3);

if(shared->written &#61;&#61; 0)

{

std::stringstream ss;

ss<

system(ss.str().c_str());

std::cout<

std::cout<

return 1;

}

int status;

waitpid(childPid, &status, 0);

std::cout<

}

return 0;

}

//资料参考博客&#xff1a;

//http://blog.csdn.net/ljianhui/article/details/10253345

//

第二种方式&#xff1a;

比较简单的进程号获取比较&#xff1a;

int ret &#61; system("echo $(pgrep WDWifiDetector) |grep -c \" \"");

if(!ret)//如果只有当前的进程则ret&#61;&#61;0&#xff1b;如果已经开启了该程序&#xff0c;旧的进程号加上目前的进程号则ret&#61;&#61;256

{

std::cout<

return 1;

}

解释&#xff1a;

echo $(pgrep WDWifiDetector) |grep -c \" \"&#xff1a;

pgrep WDWifiDetector&#xff1a;获取程序名称为WDWifiDetector的进程是否存在&#xff1b;

grep -c \" \"&#xff1a;判断进程是否是俩(当前进程和已经开启的进程)&#xff1b;



推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
author-avatar
-Dear-xi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有