你们注意的是,下述命令中显示只是得出进程信息中的一部份
再linux中我们对于判定一个进程是否正在运行,再bash中还是挺好解决的,这时我们可以用ps命令来查看各个进程的状态。下边时自己常用的一些ps的选项。
psa显示现行终端机下的所有程序,包括其他用户的程序
很其实这不是所有系统中的进程,这时侯我们可以用ps-e或ps-A(这两个命令的疗效一样),
假如我们须要见到进程的全部信息,例如进程名,我们须要ps-ef这个命令,f选项代表着整个进程的信息,才能了解到进程的进程名,
其实很ps-ef也是一个进程,
这么我们怎样在c程序中来判定一个进程是否在运行呢,我们可以如此想linux运行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显示所用进程的信息linux定时器,之后用管线后用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流linux运行c程序红旗linux系统,必须由pclose来中止。上面提及这个流是双向的。所以向这个流写内容相当于写入该命令的标准输入;命令的标准输出和调用popen的进程相同。与之相反的,从流中读数据相当于读取命令的标准输出;命令的标准输入和调用popen的进程相同。
借助fgets我们可以显示出fp这个文件流中的信息,fgets的重用是一次输出一行
if((fgets(buf, sizeof(buf), fp)) != NULL)
{
count = atoi(buf);
//printf("%dn", count);
}
下边是具体的代码:
#include
#