总体概述:
在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进程。
运行效果:
注:由于作者能力有限,文中表述难免有错误。如果发现文中错误之处,敬请广大好友批评指正。