问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux c 检查进程是否存在

发布网友 发布时间:2022-04-23 16:19

我来回答

2个回答

热心网友 时间:2023-10-09 07:18

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://ke.baidu.com/view/2445803.htm?fr=aladdin。
atoi()函数能将字符串转换成整型数。参考百度百科:http://ke.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 好了。

热心网友 时间:2023-10-09 07:19

基本思路是先定义一个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;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
冠状病毒酒精消毒怎么使用 袁咏仪主演的真爱之百万新娘哪个网站可以看 ...方便的话告诉我结局怎么样。陈玉是不是死了 冉冉东升可以组什么句子 求我姓冉的专属句子 弹弹堂高手之路全部过完给多少强化石 百度弹弹堂2里面的《高手之路高级高抛打法(高级)》《高手之路高级高差训 ... 弹弹堂工厂3怎么打 弹弹堂高手之路的任务怎么触发的 腹肌练习计划 linux 怎么检查进程是否存在 想买一台式机 要求能带动2K显示器 最好是新的硬件配置 大家科普下电源的知识 我需要2k分辨率,但是我不玩游戏,只是用来做图和看电影,请问最低需要什么样的显卡配置才能输出2k分 2K144hz的显示器需要什么样的配置? 电脑播放4k*2K分辨率(4096*2160)的视频需要什么样的配置? 求一套只上网和看电影的主机配置,能带得起2K显示器的配置清单! 银行卡锁了。QQ钱包怎么查看余额 2k 对笔记本的配置要求是不是很高 qq钱包里的余额是银行卡的余额吗,我想查银行卡余额,能从绑定了的QQ钱包余额看 么 2K显示器对主机有什么要求吗 你们谁可以告诉我怎么样在QQ钱包上看银行卡余额,我第一次用不知道该怎查? 下面是我的电脑配置。想买AOC q24n2 2k显示器,正常看电影能带动吗? 想买个支持2k显示器的主机需要哪些配置,具体说下,最低多少钱?平常就玩玩dnf,看看电视? 请问2k的显示屏配的起i5 3470&#10133;1060 3g吗,玩守望先锋类型的fps游戏,偶尔玩单机? 怎么知道qq钱包绑定的银行卡还有多少钱 2k分辨率显示器有什么要求?需要什么样的电脑进行配置? 2k显示器需要什么电脑配置? 怎么查询手机qq钱包已绑定的卡余额 戴尔2k显示器需要什么主机配置最好 在q q 钱包里怎么才能查捆绑银行卡的余额 豆腐竹怎样做好吃? 豆制品腐竹怎么做好吃 腐竹和豆皮有何不同,都是怎么做出来的呢? 糖醋腐竹怎么做好吃? 传统手工豆制品腐竹怎样做能够更加鲜香,特别美味? 制做豆油皮 ,和制做豆腐竹,有什么区别 车损险只赔自己的车吗 自己全责自己车损可以理赔吗? 榨完油的大豆能做腐竹吗 雪豆腐竹炒肉末怎么做 各种豆制品的做法,如豆腐,腐竹,千张等等都是怎么做出来的啊?_百度知 ... 油豆干腐竹怎么做好吃 毛豆腐竹的做法大全,毛豆腐竹怎么做好吃 vivo手机取消屏幕旋转? 黑豆如何做腐竹 交通事故对方无保险自己车损险赔自己吗 vivo手机怎么关闭旋转 vivo手机怎么关闭自动旋转屏幕? 没买车损险自己全责自己车受损保险公司能赔吗? 产妇 梦见有人把死兔子放婴儿孩子身上