您的位置:首页 > 移动开发 > Android开发

解析ANDROID ps命令执行后各项参数的含义 .

2014-05-08 10:57 453 查看
如何查看ANDROID进程信息呢?

可以打开Adb shell,然后我们就有2种方法:

方法1:直接输入ps命令

输入之后,我们就可以看到如下的信息:

[plain]
view plaincopyprint?

# ps  
ps  
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME  
root      1     0     276    188   c0099f1c 000086e8 S /init  
root      2     0     0      0     c004df64 00000000 S kthreadd  
root      3     2     0      0     c003fa28 00000000 S ksoftirqd/0  
root      4     2     0      0     c004abc0 00000000 S events/0  
root      5     2     0      0     c004abc0 00000000 S khelper  
root      6     2     0      0     c004abc0 00000000 S suspend  
root      7     2     0      0     c004abc0 00000000 S kblockd/0  
root      8     2     0      0     c004abc0 00000000 S cqueue  
root      9     2     0      0     c01780d0 00000000 S kseriod  
root      10    2     0      0     c004abc0 00000000 S kmmcd  
root      11    2     0      0     c006efa8 00000000 S pdflush  
root      12    2     0      0     c006efa8 00000000 S pdflush  
root      13    2     0      0     c0073480 00000000 S kswapd0  
root      14    2     0      0     c004abc0 00000000 S aio/0  
root      22    2     0      0     c0175900 00000000 S mtdblockdc  

# ps
ps
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
root      1     0     276    188   c0099f1c 000086e8 S /init
root      2     0     0      0     c004df64 00000000 S kthreadd
root      3     2     0      0     c003fa28 00000000 S ksoftirqd/0
root      4     2     0      0     c004abc0 00000000 S events/0
root      5     2     0      0     c004abc0 00000000 S khelper
root      6     2     0      0     c004abc0 00000000 S suspend
root      7     2     0      0     c004abc0 00000000 S kblockd/0
root      8     2     0      0     c004abc0 00000000 S cqueue
root      9     2     0      0     c01780d0 00000000 S kseriod
root      10    2     0      0     c004abc0 00000000 S kmmcd
root      11    2     0      0     c006efa8 00000000 S pdflush
root      12    2     0      0     c006efa8 00000000 S pdflush
root      13    2     0      0     c0073480 00000000 S kswapd0
root      14    2     0      0     c004abc0 00000000 S aio/0
root      22    2     0      0     c0175900 00000000 S mtdblockdc


那么我们禁不住要问:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME

那么这些项各代表着什么意思呢?

USER:  进程的当前用户;
PID   : 毫无疑问, process ID的缩写,也就进程号;
PPID  :process parent ID,父进程ID
VSIZE  : virtual size,进程虚拟地址空间大小;
RSS    : 进程正在使用的物理内存的大小;
WCHAN  :进程如果处于休眠状态的话,在内核中的地址;
PC  : program counter,
NAME: process name,进程的名称
 

android ps命令实现的源码

android下ps命令的源码的位置:android/system/core/toolbox/ps.c,其实现如下:

[cpp]
view plaincopyprint?

int ps_main(int argc, char **argv)  
{  
    DIR *d;  
    struct dirent *de;  
    char *namefilter = 0;  
    int pidfilter = 0;  
    int threads = 0;  
      
    d = opendir("/proc");  
    if(d == 0) return -1;  
  
    while(argc > 1){  
        if(!strcmp(argv[1],"-t")) {  
            threads = 1;  
        } else if(!strcmp(argv[1],"-x")) {  
            display_flags |= SHOW_TIME;  
        } else if(!strcmp(argv[1],"-p")) {  
            display_flags |= SHOW_PRIO;  
        }  else if(isdigit(argv[1][0])){  
            pidfilter = atoi(argv[1]);  
        } else {  
            namefilter = argv[1];  
        }  
        argc--;  
        argv++;  
    }  
  
    printf("USER     PID   PPID  VSIZE RSS   %sWCHAN    PC         NAME\n",   
           (display_flags&SHOW_PRIO)?"PRIO  NICE  RTPRI SCHED ":"");  
    while((de = readdir(d)) != 0){  
        if(isdigit(de->d_name[0])){  
            int pid = atoi(de->d_name);  
            if(!pidfilter || (pidfilter == pid)) {  
                ps_line(pid, 0, namefilter);  
                if(threads) ps_threads(pid, namefilter);  
            }  
        }  
    }  
    closedir(d);  
    return 0;  
}  

