大家注意的是,下列命令中显示只是得出进程信息中的一部分
再linux中我们对于判断一个进程是否正在运行,再bash中还是很好解决的,这时我们可以用ps命令来查看各个进程的状态。下面时自己常用的一些ps的选项。
ps a 显示现行终端机下的所有程序,包括其他用户的程序
很显然这不是所有系统中的进程,这时候我们可以用ps -e 或ps -A(这两个命令的效果一样),
如果我们需要看到进程的全部信息,比如进程名,我们需要ps -ef这个命令,f选项代表着整个进程的信息,能够了解到进程的进程名,
当然很ps -ef也是一个进程,
那么我们如何在c程序中来判断一个进程是否在运行呢,我们可以这么想,竟然在bash中我们可以判断进程是否运行,那不我们是否可以在c程序中能够利用它来判断进程是否正在运行。
执行c程序是一个进程,bash也是一个进程,这样很明显使用利用多进程,和进程间通信的相关知识,前面我们学习了fork后利用exec来实现调用另一个进程,这样做是比较麻烦的,我们可以用popen这个系统调用来玩成想关的任务,
首先我们需用选择我们说要执行的命令
snprintf(command, sizeof(command), "ps -ef | grep -w %s | wc -l ", proname);
proname传进来的程序名,具体可看后面的源代码解释,利用snprintf函数我们可以将要执行的命令传进command中,具体的思路是,利用ps -ef显示所用进程的信息,然后用管道后用grep -w %s 来精确查找出所匹配的字符串的那一行,wc -l显示数据中的行数。
接下来是使用popen函数,
fp=popen(command, "r");
popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。
第一个参数是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。
第二个参数:“r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。
popen 的返回值是个标准 I/O 流,必须由 pclose 来终止。前面提到这个流是单向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用 popen 的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用 popen 的进程相同。
利用fgets我们可以显示出fp这个文件流中的信息,fgets的重用是一次输出一行
if((fgets(buf, sizeof(buf), fp)) != NULL)
{
count = atoi(buf);
//printf("%d\n", count);
}
下面是具体的代码:
#include <stdio.h>
#