ps.c revision 5dc119a67b87bd809564f0b18750c5d784c55201
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h> 20badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <dirent.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 48ac94d3a545c65499b6492ec2c76d4757535fcfeElliott Hughes#include <inttypes.h> 50badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <pwd.h> 60badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <stdio.h> 70badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <stdlib.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/stat.h> 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 110badbd6565fea17be39d82eba858fa76d28920a4Elliott Hughes#include <unistd.h> 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 13392744175c4de67dc98e72da6745e6351118c985San Mehat#include <cutils/sched_policy.h> 14392744175c4de67dc98e72da6745e6351118c985San Mehat 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttoksep(char **strp, char *sep) 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *p = strsep(strp,sep); 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (p == 0) ? "" : p; 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char *nexttok(char **strp) 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return nexttoksep(strp, " "); 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_PRIO 1 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SHOW_TIME 2 27392744175c4de67dc98e72da6745e6351118c985San Mehat#define SHOW_POLICY 4 288b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt#define SHOW_CPU 8 298290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley#define SHOW_MACLABEL 16 30377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen#define SHOW_NUMERIC_UID 32 317c01585339ef8ccbfb33e9886689e4018ae58978Kenny Root#define SHOW_ABI 64 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 3308b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman#if __LP64__ 3408b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman#define PC_WIDTH 10 /* Realistically, the top bits will be 0, so don't waste space. */ 3508b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman#else 3608b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman#define PC_WIDTH (2*sizeof(uintptr_t)) 3708b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman#endif 3808b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int display_flags = 0; 40b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughesstatic int ppid_filter = 0; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 428f197e65790265b362fc01c5f730365dc7dc1809Kenny Rootstatic void print_exe_abi(int pid); 438f197e65790265b362fc01c5f730365dc7dc1809Kenny Root 445dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughesstatic int ps_line(int pid, int tid) 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char statline[1024]; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char cmdline[1024]; 488290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley char macline[1024]; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char user[32]; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct stat stats; 515dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes int r; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *ptr, *name, *state; 53aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn int ppid; 5408b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman unsigned rss, vss; 5508b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman uintptr_t eip; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned utime, stime; 578b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt int prio, nice, rtprio, sched, psr; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct passwd *pw; 59377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d", pid); 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stat(statline, &stats); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid) { 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d/task/%d/stat", pid, tid); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmdline[0] = 0; 668290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley snprintf(macline, sizeof(macline), "/proc/%d/task/%d/attr/current", pid, tid); 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(statline, "/proc/%d/stat", pid); 698290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley sprintf(cmdline, "/proc/%d/cmdline", pid); 708290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley snprintf(macline, sizeof(macline), "/proc/%d/attr/current", pid); 715dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes int fd = open(cmdline, O_RDONLY); 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == 0) { 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = 0; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = read(fd, cmdline, 1023); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) r = 0; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmdline[r] = 0; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 81377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 825dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes int fd = open(statline, O_RDONLY); 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(fd == 0) return -1; 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = read(fd, statline, 1023); 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(r < 0) return -1; 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project statline[r] = 0; 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr = statline; 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // skip pid 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr++; // skip "(" 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project name = ptr; 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr = strrchr(ptr, ')'); // Skip to *last* occurence of ')', 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *ptr++ = '\0'; // and null-terminate name. 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ptr++; // skip " " 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = nexttok(&ptr); 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppid = atoi(nexttok(&ptr)); 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // pgrp 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sid 102aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn nexttok(&ptr); // tty 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // tpgid 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // flags 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // minflt 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cminflt 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // majflt 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cmajflt 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 1 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project utime = atoi(nexttok(&ptr)); 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project stime = atoi(nexttok(&ptr)); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // utime 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // stime 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cutime 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cstime 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prio = atoi(nexttok(&ptr)); 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nice = atoi(nexttok(&ptr)); 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // threads 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // itrealvalue 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // starttime 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project vss = strtoul(nexttok(&ptr), 0, 10); // vsize 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rss = strtoul(nexttok(&ptr), 0, 10); // rss 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // rlim 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // startcode 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // endcode 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // startstack 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // kstkesp 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project eip = strtoul(nexttok(&ptr), 0, 10); // kstkeip 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // signal 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // blocked 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sigignore 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // sigcatch 13508b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman nexttok(&ptr); // wchan 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // nswap 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // cnswap 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project nexttok(&ptr); // exit signal 1398b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt psr = atoi(nexttok(&ptr)); // processor 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rtprio = atoi(nexttok(&ptr)); // rt_priority 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sched = atoi(nexttok(&ptr)); // scheduling policy 142377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 143aa907768af7ba9e29901d356cdcac6a436970323Mark Salyzyn nexttok(&ptr); // tty 144377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid != 0) { 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppid = pid; 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = tid; 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pw = getpwuid(stats.st_uid); 151377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen if(pw == 0 || (display_flags & SHOW_NUMERIC_UID)) { 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(user,"%d",(int)stats.st_uid); 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strcpy(user,pw->pw_name); 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 156377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 157b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes if(ppid_filter != 0 && ppid != ppid_filter) { 158b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes return 0; 159b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes } 160b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes 1615dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (display_flags & SHOW_MACLABEL) { 1625dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes fd = open(macline, O_RDONLY); 1635dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes strcpy(macline, "-"); 1645dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (fd >= 0) { 1655dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes r = read(fd, macline, sizeof(macline)-1); 1665dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes close(fd); 1675dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (r > 0) 1685dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes macline[r] = 0; 1698f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 1705dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf("%-30s %-9s %-5d %-5d %s\n", macline, user, pid, ppid, cmdline[0] ? cmdline : name); 1715dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes return 0; 1725dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes } 173392744175c4de67dc98e72da6745e6351118c985San Mehat 1745dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf("%-9s %-5d %-5d %-6d %-5d", user, pid, ppid, vss / 1024, rss * 4); 1755dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (display_flags & SHOW_CPU) 1765dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf(" %-2d", psr); 1775dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (display_flags & SHOW_PRIO) 1785dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf(" %-5d %-5d %-5d %-5d", prio, nice, rtprio, sched); 1795dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (display_flags & SHOW_POLICY) { 1805dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes SchedPolicy p; 1815dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (get_sched_policy(pid, &p) < 0) 1825dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf(" un "); 1835dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes else 1845dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf(" %.2s ", get_sched_policy_name(p)); 1855dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes } 1865dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes char path[PATH_MAX]; 1875dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes snprintf(path, sizeof(path), "/proc/%d/wchan", pid); 1885dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes char wchan[10]; 1895dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes fd = open(path, O_RDONLY); 1905dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes ssize_t wchan_len = read(fd, wchan, sizeof(wchan)); 1915dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (wchan_len == -1) { 1925dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes wchan[wchan_len = 0] = '\0'; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1945dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes close(fd); 1955dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf(" %10.*s %0*" PRIxPTR " %s ", (int) wchan_len, wchan, (int) PC_WIDTH, eip, state); 1965dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (display_flags & SHOW_ABI) { 1975dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes print_exe_abi(pid); 1985dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes } 1995dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf("%s", cmdline[0] ? cmdline : name); 2005dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if(display_flags&SHOW_TIME) 2015dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf(" (u:%d, s:%d)", utime, stime); 2025dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes 2035dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes printf("\n"); 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 2078f197e65790265b362fc01c5f730365dc7dc1809Kenny Rootstatic void print_exe_abi(int pid) 2088f197e65790265b362fc01c5f730365dc7dc1809Kenny Root{ 2098f197e65790265b362fc01c5f730365dc7dc1809Kenny Root int fd, r; 2108f197e65790265b362fc01c5f730365dc7dc1809Kenny Root char exeline[1024]; 2118f197e65790265b362fc01c5f730365dc7dc1809Kenny Root 2128f197e65790265b362fc01c5f730365dc7dc1809Kenny Root sprintf(exeline, "/proc/%d/exe", pid); 2138f197e65790265b362fc01c5f730365dc7dc1809Kenny Root fd = open(exeline, O_RDONLY); 2148f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if(fd == 0) { 2158f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" "); 2168f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2178f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2188f197e65790265b362fc01c5f730365dc7dc1809Kenny Root r = read(fd, exeline, 5 /* 4 byte ELFMAG + 1 byte EI_CLASS */); 2198f197e65790265b362fc01c5f730365dc7dc1809Kenny Root close(fd); 2208f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if(r < 0) { 2218f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf(" "); 2228f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2238f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2248f197e65790265b362fc01c5f730365dc7dc1809Kenny Root if (memcmp("\177ELF", exeline, 4) != 0) { 2258f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("?? "); 2268f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2278f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2288f197e65790265b362fc01c5f730365dc7dc1809Kenny Root switch (exeline[4]) { 2298f197e65790265b362fc01c5f730365dc7dc1809Kenny Root case 1: 2308f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("32 "); 2318f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2328f197e65790265b362fc01c5f730365dc7dc1809Kenny Root case 2: 2338f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("64 "); 2348f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2358f197e65790265b362fc01c5f730365dc7dc1809Kenny Root default: 2368f197e65790265b362fc01c5f730365dc7dc1809Kenny Root printf("?? "); 2378f197e65790265b362fc01c5f730365dc7dc1809Kenny Root return; 2388f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } 2398f197e65790265b362fc01c5f730365dc7dc1809Kenny Root} 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 2415dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughesvoid ps_threads(int pid) 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char tmp[128]; 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(tmp,"/proc/%d/task",pid); 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir(tmp); 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) return; 250377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(d)) != 0){ 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(isdigit(de->d_name[0])){ 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tid = atoi(de->d_name); 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tid == pid) continue; 2555dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes ps_line(pid, tid); 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 258377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen closedir(d); 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ps_main(int argc, char **argv) 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project DIR *d; 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct dirent *de; 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pidfilter = 0; 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int threads = 0; 267377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = opendir("/proc"); 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(d == 0) return -1; 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 1){ 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[1],"-t")) { 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project threads = 1; 274377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen } else if(!strcmp(argv[1],"-n")) { 275377cb2ab3aff08119c5934ff0e582cb604884f8eMarco Nelissen display_flags |= SHOW_NUMERIC_UID; 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[1],"-x")) { 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project display_flags |= SHOW_TIME; 2788290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } else if(!strcmp(argv[1], "-Z")) { 2798290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley display_flags |= SHOW_MACLABEL; 280392744175c4de67dc98e72da6745e6351118c985San Mehat } else if(!strcmp(argv[1],"-P")) { 281392744175c4de67dc98e72da6745e6351118c985San Mehat display_flags |= SHOW_POLICY; 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[1],"-p")) { 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project display_flags |= SHOW_PRIO; 2848b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt } else if(!strcmp(argv[1],"-c")) { 2858b37c91b934bf22d8ae52bebad7f1f22f16d1132Dmitry Shmidt display_flags |= SHOW_CPU; 2868f197e65790265b362fc01c5f730365dc7dc1809Kenny Root } else if(!strcmp(argv[1],"--abi")) { 2878f197e65790265b362fc01c5f730365dc7dc1809Kenny Root display_flags |= SHOW_ABI; 288b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes } else if(!strcmp(argv[1],"--ppid")) { 289b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes ppid_filter = atoi(argv[2]); 2905dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (ppid_filter == 0) { 2915dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes fprintf(stderr, "bad ppid '%s'\n", argv[2]); 2925dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes return 1; 2935dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes } 294b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes argc--; 295b5fc3132eee1c3a783c566440d9132f792d10ec4Elliott Hughes argv++; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 2975dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes pidfilter = atoi(argv[1]); 2985dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if (pidfilter == 0) { 2995dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes fprintf(stderr, "bad pid '%s'\n", argv[1]); 3005dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes return 1; 3015dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes } 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 3078290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley if (display_flags & SHOW_MACLABEL) { 30808b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman printf("LABEL USER PID PPID NAME\n"); 3098290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } else { 31008b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman printf("USER PID PPID VSIZE RSS %s%s %sWCHAN %*s %sNAME\n", 3118290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley (display_flags&SHOW_CPU)?"CPU ":"", 3128290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley (display_flags&SHOW_PRIO)?"PRIO NICE RTPRI SCHED ":"", 3138f197e65790265b362fc01c5f730365dc7dc1809Kenny Root (display_flags&SHOW_POLICY)?"PCY " : "", 31408b3466bc27d00af535711674f3273b04c7e15a5Chris Dearman (int) PC_WIDTH, "PC", 3158f197e65790265b362fc01c5f730365dc7dc1809Kenny Root (display_flags&SHOW_ABI)?"ABI " : ""); 3168290d1083ec7eee3f32265012f5d6be2774c4afcStephen Smalley } 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while((de = readdir(d)) != 0){ 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(isdigit(de->d_name[0])){ 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int pid = atoi(de->d_name); 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!pidfilter || (pidfilter == pid)) { 3215dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes ps_line(pid, 0); 3225dc119a67b87bd809564f0b18750c5d784c55201Elliott Hughes if(threads) ps_threads(pid); 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project closedir(d); 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 330