进程监视

2024-04-26 09:38
文章标签 进程 监视

本文主要是介绍进程监视,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

linux下经常要监视一个进程的运行,如果这个进程由于各种原因崩溃或退出了需要让监视它的程序重新把它运行起来,下面给出一种实现方法:


1.首先要保证一个程序只有一个实例在运行,避免重复启动:
在程序的main函数入口处先获取自身的PID保存在一个指定的文件中,之后程序在运行的时候我们就可以从这个文件中取出PID来判断程序是否在运行了。实际代码中main()函数里面前两行是:
CheckPID();
SavePID();

具体实现:
#define PID_PATH "/myproc.pid"
void CheckPID()
{int pid;char str[256] = {0};FILE *fp = fopen(PID_PATH, "r");if (fp){fgets(str, sizeof(str), fp);pid = atoi(str);fclose(fp);if (pid > 0 && (!kill(pid, 0))){printf("当前进程正在运行,请先停止.\n");exit(-1);}}
}void SavePID()
{FILE *fp = fopen(PID_PATH, "w");if (fp){fprintf(fp, "%d", getpid());fclose(fp);}
}

2.在监视进程中读取对方进程保存的PID,拿到这个PID之后,遍历/proc目录下的所有PID与之进行对比,如果相等说明进程正在运行,否则重新启动这个进程:
static int check_digit(const char *str)
{int len , i;len = strlen(str);if (len <= 0){return -1;}for (i=0; i<len; i++){if (str[i] < '0' || str[i] > '9'){return -1;}}return 0;
}int check_proc(pid_t pid)
{DIR *dp;char dir[] = "/proc";struct dirent *dirp;chdir(dir);if ((dp = opendir(dir)) == NULL){return -1;}while ((dirp = readdir(dp)) != NULL){char data[32] = {0};sprintf(data, "%s", dirp->d_name);if (check_digit(data)){continue;}if ((atoi(data) == pid)){return 0;}}return -1;
}void WatchProc()
{int pid;char str[32] = {0};char cmdstring[] = "/test"; // 需要监视的进程FILE *fp = fopen(PID_PATH , "r");if (fp){fgets(str, sizeof(str), fp);fclose(fp);if (strlen(str) > 0){pid = atoi(str);if (check_proc(pid)){system( cmdstring );}}}
}


这篇关于进程监视的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937236

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p