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

总体概述:

在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进程。

运行效果:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值