当前位置:   article > 正文

根据进程名字查找pid_通过进程名查找进程的pid

通过进程名查找进程的pid

Liunx中通过进程名查找进程PID可以通过 pidof [进程名] 来查找。反过来 ,相同通过PID查找进程名则没有相关命令。在linux根目录中,有一个/proc的VFS(虚拟文件系统),系统当前运行的所有进程都对应于该目录下的一个以进程PID命名的文件夹,其中存放进程运行的N多信息。其中有一个status文件,cat显示该文件, 第一行的Name即为进程名。

打开stardict程序,进程名为stardict;

shell中分别根据Pid获取进程名、根据进程名获取Pid

1)查找stardict的pid:pidof stardict

2)根据1)的pid查找进程名: grep "Name:" /proc/5884/status

应用:kill一个进程需要指定该进程的pid,所以我们需要先根据进程名找到pid,然后再kill;
killall命令则只需要给定进程名即可,应该是封装了这个过程。

C程序中实现上述过程


  1. #include <sys/types.h>
  2. #include <dirent.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #define BUF_SIZE 1024
  7. char* getPidByName(char* task_name, char * pid)
  8. {
  9. DIR *dir;
  10. struct dirent *ptr;
  11. FILE *fp;
  12. char filepath[50];//大小随意,能装下cmdline文件的路径即可
  13. char cur_task_name[50];//大小随意,能装下要识别的命令行文本即可
  14. char buf[BUF_SIZE];
  15. dir = opendir("/proc"); //打开路径
  16. if (NULL != dir)
  17. {
  18. while ((ptr = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹
  19. {
  20. //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
  21. if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
  22. continue;
  23. if (DT_DIR != ptr->d_type)
  24. continue;
  25. sprintf(filepath, "/proc/%s/status", ptr->d_name);//生成要读取的文件的路径
  26. fp = fopen(filepath, "r");//打开文件
  27. if (NULL != fp)
  28. {
  29. if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
  30. fclose(fp);
  31. continue;
  32. }
  33. sscanf(buf, "%*s %s", cur_task_name);
  34. //如果文件内容满足要求则打印路径的名字(即进程的PID)
  35. if (!strcmp(task_name, cur_task_name)){
  36. printf("PID: %s\n", ptr->d_name);
  37. strcpy(pid, ptr->d_name);
  38. }
  39. fclose(fp);
  40. }
  41. }
  42. closedir(dir);//关闭路径
  43. }
  44. return ptr->d_name;
  45. }
  46. void getNameByPid(pid_t pid, char *task_name) {
  47. char proc_pid_path[BUF_SIZE];
  48. char buf[BUF_SIZE];
  49. sprintf(proc_pid_path, "/proc/%d/status", pid);
  50. FILE* fp = fopen(proc_pid_path, "r");
  51. if(NULL != fp){
  52. if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
  53. fclose(fp);
  54. }
  55. fclose(fp);
  56. sscanf(buf, "%*s %s", task_name);
  57. }
  58. }
  59. void main(int argc, char *argv[])
  60. {
  61. char task_name[50];
  62. char *pid = (char*)calloc(10,sizeof(char));
  63. strcpy(task_name, argv[1]);
  64. printf("task name is %s\n", task_name);
  65. getPidByName(task_name, pid);
  66. printf("---pid is %s\n", pid);
  67. sprintf(text, "/proc/%s/oom_score_adj", pid);
  68. fd = open(text, O_WRONLY);
  69. if (fd >= 0)
  70. {
  71. sprintf(text, "%d", -1000);
  72. write(fd, text, strlen(text));
  73. close(fd);
  74. }
  75. sleep(15);
  76. }



对转载内容进行了小修改http://www.jb51.net/article/45012.htm

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/218232
推荐阅读
相关标签
  

闽ICP备14008679号