• 根据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  
     6 #define BUF_SIZE 1024
     7 
     8 void getPidByName(pid_t *pid, char *task_name)
     9 {
    10     DIR *dir;
    11     struct dirent *ptr;
    12     FILE *fp;
    13     char filepath[50];
    14     char cur_task_name[50];
    15     char buf[BUF_SIZE];
    16 
    17     dir = opendir("/proc"); 
    18     if (NULL != dir)
    19     {
    20         while ((ptr = readdir(dir)) != NULL) //循环读取/proc下的每一个文件/文件夹
    21         {
    22             //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
    23             if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
    24                 continue;
    25             if (DT_DIR != ptr->d_type)
    26                 continue;
    27            
    28             sprintf(filepath, "/proc/%s/status", ptr->d_name);//生成要读取的文件的路径
    29             fp = fopen(filepath, "r");
    30             if (NULL != fp)
    31             {
    32                 if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
    33                     fclose(fp);
    34                     continue;
    35                 }
    36                 sscanf(buf, "%*s %s", cur_task_name);
    37         
    38                 //如果文件内容满足要求则打印路径的名字(即进程的PID)
    39                 if (!strcmp(task_name, cur_task_name)){
    40                     sscanf(ptr->d_name, "%d", pid);
    41                 }
    42                 fclose(fp);
    43             }
    44         }
    45         closedir(dir);
    46     }
    47 }
    48 
    49 void getNameByPid(pid_t pid, char *task_name) {
    50     char proc_pid_path[BUF_SIZE];
    51     char buf[BUF_SIZE];
    52 
    53     sprintf(proc_pid_path, "/proc/%d/status", pid);
    54     FILE* fp = fopen(proc_pid_path, "r");
    55     if(NULL != fp){
    56         if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
    57             fclose(fp);
    58         }
    59         fclose(fp);
    60         sscanf(buf, "%*s %s", task_name);
    61     }
    62 }
    63 
    64 void main(int argc, char** argv)
    65 {
    66     char task_name[50];
    67     pid_t pid = getpid();
    68 
    69     printf("pid of this process:%d
    ", pid);
    70     getNameByPid(pid, task_name);
    71     
    72     /*
    73     strcpy(task_name, argv[0]+2);
    74     printf("task name is %s
    ", task_name);
    75     getPidByName(task_name);
    76     */
    77     printf("getNameByPid:%s
    ", task_name);
    78     getPidByName(&pid, task_name);
    79     printf("getPidByName:%d
    ", pid);
    80     sleep(15);
    81 }

    运行结果:

    进入/proc/4173/status查看文件内容,一切对应。

    Name: test
    State: S (sleeping)
    Tgid: 4173
    Pid: 4173
    PPid: 2721
    TracerPid: 0
    Uid: 1000 1000 1000 1000
    Gid: 1000 1000 1000 1000
    FDSize: 256
    Groups: 4 24 27 30 46 109 124 1000
    VmPeak: 4300 kB
    VmSize: 4296 kB
    VmLck: 0 kB
    VmPin: 0 kB
    VmHWM: 600 kB
    VmRSS: 600 kB
    VmData: 180 kB
    VmStk: 136 kB
    VmExe: 4 kB
    VmLib: 1884 kB
    VmPTE: 32 kB
    VmSwap: 0 kB
    Threads: 1
    SigQ: 0/27055
    SigPnd: 0000000000000000
    ShdPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000000000000
    SigCgt: 0000000000000000
    CapInh: 0000000000000000
    CapPrm: 0000000000000000
    CapEff: 0000000000000000
    CapBnd: ffffffffffffffff
    Cpus_allowed: f
    Cpus_allowed_list: 0-3
    Mems_allowed: 00000000,00000001
    Mems_allowed_list: 0
    voluntary_ctxt_switches: 2
    nonvoluntary_ctxt_switches: 9

  • 相关阅读:
    「SHOI2015」脑洞治疗仪
    LOJ 数列分块入门 8
    CF932F Escape Through Leaf
    NOIP2021游记总结
    [HEOI2016/TJOI2016]序列
    【模板】动态树(Link Cut Tree)
    LG P2839 [国家集训队]middle
    JZOJ 7377.欢乐豆
    JZOJ 7392. 【2021.11.17NOIP提高组联考】数 (ds)
    LOJ 数列分块入门 6
  • 原文地址:https://www.cnblogs.com/Seiyagoo/p/3496945.html
Copyright © 2020-2023  润新知