700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Linux c 进程名 pid Linux C已知进程名字得到其PID号

Linux c 进程名 pid Linux C已知进程名字得到其PID号

时间:2023-08-04 08:51:37

相关推荐

Linux c 进程名 pid Linux C已知进程名字得到其PID号

最近需要实现一个功能,即在一个Linux C程序中,已知其他进程的名字,需要获得该进程的PID,经过一番上网搜索,找到两种可行的方法:

1.通过popen创建一个管道,执行shell命令并得到返回结果

2.通过搜索/proc文件夹下的文件内容,得到进程PID(顺带演示一下Linux C中如何读取一个文件夹中的内容)

为了方便进行测试,首先随便写了一段代码如下:

#include

void main()

{

char c;

scanf("%c", &c);

}

将代码编译为二进制文件test,并使用./test运行,由于该代码中由于有scanf函数存在,会一直阻塞,下面就可以运行其它程序来查询这个进程的PID了。

一、通过popen的方法

我们知道,在shell下可以通过下述命令来得到进程test的PID:

ps -e | grep 'test' | awk '{print $1}'

(注:这个命令中,名字中含有test字样的进程都会被扫描到,如果只针对名字恰好为test的进程,则需要修改这个命令)

那么在Linux C程序中,只要将这个命令移到shell环境中执行一下,并读取其执行结果即可。在Linux C程序中执行shell命令可以通过popen函数,该函数会返回一个文件指针,可以像操作文件一样对这个返回的指针进行操作。关于popen函数的细节,网上一搜一大把,这里就不说了,直接上代码:

#include

#include

void main()

{

FILE *fp = popen("ps -e | grep \'test\' | awk \'{print $1}\'", "r");//打开管道,执行shell 命令

char buffer[10] = {0};

while (NULL != fgets(buffer, 10, fp))//逐行读取执行结果并打印

{

printf("PID:%s", buffer);

}

pclose(fp); //关闭返回的文件指针,注意不是用fclose噢

}

二、通过搜索/proc文件夹下的内容获取进程PID

在系统的/proc文件夹下,保存有系统当前所有进程的信息,比如一个进程的PID为10000,那么/proc下会有一个名字为10000的文件夹,其中包含有该进程的几乎所有信息:其中/proc/10000/cmdline文件中保存了启动该进程时使用的命令行。

由于刚才的进程是通过./test运行的,因此只要遍历/proc下的文件夹,如果发现某个文件夹中的cmdline文件内容为./test,则该文件夹的名字即为进程的PID,代码如下:

#include

#include

#include

void main()

{

DIR *dir;

struct dirent *ptr;

FILE *fp;

char filepath[50];//大小随意,能装下cmdline文件的路径即可

char filetext[50];//大小随意,能装下要识别的命令行文本即可

dir = opendir("/proc");//打开路径

if (NULL != dir)

{

while ((ptr = readdir(dir)) != NULL)//循环读取路径下的每一个文件/文件夹

{

//如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过

if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0)) continue;

if (DT_DIR != ptr->d_type) continue;

sprintf(filepath, "/proc/%s/cmdline", ptr->d_name);//生成要读取的文件的路径

fp = fopen(filepath, "r");//打开文件

if (NULL != fp)

{

fread(filetext, 1, 50, fp);//读取文件

filetext[49] = '\0';//给读出的内容加上字符串结束符

//如果文件内容满足要求则打印路径的名字(即进程的PID)

if (filetext == strstr(filetext, "./test")) printf("PID:%s\n", ptr->d_name);

fclose(fp);

}

}

closedir(dir);//关闭路径

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。