linux下通过进程名获得进程号

       这些代码原来是别人委托我开发,用来控制JVM的CPU使用率的, 后来因为种种原因,之开发到一半,所以现在写到博客里了。。。。

 process.h

1 #ifndef PROCESS_H_INCLUDED
2 #define PROCESS_H_INCLUDED
3 char *basename(const char *path);
4 int get_pid_by_name(const char* process_name, pid_t pid_list[], int list_size);
5 int is_process_exist(const char* process_name);
6 #endif // PROCESS_H_INCLUDED

process.c

 1     #include <stdio.h>
 2     #include <stdlib.h>
 3     #include <unistd.h>
 4     #include <string.h>
 5     #include <sys/types.h>
 6     #include <dirent.h>
 7     #include <ctype.h>
 8     #include <errno.h>
 9     char *basename(const char *path)
10     {
11         register const char *s;
12         register const char *p;
13 
14         p = s = path;
15 
16         while (*s) {
17             if (*s++ == '/') {
18                 p = s;
19             }
20         }
21 
22         return (char *) p;
23     }
24 
25      /* 根据进程名称获取PID, 比较 base name of pid_name
26       * pid_list: 获取PID列表
27       * list_size: 获取PID列表长度
28       * RETURN值说明:
29       *              < 0: 
30       *              >=0: 发现多少PID, pid_list 将保存已发现的PID
31       */
32     int get_pid_by_name(const char* process_name, pid_t pid_list[], int list_size)
33     {
34     #define  MAX_BUF_SIZE       256
35 
36         DIR *dir;
37         struct dirent *next;
38         int count=0;
39         pid_t pid;
40         FILE *fp;
41         char *base_pname = NULL;
42         char *base_fname = NULL;
43         char cmdline[MAX_BUF_SIZE];
44         char path[MAX_BUF_SIZE];
45 
46         if(process_name == NULL || pid_list == NULL)
47             return -EINVAL;
48 
49         base_pname = basename(process_name);
50         if(strlen(base_pname) <= 0)
51             return -EINVAL;
52 
53         dir = opendir("/proc");
54         if (!dir)
55         {
56             return -EIO;
57         }
58         while ((next = readdir(dir)) != NULL) {
59             /* skip non-number */
60             if (!isdigit(*next->d_name))
61                 continue;
62 
63             pid = strtol(next->d_name, NULL, 0);
64             sprintf(path, "/proc/%u/cmdline", pid);
65             fp = fopen(path, "r");
66             if(fp == NULL)
67                 continue;
68 
69             memset(cmdline, 0, sizeof(cmdline));
70             if(fread(cmdline, MAX_BUF_SIZE - 1, 1, fp) < 0){
71                 fclose(fp);
72                 continue;
73             }
74             fclose(fp);
75             base_fname = basename(cmdline);
76 
77             if (strcmp(base_fname, base_pname) == 0 )
78             {
79                 if(count >= list_size){
80                     break;
81                 }else{
82                     pid_list[count] = pid;
83                     count++;
84                 }
85             }
86         }
87         closedir(dir) ;
88         return count;
89     }
90 
91     /* 如果进程已经存在, return true */
92     int is_process_exist(const char* process_name)
93     {
94         pid_t pid;
95 
96         return (get_pid_by_name(process_name, &pid, 1) > 0);
97     }

main.c

    #include <stdlib.h>  
    #include <stdio.h>  
    #include "process.h"  
      
    #define MAX_PID_NUM     32  
    int main(int argc, char* argv[])  
    {  
      char* process;  
      int ret = 0;  
      int n;  
      pid_t pid[MAX_PID_NUM];  
      
      if(argc < 2)  
        process = argv[0];  
      else  
        process = argv[1];  
      
      ret = get_pid_by_name(process, pid, MAX_PID_NUM);  
      printf("process '%s' is existed? (%d): %c\n", process, ret, (ret > 0)?'y':'n');  
      for(n=0;n<ret;n++){  
        printf("%u\n", pid[n]);  
      }  
      return ret;  
    }  

 

Makefile:

 1     PROG=check_process  
 2     OBJS=process.o main.o  
 3     #CFLAGS = -g -ggdb  
 4       
 5     all:$(PROG)  
 6       
 7     check_process:$(OBJS)  
 8         $(CC) -o $@ $^ $(LDFLAGS)  
 9       
10     %.o:%.c  
11         $(CC) -c -o $@ $(CFLAGS) $<  
12       
13     clean:  
14         rm -rf $(PROG) *.o  
posted @ 2012-11-15 13:02  PD520C  阅读(4906)  评论(0编辑  收藏  举报