Linux c 进程名 pid,Linux C已知进程名字得到其PID号
最近需要實(shí)現(xiàn)一個(gè)功能,即在一個(gè)Linux C程序中,已知其他進(jìn)程的名字,需要獲得該進(jìn)程的PID,經(jīng)過一番上網(wǎng)搜索,找到兩種可行的方法:
1.通過popen創(chuàng)建一個(gè)管道,執(zhí)行shell命令并得到返回結(jié)果
2.通過搜索/proc文件夾下的文件內(nèi)容,得到進(jìn)程PID(順帶演示一下Linux C中如何讀取一個(gè)文件夾中的內(nèi)容)
為了方便進(jìn)行測試,首先隨便寫了一段代碼如下:
#include
void main()
{
char c;
scanf("%c", &c);
}
將代碼編譯為二進(jìn)制文件test,并使用./test運(yùn)行,由于該代碼中由于有scanf函數(shù)存在,會(huì)一直阻塞,下面就可以運(yùn)行其它程序來查詢這個(gè)進(jìn)程的PID了。
一、通過popen的方法
我們知道,在shell下可以通過下述命令來得到進(jìn)程test的PID:
ps -e | grep 'test' | awk '{print $1}'
(注:這個(gè)命令中,名字中含有test字樣的進(jìn)程都會(huì)被掃描到,如果只針對(duì)名字恰好為test的進(jìn)程,則需要修改這個(gè)命令)
那么在Linux C程序中,只要將這個(gè)命令移到shell環(huán)境中執(zhí)行一下,并讀取其執(zhí)行結(jié)果即可。在Linux C程序中執(zhí)行shell命令可以通過popen函數(shù),該函數(shù)會(huì)返回一個(gè)文件指針,可以像操作文件一樣對(duì)這個(gè)返回的指針進(jìn)行操作。關(guān)于popen函數(shù)的細(xì)節(jié),網(wǎng)上一搜一大把,這里就不說了,直接上代碼:
#include
#include
void main()
{
FILE *fp = popen("ps -e | grep \'test\' | awk \'{print $1}\'", "r");//打開管道,執(zhí)行shell 命令
char buffer[10] = {0};
while (NULL != fgets(buffer, 10, fp))?//逐行讀取執(zhí)行結(jié)果并打印
{
printf("PID:?%s", buffer);
}
pclose(fp); //關(guān)閉返回的文件指針,注意不是用fclose噢
}
二、通過搜索/proc文件夾下的內(nèi)容獲取進(jìn)程PID
在系統(tǒng)的/proc文件夾下,保存有系統(tǒng)當(dāng)前所有進(jìn)程的信息,比如一個(gè)進(jìn)程的PID為10000,那么/proc下會(huì)有一個(gè)名字為10000的文件夾,其中包含有該進(jìn)程的幾乎所有信息:其中/proc/10000/cmdline文件中保存了啟動(dòng)該進(jìn)程時(shí)使用的命令行。
由于剛才的進(jìn)程是通過./test運(yùn)行的,因此只要遍歷/proc下的文件夾,如果發(fā)現(xiàn)某個(gè)文件夾中的cmdline文件內(nèi)容為./test,則該文件夾的名字即為進(jìn)程的PID,代碼如下:
#include
#include
#include
void main()
{
DIR *dir;
struct dirent *ptr;
FILE *fp;
char filepath[50];//大小隨意,能裝下cmdline文件的路徑即可
char filetext[50];//大小隨意,能裝下要識(shí)別的命令行文本即可
dir = opendir("/proc");?//打開路徑
if (NULL != dir)
{
while ((ptr = readdir(dir)) != NULL)?//循環(huán)讀取路徑下的每一個(gè)文件/文件夾
{
//如果讀取到的是"."或者".."則跳過,讀取到的不是文件夾名字也跳過
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';//給讀出的內(nèi)容加上字符串結(jié)束符
//如果文件內(nèi)容滿足要求則打印路徑的名字(即進(jìn)程的PID)
if (filetext == strstr(filetext, "./test")) printf("PID:?%s\n", ptr->d_name);
fclose(fp);
}
}
closedir(dir);//關(guān)閉路徑
}
}
總結(jié)
以上是生活随笔為你收集整理的Linux c 进程名 pid,Linux C已知进程名字得到其PID号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机几何学论坛,现代几何学与计算机科学
- 下一篇: 【LeetCode笔记】300. 最长递