最近项目中 需要在一个进程中监控另外的一个进程 所以使用了文件锁的方案去实现
代码如下:
#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
# 干掉第一个进程 观察 第二个带参数的进程的执行结果