#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#define BUF_SIZE 1024
bool GetPidFromName()
{
DIR *dir;
struct dirent *ptr;
FILE *fp;
char filepath[50];//大小随意,能装下cmdline文件的路径即可
char cur_task_name[50];//大小随意,能装下要识别的命令行文本即可
char buf[BUF_SIZE];
dir = opendir("/proc"); //打开路径
if (NULL != dir)
{
while ((ptr = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹
{
//如果读取到的是"."或者".."则跳过
if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
continue;
//如果读取到的不是文件夹名字则跳过
//qnx660下d_type没有定义
/*if (DT_DIR != ptr->d_type)
continue;*/
//如果读取到的文件夹名称不是由数字组成,则跳过
//例如 boot , self
memset(buf,0,BUF_SIZE*sizeof(char));
if (sscanf(ptr->d_name,"%[^0-9]",buf))
continue;
sprintf(filepath, "/proc/%s/exefile", ptr->d_name);//该进程对应的exefile路径
fp = fopen(filepath, "r");//打开文件
if (NULL != fp)
{
memset(buf,0,BUF_SIZE*sizeof(char));
if( fgets(buf, BUF_SIZE-1, fp)== NULL )// 读取exefile
{
fclose(fp);
continue;
}
// exefile内容为:/usr/sbin/qconn
// 最后部分为进程名称
char ch = '/';
char *pch = NULL;
pch = strrchr(buf,ch);
if (pch)
{
strcpy(cur_task_name,pch+1);
}
else //ptr == NULL
{
strcpy(cur_task_name,buf);
}
//如果文件内容满足要求则打印路径的名字(即进程的PID)
if (!strcmp(OsRES_Name,cur_task_name))
{
//找到对应进程的PID
//sscanf(ptr->d_name,"%[0-9]",buf)
OsRES_Pid = atol(ptr->d_name);
return true;
}
fclose(fp);
}
}
closedir(dir);//关闭路径
}
return false;
}