int ps_main(int argc, char **argv)
{
DIR *d;
struct dirent *de;
char *namefilter = 0;
int pidfilter = 0;
int threads = 0;

d = opendir("/proc");
if(d == 0) return -1;

while(argc > 1){
if(!strcmp(argv[1],"-t")) {
threads = 1;
} else if(!strcmp(argv[1],"-x")) {
display_flags |= SHOW_TIME;
} else if(!strcmp(argv[1],"-p")) {
display_flags |= SHOW_PRIO;
}  else if(isdigit(argv[1][0])){
pidfilter = atoi(argv[1]);
} else {
namefilter = argv[1];
}
argc--;
argv++;
}

printf("USER     PID   PPID  VSIZE RSS   %sWCHAN    PC         NAME\n",
(display_flags&SHOW_PRIO)?"PRIO  NICE  RTPRI SCHED ":"");
while((de = readdir(d)) != 0){
if(isdigit(de->d_name[0])){
int pid = atoi(de->d_name);
if(!pidfilter || (pidfilter == pid)) {
ps_line(pid, 0, namefilter);
if(threads) ps_threads(pid, namefilter);
}
}
}
closedir(d);
return 0;
}


我们可以得到每一行数据是如何获得的:

[cpp]
view plaincopyprint?

static int ps_line(int pid, int tid, char *namefilter)  
{  
    char statline[1024];  
    char cmdline[1024];  
    char user[32];  
    struct stat stats;  
    int fd, r;  
    char *ptr, *name, *state;  
    int ppid, tty;  
    unsigned wchan, rss, vss, eip;  
    unsigned utime, stime;  
    int prio, nice, rtprio, sched;  
    struct passwd *pw;  
      
    sprintf(statline, "/proc/%d", pid);  
    stat(statline, &stats);  
  
    if(tid) {  
        sprintf(statline, "/proc/%d/task/%d/stat", pid, tid);  
        cmdline[0] = 0;  
    } else {  
        sprintf(statline, "/proc/%d/stat", pid);  
        sprintf(cmdline, "/proc/%d/cmdline", pid);      
        fd = open(cmdline, O_RDONLY);  
        if(fd == 0) {  
            r = 0;  
        } else {  
            r = read(fd, cmdline, 1023);  
            close(fd);  
            if(r < 0) r = 0;  
        }  
        cmdline[r] = 0;  
    }  
      
    fd = open(statline, O_RDONLY);  
    if(fd == 0) return -1;  
    r = read(fd, statline, 1023);  
    close(fd);  
    if(r < 0) return -1;  
    statline[r] = 0;  
  
    ptr = statline;  
    nexttok(&ptr); // skip pid
  
    ptr++;          // skip "("
  
  
    name = ptr;  
    ptr = strrchr(ptr, ')'); // Skip to *last* occurence of ')',
  
    *ptr++ = '\0';           // and null-terminate name.
  
  
    ptr++;          // skip " "
  
    state = nexttok(&ptr);  
    ppid = atoi(nexttok(&ptr));  
    nexttok(&ptr); // pgrp
  
    nexttok(&ptr); // sid
  
    tty = atoi(nexttok(&ptr));  
      
    nexttok(&ptr); // tpgid
  
    nexttok(&ptr); // flags
  
    nexttok(&ptr); // minflt
  
    nexttok(&ptr); // cminflt
  
    nexttok(&ptr); // majflt
  
    nexttok(&ptr); // cmajflt
  
#if 1
  
    utime = atoi(nexttok(&ptr));  
    stime = atoi(nexttok(&ptr));  
#else
  
    nexttok(&ptr); // utime
  
    nexttok(&ptr); // stime
  
#endif
  
    nexttok(&ptr); // cutime
  
    nexttok(&ptr); // cstime
  
    prio = atoi(nexttok(&ptr));  
    nice = atoi(nexttok(&ptr));  
    nexttok(&ptr); // threads
  
    nexttok(&ptr); // itrealvalue
  
    nexttok(&ptr); // starttime
  
    vss = strtoul(nexttok(&ptr), 0, 10); // vsize
  
    rss = strtoul(nexttok(&ptr), 0, 10); // rss
  
    nexttok(&ptr); // rlim
  
    nexttok(&ptr); // startcode
  
    nexttok(&ptr); // endcode
  
    nexttok(&ptr); // startstack
  
    nexttok(&ptr); // kstkesp
  
    eip = strtoul(nexttok(&ptr), 0, 10); // kstkeip
  
    nexttok(&ptr); // signal
  
    nexttok(&ptr); // blocked
  
    nexttok(&ptr); // sigignore
  
    nexttok(&ptr); // sigcatch
  
    wchan = strtoul(nexttok(&ptr), 0, 10); // wchan
  
    nexttok(&ptr); // nswap
  
    nexttok(&ptr); // cnswap
  
    nexttok(&ptr); // exit signal
  
    nexttok(&ptr); // processor
  
    rtprio = atoi(nexttok(&ptr)); // rt_priority
  
    sched = atoi(nexttok(&ptr)); // scheduling policy
  
      
    tty = atoi(nexttok(&ptr));  
      
    if(tid != 0) {  
        ppid = pid;  
        pid = tid;  
    }  
  
    pw = getpwuid(stats.st_uid);  
    if(pw == 0) {  
        sprintf(user,"%d",(int)stats.st_uid);  
    } else {  
        strcpy(user,pw->pw_name);  
    }  
      
    if(!namefilter || !strncmp(name, namefilter, strlen(namefilter))) {  
        printf("%-8s %-5d %-5d %-5d %-5d", user, pid, ppid, vss / 1024, rss * 4);  
        if(display_flags&SHOW_PRIO)  
            printf(" %-5d %-5d %-5d %-5d", prio, nice, rtprio, sched);  
        printf(" %08x %08x %s %s", wchan, eip, state, cmdline[0] ? cmdline : name);  
        if(display_flags&SHOW_TIME)  
            printf(" (u:%d, s:%d)", utime, stime);  
        printf("\n");  
    }  
    return 0;  
}  

