解析ANDROID ps命令执行后各项参数的含义 .
2014-05-08 10:57
453 查看
如何查看ANDROID进程信息呢?
可以打开Adb shell,然后我们就有2种方法:
[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
那么我们禁不住要问:
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,进程的名称
[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;
}
我们可以得到每一行数据是如何获得的:
[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;
}
[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/
我们可以进入对应的文件夹内,可以看到有以下信息,就可以查询到你的进程信息了。
(作者:LL
出处:http://blog.csdn.net/tcpipstack , 欢迎转载,也请保留这段声明。谢谢!)
可以打开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 , 欢迎转载,也请保留这段声明。谢谢!)
相关文章推荐
- 解析ANDROID ps命令执行后各项参数的含义
- 解析ANDROID ps命令执行后各项参数的含义
- 解析ANDROID ps命令执行后各项参数的含义
- 解析ANDROID ps命令执行后各项参数的含义
- Android ps命令执行后的各项参数含义
- linux下的ps命令执行后各项参数的含义
- Android ps命令执行后的各项参数含义
- 一键帮你复制多个文件到多个机器——PowerShell小脚本(内附PS远程执行命令问题解析)
- Android中执行java命令的方法及java代码执行并解析shell命令
- android oreo 中adb shell中的ps命令需要加参数ps -A
- android执行shell命令,top 命令解析
- Appium Android Bootstrap源码分析之命令解析执行
- UiAutomator系列——Appium Android Bootstrap源码分析之命令解析执行(008)
- SQL优化【基础01】-生成执行计划及计划中参数列的含义
- Linux操作系统PS命令详细解析
- Android Java代码执行adb Shell命令
- Android 数据查询query函数参数解析
- android 执行ffmpeg命令
- Linux中Top命令结果的各项含义
- 解析C#中用Process类杀死进程,执行命令的深入分析