QNX下根据进程名查找PID

#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;
}

你可能感兴趣的:(QNX下根据进程名查找PID)