static int ps_line(int pid, int tid, char *namefilter)
{
char statline[1024];
char cmdline[1024];
char user[32];
struct stat stats;
int fd, r;
char *ptr, *name, *state;
int ppid, tty;
unsigned wchan, rss, vss, eip;
unsigned utime, stime;
int prio, nice, rtprio, sched;
struct passwd *pw;

sprintf(statline, "/proc/%d", pid);
stat(statline, &stats);

if(tid) {
sprintf(statline, "/proc/%d/task/%d/stat", pid, tid);
cmdline[0] = 0;
} else {
sprintf(statline, "/proc/%d/stat", pid);
sprintf(cmdline, "/proc/%d/cmdline", pid);
fd = open(cmdline, O_RDONLY);
if(fd == 0) {
r = 0;
} else {
r = read(fd, cmdline, 1023);
close(fd);
if(r < 0) r = 0;
}
cmdline[r] = 0;
}

fd = open(statline, O_RDONLY);
if(fd == 0) return -1;
r = read(fd, statline, 1023);
close(fd);
if(r < 0) return -1;
statline[r] = 0;

ptr = statline;
nexttok(&ptr); // skip pid
ptr++;          // skip "("

name = ptr;
ptr = strrchr(ptr, ')'); // Skip to *last* occurence of ')',
*ptr++ = '\0';           // and null-terminate name.

ptr++;          // skip " "
state = nexttok(&ptr);
ppid = atoi(nexttok(&ptr));
nexttok(&ptr); // pgrp
nexttok(&ptr); // sid
tty = atoi(nexttok(&ptr));

nexttok(&ptr); // tpgid
nexttok(&ptr); // flags
nexttok(&ptr); // minflt
nexttok(&ptr); // cminflt
nexttok(&ptr); // majflt
nexttok(&ptr); // cmajflt
#if 1
utime = atoi(nexttok(&ptr));
stime = atoi(nexttok(&ptr));
#else
nexttok(&ptr); // utime
nexttok(&ptr); // stime
#endif
nexttok(&ptr); // cutime
nexttok(&ptr); // cstime
prio = atoi(nexttok(&ptr));
nice = atoi(nexttok(&ptr));
nexttok(&ptr); // threads
nexttok(&ptr); // itrealvalue
nexttok(&ptr); // starttime
vss = strtoul(nexttok(&ptr), 0, 10); // vsize
rss = strtoul(nexttok(&ptr), 0, 10); // rss
nexttok(&ptr); // rlim
nexttok(&ptr); // startcode
nexttok(&ptr); // endcode
nexttok(&ptr); // startstack
nexttok(&ptr); // kstkesp
eip = strtoul(nexttok(&ptr), 0, 10); // kstkeip
nexttok(&ptr); // signal
nexttok(&ptr); // blocked
nexttok(&ptr); // sigignore
nexttok(&ptr); // sigcatch
wchan = strtoul(nexttok(&ptr), 0, 10); // wchan
nexttok(&ptr); // nswap
nexttok(&ptr); // cnswap
nexttok(&ptr); // exit signal
nexttok(&ptr); // processor
rtprio = atoi(nexttok(&ptr)); // rt_priority
sched = atoi(nexttok(&ptr)); // scheduling policy

tty = atoi(nexttok(&ptr));

if(tid != 0) {
ppid = pid;
pid = tid;
}

pw = getpwuid(stats.st_uid);
if(pw == 0) {
sprintf(user,"%d",(int)stats.st_uid);
} else {
strcpy(user,pw->pw_name);
}

if(!namefilter || !strncmp(name, namefilter, strlen(namefilter))) {
printf("%-8s %-5d %-5d %-5d %-5d", user, pid, ppid, vss / 1024, rss * 4);
if(display_flags&SHOW_PRIO)
printf(" %-5d %-5d %-5d %-5d", prio, nice, rtprio, sched);
printf(" %08x %08x %s %s", wchan, eip, state, cmdline[0] ? cmdline : name);
if(display_flags&SHOW_TIME)
printf(" (u:%d, s:%d)", utime, stime);
printf("\n");
}
return 0;
}


 

方法2: 进入/proc文件夹

在/proc文件夹下有很多对应进程ID号的子文件夹:

[plain]
view plaincopyprint?

drwxr-xr-x  23 root       root             4096 2012-10-01 02:09 ../  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 1/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 10/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1001/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1076/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 11/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 12/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 13/  
dr-xr-xr-x   7 gdm        gdm                 0 2013-01-25 21:11 1345/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1353/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1375/  
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 14/  

drwxr-xr-x  23 root       root             4096 2012-10-01 02:09 ../
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 1/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 10/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1001/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1076/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 11/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 12/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 13/
dr-xr-xr-x   7 gdm        gdm                 0 2013-01-25 21:11 1345/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1353/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:11 1375/
dr-xr-xr-x   7 root       root                0 2013-01-25 21:10 14/


 

我们可以进入对应的文件夹内,可以看到有以下信息,就可以查询到你的进程信息了。

(作者:LL  
出处:http://blog.csdn.net/tcpipstack , 欢迎转载,也请保留这段声明。谢谢!)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: