]> granicus.if.org Git - psmisc/commitdiff
pstree displays PGIDs
authorCraig Small <csmall@users.sourceforge.net>
Sat, 19 May 2012 23:59:01 +0000 (09:59 +1000)
committerCraig Small <csmall@users.sourceforge.net>
Sat, 19 May 2012 23:59:01 +0000 (09:59 +1000)
Patch based upon a patch submitted by Alan Grow.
The -g flag shows program group IDs, much like the PIDs display.

Bug-Sourceforge:
http://sourceforge.net/tracker/?func=detail&aid=3471056&group_id=15273&atid=315273

ChangeLog
doc/pstree.1
src/pstree.c

index 1ac7decbe25d4de6f770c75e98069be376f0a136..d4542820f583b3053ac08fe445643b13c17194bb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,6 +13,7 @@ Changes in 22.17 (unreleased)
        * No TEXTRELS in src/lists built as PIE on x86
        * Fake pstree root for kernels with hidepid turned on
        * More fixes for Cygwin SF Patch #3511920
+       * pstree can show PGIDs SF Patch #3471056
 
 Changes in 22.16
 ================
index b30717a818c710b632be61caa7d3847c0800ee6f..9cfbb97b51a6497203dea29df001c3da7977cd04 100644 (file)
@@ -1,4 +1,4 @@
-.TH PSTREE 1 2011-02-22 "Linux" "User Commands"
+.TH PSTREE 1 2012-05-20 "Linux" "User Commands"
 .SH NAME
 pstree \- display a tree of processes
 .SH SYNOPSIS
@@ -7,6 +7,7 @@ pstree \- display a tree of processes
 .RB [ \-a | \-\-arguments ]
 .RB [ \-c | \-\-compact ]
 .RB [ \-h | \-\-highlight\-all | \-H \fIpid\fB | \-\-highlight\-pid\ \fIpid\fB ]
+.RB [ \-g ] \-\-show\-pgids ]
 .RB [ \-l | \-\-long ]
 .RB [ \-n | \-\-numeric\-sort ]
 .RB [ \-p | \-\-show\-pids ]
@@ -75,6 +76,10 @@ nor any of its ancestors are in the subtree being shown.
 Like \fB\-h\fP, but highlight the specified process instead. Unlike with
 \fB\-h\fP, \fBpstree\fP fails when using \fB\-H\fP if highlighting is not
 available.
+.IP \fB\-g\fP
+Show PGIDs. Process Group IDs are shown as decimal numbers in parentheses
+after each process name. \fB\-p\fP implicitly disables compaction. If both
+PIDs and PGIDs are displayed then PIDs are shown first.
 .IP \fB\-l\fP
 Display long lines. By default, lines are truncated to the display width or
 132 if output is sent to a non-tty or if the display width is unknown.
index 6d821a4eaefda8b03dcd486ede452731e7e11b94..dd7045b5f18b09743b00bb213ad5b2a972384615 100644 (file)
@@ -2,7 +2,7 @@
  * pstree.c - display process tree
  *
  * Copyright (C) 1993-2002 Werner Almesberger
