小插曲 -- 使用Linux编写 判断程序是否在运行的小程序

编写思路

首先,在执行"ps -elf |grep xxx"时,如果xxx存在,通常会有两条结果,一个是xxx对应的PID,一个则是grep对应的PID,但是如果我希望执行命令后,xxx存在就只有xxx对应的PID,不存在就什么都不显示的话 ,可以将指令修改成:"ps -elf |grep XXX|grep -v grep",这样就可以屏蔽显示grep对应的PID,实现我想要的效果!

那么基于这个命令的特性,就可以编写一个判断程序是否正在运行的demo了,具体思路如下:

使用popen函数 来执行"ps -elf |grep XXX|grep -v grep ",然后读取执行的结果,如果不为空且包含"XXX",就说明程序正在运行!否则就是不在运行!

预备小知识点

strcat函数

【C库函数】strcat函数详解_爱躺平的威威的博客-CSDN博客

strstr函数

字符串操作函数strstr_白日曛的博客-CSDN博客

代码实现

在实际的运行中发现,如果程序不在运行,执行"ps -elf |grep XXX|grep -v grep "的运行结果打印出来最后都会有"00:00:00 ./ifrun XXX\n "(注意最后还有一个换行符) ,所以XXX最少会出现一次。(其实原因就是我写的代码ifrun也是一条进程,我把XXX作为参数传入后运行,而ps这条指令是找到所有带有XXX关键词的进程,我在ps指令里忽略了grep相关的结果,但没有忽略ifrun相关的结果,所以结果也会包含我现在ifrun的这个进程!也就是说,其实这里应该再次修改ps命令同时过滤grep和ifrun,这样结果就会很更干净,就可以使用本节开头使用的那套逻辑了,但是我反应的比较晚,就懒得改了,反之代码能实现我的要求就好)

对于这种情况,我采取了以下的方法来判断:

先用strstr,在popen执行的结果中查找XXX,并用cmp来保存返回值。

如果程序不在运行,此时cmp的值就应该是"XXX\n",所以此时再判断cmp的长度,如果比XXX多了1,说明程序不在运行!反之,程序就在运行!

ifrun.c:

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    FILE *file;
    char buffer[128] = {'\0'};
    char cmd1[64] = "ps -elf |grep "; //作为strcat的对象,必须为字符串"变"量
    char *cmd2 = "|grep -v grep";
    char *cmp = NULL;

    if(argc != 2){
        printf("wrong argc num!\n");
        return 1;
    }

    strcat(cmd1,argv[1]);
    strcat(cmd1,cmd2); //此时cmd1为 "ps -elf |grep XXX|grep -v grep"
    //  printf("cmd = %s\n",cmd1);

    file = popen(cmd1, "r");
    fread(buffer, sizeof(char), 128, file);

    cmp = strstr(buffer,argv[1]);

    if(strlen(cmp) != strlen(argv[1])+1){
        printf("%s is running\n",argv[1]);
    }else{
        printf("%s is NOT running\n",argv[1]);
    }
    printf("INFO:%s\n",buffer);

    return 0;
}

实现效果:

编译:

然后尝试查看"test" 这个文件是否在执行:

显然,test没有在运行。

此时另开一个终端,随便写一个test.c,编译并运行test:

此时回到刚刚那个终端再次运行"./ifrun test" :

可见,此时程序就检测到了程序的运行,说明逻辑没有问题,代码编写成功!

相关推荐
Cachel wood几秒前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Jasmine_llq几秒前
《 火星人 》
算法·青少年编程·c#
Code哈哈笑3 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶6 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Youkiup8 分钟前
【linux 常用命令】
linux·运维·服务器
qq_433618449 分钟前
shell 编程(二)
开发语言·bash·shell
闻缺陷则喜何志丹12 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
qq_2975046112 分钟前
【解决】Linux更新系统内核后Nvidia-smi has failed...
linux·运维·服务器
_oP_i17 分钟前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
charlie11451419123 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20