linux如何判断程序是否在运行

290 阅读2分钟

总体概述:

在linux系统环境下,编写C语言程序,调用C库函数,获取程序运行的数量,从而判断程序是否在运行。需要用到的函数有 popen, pclose, fgets这几个函数。

函数语法:

popen函数语法:FILE *popen(const char *command, const char *type);

pclose函数语法:int pclose(FILE *stream);

fgets函数语法:char *fgets(char *s, int size, FILE *stream);

函数作用:

popen函数的作用:通过创建管道、分叉和调用shell来打开进程。

pclose函数的作用:等待相关进程终止,并返回的命令退出状态。

fgets 函数的作用:从流中最多读取一个小于size的字符,并将它们存储到s所指向的缓冲区中。

参数介绍:

popen函数参数介绍:

  • 输入参数:command => 一个shell命令行。
  • 输入参数:type => 用于读取的字母'r'或字母“w”代表写。
  • 返回值:成功:标准IO流;失败:返回 NULL。

pclose函数参数介绍:

  • 输入参数:stream => 标准IO流。
  • 返回值:成功:返回 0;失败:-1。

fgets 函数参数介绍:

  • 输出参数:s => 存储字符的缓存。
  • 输入参数:size => 存储字符缓存的大小。
  • 输入参数:stream => 要读取的标准IO流。
  • 返回值:成功:返回参数s的地址;失败:返回 NULL。

代码示例:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>static int program_running_number(const char *prog)
{
    FILE *fp;
    int count = 0;
    char buf[8] = {0};
    char command[128];
​
    snprintf(command, sizeof(command), \
        "ps -ef | grep -v grep | grep -w -c %s", prog);
    command[sizeof(command) - 1] = '\0';
​
    fp = popen(command, "r");
    if (fp == NULL) {
        printf("execute %s failed: %s", command, strerror(errno));
        return 0;
    }
​
    if (fgets(buf, sizeof(buf), fp)) {
        count = atoi(buf);
    }
    pclose(fp);
​
    return count;
}
​
int main(int argc, char **argv)
{
    const char *program_name[] = {"ls", "program", "init", NULL};
    for (const char **prog = program_name; *prog; prog++) {
        if (program_running_number(*prog) > 0)
            printf("the program %s is running.\n", *prog);
        else
            printf("the program %s isn't running.\n", *prog);
    }
    
    return 0;
}

使用方法:

$ mkdir ~/clanguage && cd ~/clanguage
$ touch program.c             注:创建并拷贝代码到program.c,保存退出。
$ gcc -o program program.c
$ ./program
注: 代码中指定了三个特定的进程,分别是ls、program、init进程。

运行效果:

image-20230519164210891.png 注:由于作者能力有限,文中表述难免有错误。如果发现文中错误之处,敬请广大好友批评指正。