linux c 检查进程是不是存在

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux c 检查进程是不是存在相关的知识,希望对你有一定的参考价值。

帮我解释一下这段代码,谢谢,其中的ps命令代表什么?ABNORMAL、CONFLICT、ERROR和NOERROR参数定义在哪个头文件?

int detect_process(char * process_name)

FILE *ptr;
char buff[512];
char ps[128];
sprintf(ps,"ps -e | grep -c ' %s</p>",process_name);
strcpy(buff,"ABNORMAL");
if((ptr=popen(ps, "r")) != NULL)

while (fgets(buff, 512, ptr) != NULL)

if(atoi(buff)>=2)

pclose(ptr);
return CONFLICT;



if(strcmp(buff,"ABNORMAL")==0) /*ps command error*/
return ERROR;
pclose(ptr);
return NOERROR;

1、ps 是一个shell里面的命令,用来输出当前进程状态的。想知道详细用法可以在linux命令行中输入: man ps
2、"ABNORMAL",注意这是一个字符串常量,因为在C语言中使用双引号可以定义一个字符串常量。这个字符串可以是程序员自己随便写的,就像"hello word" 一样。"ABNORMAL"表示不正常的意思。

3、ERROR、CONFLICT、NOERROR三个常量,可以使用#define语句进行定义。至于是在哪个头文件中定义很难说。我建议你可以在当前的.c文件开始的地方自己定义一下,例如:
#include <stdio.h>
... /*其他的头文件等等*/

#define ERROR -1
#define CONFLICT 1
#define NOERROR 0

... /*其他的函数*/

int detect_process(char * process_name)

FILE *ptr;
char buff[512];
char ps[128];
sprintf(ps,"ps -e | grep -c ' %s</p>",process_name);
strcpy(buff,"ABNORMAL");
if((ptr=popen(ps, "r")) != NULL)

while (fgets(buff, 512, ptr) != NULL)

if(atoi(buff)>=2)

pclose(ptr);
return CONFLICT;



if(strcmp(buff,"ABNORMAL")==0) /*ps command error*/
return ERROR;
pclose(ptr);
return NOERROR;


请注意:里面有个popen() pclose()函数,是通过管道创建一个进程,这两个函数必须要有<stdio.h>文件。具体的参数可以参看百度百科:http://baike.baidu.com/view/2445803.htm?fr=aladdin。
atoi()函数能将字符串转换成整型数。参考百度百科:http://baike.baidu.com/view/653935.htm。

4、整个程序的意思是:

(1)使用"ps"命令,将结果保存到ps变量中,注意sprintf的第一个参数是一个char数组。
(2)将"ABNORMAL"字符串保存到buff变量中,buff也是一个char数组。
(3)使用popen()函数创建一个进程,并将这个进程定向到标准输出(也就是显示器上)。
(4)将进程的输入出存到buff变量中,然后将其转化为数字
(5)如果这个数字>=2说明发生了冲突,返回CONFLICT
(6)在循环之后,比较一下,如果buff一直是"ABNORMAL",说明ps 命令出错,返回ERROR
(7)否则返回NOERROR

综上:ERROR、CONFLICT、NOERROR几个变量只是作为函数返回值,告诉函数调用者这次调用的结果而已,所以完全可以自己定义。除非你们公司已经规定了ERROR必须是某个值,不然你是可以自己定义的,只是在以后调用detect_process()函数的时候记得什么返回值对应什么结果就行了。
自己定义就是在.c文件开头使用#define 好了。
参考技术A 基本思路是先定义一个FILE指针,用该指针接收popen()执行ps指令的返回值,再从指针中读取数据到缓存,根据得到的数据判断进程是否存在。
参考代码如下:
#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;

检查linux脚本中是不是存在文件[重复]

【中文标题】检查linux脚本中是不是存在文件[重复]【英文标题】:Check if a file exists in a linux script [duplicate]检查linux脚本中是否存在文件[重复] 【发布时间】:2013-12-07 13:01:24 【问题描述】:

我制作了一个 linux 脚本,它接收一个目录路径作为第一个参数。我不知道路径。我想检查该特定路径是否存在“file.txt”。例如:

if [ -e $1/file.txt ];then
       echo HAHA
fi

【问题讨论】:

[[ -f "$1/file.txt" ]] &amp;&amp; echo "HAHA" 应该可以工作。 只要$1 不包含任何空格,您所拥有的就应该按预期工作。将其引用为 "$1/file.txt" 可以解决这个问题。 【参考方案1】:
if [[ -e "$1/file.txt" ]]; then
       echo "It exists"
fi

【讨论】:

以上是关于linux c 检查进程是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

linux怎么判断一个进程是不是存在

C#:检查文件是不是存在 - 进程无法访问文件错误

开机运行A.exe,判断一些进程是不是存在,如果存在则结束A.exe,如果这些进程不存在则重新运行A.exe?

linux下进程内存布局及变量存储位置检查

脚本一检查 linux 进程是否存在

< Linux >:进程地址空间