On Sat, May 18, 2002 at 08:40:38PM +0200, Jakub Filonik wrote:
> Hi,
> I was playing with ps on FreeBSD with kern.ps_showallprocs=0 and I was
> surprised when I have seen that I may see info about running process, if I
> know it's ID
> 
> I think it may be seen as bug. What do You think?
> 

This is a known problem, see Problem Report kern/30608 at
http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/30608
This issue is fixed in Current, but not in FreeBSD 4.5-STABLE, etc.

By the way, I was thinking of the best way to view all the "hidden" processes at
the same time. Something similar to ''for i in $(jot 99999); do ps -u$i....''
is extremely slow and sometimes hangs my system.

Included is therefore a patch for ps.c in /usr/src/bin/ps to view all the
"hidden" processes (just a braindead hack, really..). Any normal user can
compile his own hacked 'ps'.

You could always traverse /proc instead, but cmdline and status give too little
info.

-- 
Torbjorn Kristoffersen <[EMAIL PROTECTED]>

"Real programmers don't comment their code.  It was hard to write, it
should be hard to understand."

--- /usr/src/bin/ps/ps.c        Fri Feb  1 15:09:30 2002
+++ ps.c        Mon May 20 04:04:47 2002
@@ -72,7 +72,8 @@
 #include "ps.h"
 
 #define SEP ", \t"             /* username separators */
-
+#define PID_MAX 99999
+ 
 KINFO *kinfo;
 struct varent *vhead, *vtail;
 
@@ -287,6 +288,11 @@
                }
        }
 #endif
+       all = 1;
+       parsefmt(ufmt);
+       termwidth = UNLIMITED;
+       fmt = 1;
+       xflg = 1;
        /*
         * Discard setgid privileges if not the running kernel so that bad
         * guys can't print interesting stuff from kernel memory.
@@ -329,13 +335,14 @@
                what = KERN_PROC_PID;
                flag = pid;
        } else {
-               what = KERN_PROC_ALL;
+               what = KERN_PROC_PID;
                flag = 0;
        }
        /*
         * select procs
         */
-       if ((kp = kvm_getprocs(kd, what, flag, &nentries)) == 0)
+       for(pid = 1; pid <= PID_MAX; pid++) {
+       if ((kp = kvm_getprocs(kd, what, pid, &nentries)) == 0)
                errx(1, "%s", kvm_geterr(kd));
        if ((kinfo = malloc(nentries * sizeof(*kinfo))) == NULL)
                err(1, NULL);
@@ -349,16 +356,6 @@
        sizevars();
 
        /*
-        * print header
-        */
-       printheader();
-       if (nentries == 0)
-               exit(1);
-       /*
-        * sort proc list
-        */
-       qsort(kinfo, nentries, sizeof(KINFO), pscomp);
-       /*
         * for each proc, call each variable output function.
         */
        for (i = lineno = 0; i < nentries; i++) {
@@ -385,8 +382,11 @@
                        lineno = 0;
                }
        }
-       free(uids);
 
+
+ }
+       free(uids);
+       free(kinfo);
        exit(eval);
 }
 

Reply via email to