0
点赞
收藏
分享

微信扫一扫

嵌入式linux学习笔记--- 使用文件锁来判断 进程是否活动

千妈小语 2022-03-26 阅读 75

最近项目中 需要在一个进程中监控另外的一个进程 所以使用了文件锁的方案去实现
代码如下:

#include <sys/file.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>
#define file_lock "/home/someone/file_lock"
void fileLock()
{
  int fd = open(file_lock, O_RDWR | O_CREAT, 0666);

  struct flock fl;
  fl.l_type = F_WRLCK;  // 文件上锁
  fl.l_start = 0;
  fl.l_whence = SEEK_SET;
  fl.l_len = 0;

  fcntl(fd, F_SETLK, &fl);
}

int isRunning(void)
{
    static int fd = -1;
    static int last_status = 0;
	struct flock lock = {0};
	int ret = 0;
	if(fd == -1 ){
		fd = open(file_lock, O_CREAT | O_RDWR);
	}
	//判断是否有锁
	ret = fcntl(fd,F_GETLK,&lock);
	if(ret == -1){		
	    close(fd);
        fd = -1;        
	}else{
        if(lock.l_type != F_UNLCK){
            ret = 1;
        }else {
            ret = 0;
        }
    }
    if(ret != last_status){
        if(ret){
            printf("****** PROCESS START ****** %d",ret);
        }else{
            printf("****** PROCESS STOP ******");
        }
        last_status = ret;
    }
	return (ret == 0) ? 0 : 1;
}

int main(int argc,char **argv)
{

    if(argc > 1){ // 根据是否有参数 判断当前的程序的角色
        while(true){
            printf("%d \n",isRunning());
            usleep(1000000);
        }
    }else{
        fileLock();
        while(true){         
            usleep(1000000);
        }
    }

}


使用方法
带参数

# 开启第一个shell 编译程序
g++ 1.cpp
# 运行不带参数的程序  锁住文件
./a.out 
# 开启第二个shell  随便带一个参数 这个进程将会作为监控进程
./a.out 1
# 干掉第一个进程  观察 第二个带参数的进程的执行结果

在这里插入图片描述

举报

相关推荐

0 条评论