基本思路是先定义一个FILE指针,用该指针接收popen()执行ps指令的返回值,再从指针中读取数据到缓存,根据得到的数据判断进程是否存在,怎么操作要看ps的参数了。
示例一
下面这个示例从网上找的,根据个数来判断进程是否存在
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=program&Number=543154&fpart=all
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<limits.h>
#define BUFSZ PIPE_BUF
void err_quit(char *msg)
{
perror(msg);
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[])
{
FILE* fp;
int count;
char buf[BUFSZ];
char command[150];
if(argc != 2)
{
printf("USAGE: example <process name>\n");
exit(EXIT_SUCCESS);
}
else
sprintf(command, "ps -C %s|wc -l", argv[1] );
if((fp = popen(command,"r")) == NULL)
err_quit("popen");
if( (fgets(buf,BUFSZ,fp))!= NULL )
{
count = atoi(buf);
if((count - 1) == 0)
printf("%s not found\n",argv[1]);
else
printf("process : %s total is %d\n",argv[1],(count - 1));
}
pclose(fp);
exit(EXIT_SUCCESS);
}
示例二
这个麻烦一点,从ps的返回结果获取PID,再用kill查看是否存在
http://hi.baidu.com/backylee/blog/item/de366ca8d843cabdcb130c9b.html
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
int main()
{
FILE *pstr;
char cmd[128],buff[512];
pid_t pID;
int pidnum;
char *name= "Test";/*进程名*/
char *p = NULL;
int ret=3;
memset(cmd,0,sizeof(cmd));
sprintf(cmd, "ps -ef|grep %s",name);
pstr=popen(cmd, "r");
if(pstr==NULL)
{ return 1; }
memset(buff,0,sizeof(buff));
fgets(buff,512,pstr);
printf("%s\n",buff);
p=strtok(buff, " ");
p=strtok(NULL, " ");
pclose(pstr); //这句是否去掉,取决于当前系统中ps后,进程ID号是否是第一个字段
if(p==NULL)
{ return 1; }
//printf( "pid:%s\n",p);
if(strlen(p)==0)
{ return 1; }
if((pidnum=atoi(p))==0)
{ return 1; }
printf("pidnum: %d\n",pidnum);
pID=(pid_t)pidnum;
ret=kill(pID,0);
printf("ret= %d \n",ret);
if(0==ret)
printf("process: %s exist!\n",name);
else
printf("process: %s not exist!\n",name);
return 0;
}