- * Copyright (C) 2002-2009 Craig Small
+ * Copyright (C) 2002-2012 Craig Small
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -73,6 +73,7 @@ typedef struct _proc {
     char **argv;                /* only used : argv[0] is 1st arg; undef if argc < 1 */
     int argc;                        /* with -a   : number of arguments, -1 if swapped    */
     pid_t pid;
+    pid_t pgid;
     uid_t uid;
 #ifdef WITH_SELINUX
     security_context_t scontext;
@@ -122,7 +123,7 @@ static int capacity = 0;
 static int *width = NULL;
 static int *more = NULL;
 
-static int print_args = 0, compact = 1, user_change = 0, pids = 0,
+static int print_args = 0, compact = 1, user_change = 0, pids = 0, pgids = 0,
     show_parents = 0, by_pid = 0, trunc = 1, wait_end = 0;
 #ifdef WITH_SELINUX
 static int show_scontext = 0;
@@ -336,11 +337,11 @@ static void set_args(PROC * this, const char *args, int size)
 
 #ifdef WITH_SELINUX
 static void
-add_proc(const char *comm, pid_t pid, pid_t ppid, uid_t uid,
+add_proc(const char *comm, pid_t pid, pid_t ppid, pid_t pgid, uid_t uid,
          const char *args, int size, char isthread, security_context_t scontext)
 #else                                /*WITH_SELINUX */
 static void
-add_proc(const char *comm, pid_t pid, pid_t ppid, uid_t uid,
+add_proc(const char *comm, pid_t pid, pid_t ppid, pid_t pgid, uid_t uid,
          const char *args, int size, char isthread)
 #endif                                /*WITH_SELINUX */
 {
@@ -361,6 +362,7 @@ add_proc(const char *comm, pid_t pid, pid_t ppid, uid_t uid,
         set_args(this, args, size);
     if (pid == ppid)
         ppid = 0;
+    this->pgid = pgid;
     if (isthread)
       this->flags |= PFLAG_THREAD;
     if (!(parent = find_proc(ppid))) {
@@ -466,6 +468,10 @@ dump_tree(PROC * current, int level, int rep, int leaf, int last,
         out_char(info++ ? ',' : '(');
         (void) out_int(current->pid);
     }
+    if (pgids) {
+        out_char(info++ ? ',' : '(');
+        (void) out_int(current->pgid);
+    }
     if (user_change && prev_uid != current->uid) {
         out_char(info++ ? ',' : '(');
         if ((pw = getpwuid(current->uid)))
@@ -629,7 +635,7 @@ static void read_proc(void)
   size_t buffer_size;
   char readbuf[BUFSIZ + 1];
   char *tmpptr;
-  pid_t pid, ppid;
+  pid_t pid, ppid, pgid;
   int fd, size;
   int empty;
 #ifdef WITH_SELINUX
@@ -684,7 +690,7 @@ static void read_proc(void)
             /* We now have readbuf with pid and cmd, and tmpptr+2
              * with the rest */
             /*printf("tmpptr: %s\n", tmpptr+2); */
-            if (sscanf(tmpptr + 2, "%*c %d", &ppid) == 1) {
+            if (sscanf(tmpptr + 2, "%*c %d %d", &ppid, &pgid) == 2) {
               DIR *taskdir;
               struct dirent *dt;
               char *taskpath;
@@ -706,17 +712,17 @@ static void read_proc(void)
                     if (thread != pid) {
 #ifdef WITH_SELINUX
                       if (print_args)
-                        add_proc(threadname, thread, pid, st.st_uid, 
+                        add_proc(threadname, thread, pid, pgid, st.st_uid, 
                             threadname, strlen (threadname) + 1, 1,scontext);
                       else
-                        add_proc(threadname, thread, pid, st.st_uid, 
+                        add_proc(threadname, thread, pid, pgid, st.st_uid, 
                             NULL, 0, 1, scontext);
 #else                /*WITH_SELINUX */
                       if (print_args)
-                        add_proc(threadname, thread, pid, st.st_uid,
+                        add_proc(threadname, thread, pid, pgid, st.st_uid,
                             threadname, strlen (threadname) + 1, 1);
                       else
-                        add_proc(threadname, thread, pid, st.st_uid,
+                        add_proc(threadname, thread, pid, pgid, st.st_uid,
                             NULL, 0, 1);
 #endif                /*WITH_SELINUX */
                       }
@@ -728,9 +734,9 @@ static void read_proc(void)
               free(taskpath);
               if (!print_args)
 #ifdef WITH_SELINUX
-                add_proc(comm, pid, ppid, st.st_uid, NULL, 0, 0, scontext);
+                add_proc(comm, pid, ppid, pgid, st.st_uid, NULL, 0, 0, scontext);
 #else                /*WITH_SELINUX */
-                add_proc(comm, pid, ppid, st.st_uid, NULL, 0, 0);
+                add_proc(comm, pid, ppid, pgid, st.st_uid, NULL, 0, 0);
 #endif                /*WITH_SELINUX */
               else {
                 sprintf(path, "%s/%d/cmdline", PROC_BASE, pid);
@@ -749,10 +755,10 @@ static void read_proc(void)
                 if (size)
                   buffer[size++] = 0;
 #ifdef WITH_SELINUX
-                add_proc(comm, pid, ppid, st.st_uid,
+                add_proc(comm, pid, ppid, pgid, st.st_uid,
                      buffer, size, 0, scontext);
 #else                /*WITH_SELINUX */
-                add_proc(comm, pid, ppid, st.st_uid,
+                add_proc(comm, pid, ppid, pgid, st.st_uid,
                      buffer, size, 0);
 #endif                /*WITH_SELINUX */
               }
@@ -805,7 +811,7 @@ static void usage(void)
 {
     fprintf(stderr,
             _
-            ("Usage: pstree [ -a ] [ -c ] [ -h | -H PID ] [ -l ] [ -n ] [ -p ] [ -u ]\n"
+            ("Usage: pstree [ -a ] [ -c ] [ -h | -H PID ] [ -l ] [ -n ] [ -p ] [ -g ] [ -u ]\n"
              "              [ -A | -G | -U ] [ PID | USER ]\n"
              "       pstree -V\n" "Display a tree of processes.\n\n"
              "  -a, --arguments     show command line arguments\n"
@@ -814,6 +820,7 @@ static void usage(void)
              "  -h, --highlight-all highlight current process and its ancestors\n"
              "  -H PID,\n"
              "  --highlight-pid=PID highlight this process and its ancestors\n"
+             "  -g, --show-pgids    show process group ids; implies -c\n"
              "  -G, --vt100         use VT100 line drawing characters\n"
              "  -l, --long          don't truncate long lines\n"
              "  -n, --numeric-sort  sort output by PID\n"
@@ -865,6 +872,7 @@ int main(int argc, char **argv)
         {"long", 0, NULL, 'l'},
         {"numeric-sort", 0, NULL, 'n'},
         {"show-pids", 0, NULL, 'p'},
+        {"show-pgids", 0, NULL, 'g'},
         {"show-parents", 0, NULL, 's'},
         {"uid-changes", 0, NULL, 'u'},
         {"unicode", 0, NULL, 'U'},
@@ -918,11 +926,11 @@ int main(int argc, char **argv)
 
 #ifdef WITH_SELINUX
     while ((c =
-            getopt_long(argc, argv, "aAcGhH:nplsuUVZ", options,
+            getopt_long(argc, argv, "aAcGhH:npglsuUVZ", options,
                         NULL)) != -1)
 #else                                /*WITH_SELINUX */
     while ((c =
-            getopt_long(argc, argv, "aAcGhH:nplsuUV", options, NULL)) != -1)
+            getopt_long(argc, argv, "aAcGhH:npglsuUV", options, NULL)) != -1)
 #endif                                /*WITH_SELINUX */
         switch (c) {
         case 'a':
@@ -968,6 +976,10 @@ int main(int argc, char **argv)
             pids = 1;
             compact = 0;
             break;
+        case 'g':
+            pgids = 1;
+            compact = 0;
+            break;
         case 's':
             show_parents = 1;
             break;