How to get filename of an open file descriptor

Skip Ford skip at menantico.com
Sun Nov 18 12:45:37 PST 2007


Thomas Hurst wrote:
> * Skip Ford (skip at menantico.com) wrote:
> 
> > It would be interesting to know for sure, though, if Solaris uses
> > hardlinks and, if so, what their utility is called.
> 
> Nope.  They *do* use hardlinks in that they have 32bit wrappers in
> /usr/bin etc which dispatch to the relevent architecture, but the
> commands themselves are all seperate.

Indeed, and each utility is quite complex as compared to what ours
would be if split.

I would just rename procstat(1) to pargs(1) then hardlink the
others since ours are much less complex, but I'll take anything at
this point.

As for the procstat(1) code itself, I've found one bug and have two
sugestions:

1)  procstat_args() doesn't use a local variable and the buffer doesn't
get cleared between calls:

$ procstat -a 797
  PID ARGS
  797 audacious
$ procstat -a 795 797
  PID ARGS
  795 xterm -xtsessionID 11c0a80103000118536826300000007680000
  797 audacious essionID 11c0a80103000118536826300000007680000
$

Other option's functions are not similarly affected.

2)  I think it should handle requests for information about pid 0
instead of requiring at least pid 1 as it currently does.  Solaris
suggests '/proc/*' to see all processes.  If we use `ps axopid=` then
it aborts on the swapper (pid 0) immediately.

3)  Similarly, I think all of the sysctl(3) calls within the individual
option functions (procstat_bin(), procstat_args(), etc.) should just go
ahead and print the header and pid, then print any sysctl(3) error
in the PID's row instead of erroring out.  We're either about to finish
executing anyway if that was the only pid requested, or we're moving on
to another pid that has nothing to do with the previous pid.  There's not
really any reason to stop processing further pids.  This also affects
attempting to list all pids since it currently stops processing pids as
soon as one doesn't exist.  A global error variable could just be
incremented with every call and returned at process exit, that way it'd
still be meaningful for single PIDs.

Since this is a per-process tool, I think it needs to complete
"procstat -c `ps axopid=`" if at all possible.

-- 
Skip


More information about the freebsd-hackers mailing list