Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/libbb/find_pid_by_name.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/libbb/find_pid_by_name.c
r821 r1770 5 5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> 6 6 * 7 * Licensed under the GPL v2 , see the file LICENSE in this tarball.7 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. 8 8 */ 9 9 10 #include <stdio.h>11 #include <ctype.h>12 #include <string.h>13 #include <stdlib.h>14 10 #include "libbb.h" 11 12 /* 13 In Linux we have three ways to determine "process name": 14 1. /proc/PID/stat has "...(name)...", among other things. It's so-called "comm" field. 15 2. /proc/PID/cmdline's first NUL-terminated string. It's argv[0] from exec syscall. 16 3. /proc/PID/exe symlink. Points to the running executable file. 17 18 kernel threads: 19 comm: thread name 20 cmdline: empty 21 exe: <readlink fails> 22 23 executable 24 comm: first 15 chars of base name 25 (if executable is a symlink, then first 15 chars of symlink name are used) 26 cmdline: argv[0] from exec syscall 27 exe: points to executable (resolves symlink, unlike comm) 28 29 script (an executable with #!/path/to/interpreter): 30 comm: first 15 chars of script's base name (symlinks are not resolved) 31 cmdline: /path/to/interpreter (symlinks are not resolved) 32 (script name is in argv[1], args are pushed into argv[2] etc) 33 exe: points to interpreter's executable (symlinks are resolved) 34 35 If FEATURE_PREFER_APPLETS=y (and more so if FEATURE_SH_STANDALONE=y), 36 some commands started from busybox shell, xargs or find are started by 37 execXXX("/proc/self/exe", applet_name, params....) 38 and therefore comm field contains "exe". 39 */ 15 40 16 41 /* find_pid_by_name() … … 24 49 * It is the caller's duty to free the returned pidlist. 25 50 */ 26 long* find_pid_by_name( const char* pidName)51 pid_t* find_pid_by_name(const char* procName) 27 52 { 28 long* pidList;29 int i =0;30 procps_status_t * p;53 pid_t* pidList; 54 int i = 0; 55 procps_status_t* p = NULL; 31 56 32 pidList = xmalloc(sizeof(long)); 33 while ((p = procps_scan(0)) != 0) 34 { 35 if (strncmp(p->short_cmd, pidName, COMM_LEN-1) == 0) { 36 pidList=xrealloc( pidList, sizeof(long) * (i+2)); 37 pidList[i++]=p->pid; 57 pidList = xmalloc(sizeof(*pidList)); 58 while ((p = procps_scan(p, PSSCAN_PID|PSSCAN_COMM|PSSCAN_ARGV0))) { 59 if ( 60 /* we require comm to match and to not be truncated */ 61 /* in Linux, if comm is 15 chars, it may be a truncated 62 * name, so we don't allow that to match */ 63 (!p->comm[sizeof(p->comm)-2] && strcmp(p->comm, procName) == 0) 64 /* or we require argv0 to match (essential for matching reexeced /proc/self/exe)*/ 65 || (p->argv0 && strcmp(bb_basename(p->argv0), procName) == 0) 66 /* TOOD: we can also try exe, do we want that? */ 67 ) { 68 pidList = xrealloc(pidList, sizeof(*pidList) * (i+2)); 69 pidList[i++] = p->pid; 38 70 } 39 71 } 40 72 41 pidList[i] = i==0 ? -1 :0;73 pidList[i] = 0; 42 74 return pidList; 43 75 } 44 76 45 long *pidlist_reverse(long*pidList)77 pid_t *pidlist_reverse(pid_t *pidList) 46 78 { 47 int i=0; 48 while (pidList[i] > 0 && ++i); 49 if ( i-- > 0) { 50 long k; 79 int i = 0; 80 while (pidList[i]) 81 i++; 82 if (--i >= 0) { 83 pid_t k; 51 84 int j; 52 85 for (j = 0; i > j; i--, j++) {
Note:
See TracChangeset
for help on using the changeset viewer.