首页 > 系统相关 >根据进程名获取进程pid

根据进程名获取进程pid

时间:2022-12-03 18:00:55浏览次数:78  
标签:NULL name pid 获取 error 进程 include dir

摘自:https://blog.csdn.net/shanguangy111/article/details/77136187

原理:
linux操作系统中有一个名为/proc的虚拟文件系统,其中记录着进程和用户的相关信息,其中/proc/N (注:N表示数字)目录表示进程ip号为N的进程信息,就是这里找到我们要找的进程信息,其中/proc/N/status记录了进程状态信息,包含进程名等,比如:
root@proc # cat /proc/3544/status
Name: lighttpd
State: S (sleeping)
Tgid: 3544
Pid: 3544
PPid: 1
TracerPid: 0
Uid: 500 500 500 500
Gid: 500 500 500 500
Utrace: 0
FDSize: 32
Groups: 500
VmPeak: 2980 kB
VmSize: 2976 kB
。。。。。

注:对于存在多个同名的进程,只返回第一个进程ip,而不返回所有的进程ip

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <errno.h>
  5 #include <sys/types.h>
  6 #include <dirent.h>
  7 #include <sys/stat.h>
  8 #include <sys/mman.h>
  9 #include <fcntl.h>
 10 #include <ctype.h>
 11 #include <unistd.h>
 12 
 13 static void getProcessName(const int pid, char *pid_name, int pid_size);
 14 /*return:
 15  *      -1 not found
 16  *      not-negative is pid number
 17  *      writed by zhj 
 18  * */
 19 int getPidByName(const char *name)
 20 {
 21     DIR *dir_p = NULL;
 22     struct dirent entry, *res = NULL;
 23     int pid = -1, error_ret = 0;
 24     if(name == NULL)
 25     {
 26         return -1;
 27     }
 28 
 29     dir_p = opendir("/proc");
 30     if(NULL == dir_p)
 31     {
 32         printf("opendir error: %s\n", strerror(errno));
 33         goto ERR;
 34     }
 35     for(;;)
 36     {
 37         error_ret = readdir_r(dir_p, &entry, &res);
 38         if(error_ret != 0)
 39         {
 40             printf("readdir_r error: %s\n", strerror(error_ret));
 41             goto ERR;
 42         }
 43         if(res == NULL)
 44         {
 45             break;
 46         }
 47         if(isdigit(res->d_name[0]))
 48         {
 49             char pid_name[56] = "";
 50 
 51             pid = atoi(res->d_name);
 52 
 53             getProcessName(pid, pid_name, sizeof(pid_name));
 54             if(pid_name[0] != '\0' && strcmp(pid_name, name) == 0)
 55             {
 56                 break;
 57             }
 58         }
 59         pid = -1;
 60     }
 61 
 62 
 63     if(dir_p != NULL)
 64     {
 65         closedir(dir_p);
 66         dir_p = NULL;
 67     }
 68     return pid;
 69 ERR:
 70     if(dir_p != NULL)
 71     {
 72         closedir(dir_p);
 73         dir_p = NULL;
 74     }
 75     return -1;
 76 }
 77 
 78 
 79 static void getProcessName(const int pid, char *pid_name, int pid_size)
 80 {
 81     int fd = -1;
 82     char name[56] = "", *p = NULL, str[56] = "", buf[1024] = "";
 83     int size = 0;
 84     struct stat file_stat;
 85 
 86     pid_name[0] = '\0';
 87     size = snprintf(name, sizeof(name) - 1, "/proc/%d/status", pid);
 88     if(size <= 0 || size > sizeof(name) - 1)
 89     {
 90         printf("%s %d, snprintf error\n", __func__, __LINE__);
 91         goto ERR;
 92     }
 93 
 94     fd = open(name, O_RDONLY);  
 95     if(fd < 0)
 96     {
 97         printf("%s %d, open error: %s\n", __func__, __LINE__, strerror(errno));
 98         goto ERR;
 99     }
100     if(fstat(fd, &file_stat) < 0)
101     {
102         printf("fstat error: %s\n", strerror(errno));
103         goto ERR;
104     }
105     size = read(fd, buf, sizeof(buf) - 1);
106     if(size <= 0)
107     {
108         printf("read error: %s\n", strerror(errno));
109         goto ERR;
110     }
111     buf[size] = '\0';
112 
113     if(sscanf(buf, "%s %s", str, pid_name) != 2)    
114     {
115         goto ERR;
116     }
117 
118     if(fd != -1)
119     {
120         close(fd);
121         fd = -1;
122     }
123 
124     return ;
125 ERR:
126     if(fd !=  -1)
127     {
128         close(fd);
129         fd = -1;
130     }
131 
132     return ;
133 }

 

标签:NULL,name,pid,获取,error,进程,include,dir
From: https://www.cnblogs.com/LiuYanYGZ/p/16948468.html

相关文章

  • 进程
    0x00进程是运行在操作系统上的人员,操作系统是软件的管理机构负责分配软件的资源。在进程未被启动时,系统不为其分配资源。运行中的进程在系统中所拥有的资源•虚拟地址......
  • 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘,模块“Disk”启动失败。 未能
    问题描述另一个程序已锁定文件的一部分,进程无法访问产生原因在上网查阅资料得知,这是一种​​虚拟机​​的保护机制虚拟机在运行时,为防止数据被篡改,会将所运行的文件保护起来......
  • 【进程与线程】Linux中进程与线程的区别
    1.线程的创建方法创建线程具体调用pthread_create函数,这个函数实在glibc库中实现。在glibc中pthread_create的调用路径是__pthread_create_2_1->create_thread。其中crea......
  • 你在终端启动的进程,最后都是什么下场?(下)
    你在终端启动的进程,最后都是什么下场?(下)在上期文章你在终端启动的进程,最后都是什么下场?(上)当中我们介绍了前台进程最终结束的几种情况,在本篇文章当中主要给大家介绍后台进程......
  • PID模拟器下载
    关注微信公众号【工控羊】或者微信号【gksheep】,微信公众号后台输入数字编号【1018】即可获取下载链接。......
  • java——mybatis——Mybatis的CRUD——获取返回自增id
                                               ==========================......
  • el-dialog获取其中的dom节点方法
    经常在项目中需要创建弹框,弹框里进行一些dom的操作,插入播放器或者上传文件等等。那么获取dom,经常是null或undefinedthis.dialogVisible=truethis.$nextTick(()=>{ l......
  • 获取125种不同签名
    无意中发现一个比较好用的个性签名网站,输入内容和颜色即可一键生成图片,但一个个点太麻烦,因此通过F12查看网站请求可知,点击设计的时候实际上是发送一个带参数的post请求,返......
  • Linux杀掉指定的所有进程
    1、ps-ef|grepxxx找出所有的xxx进程2、ps-ef|grepxxx|grep-vgrep过滤掉所有xxx进程中含有关键字grep的进程3、ps-ef|grepxxx|grep-vgrep|......
  • 电脑技巧:如何用快捷键打开指定后台进程(或未在后台进程的) windows
    首先要知道,windows自带你按win+数字可以打开任务栏的程序,   想打开浏览器用win+1你可能有这样的顾虑,这是固定的吗?就算我重新启动了呢。那你只需右击“固定......