PATCH for a more-POSIX `ps', and related adventures
Garance A Drosihn
drosih at rpi.edu
Sat Mar 20 14:21:32 PST 2004
Apologies in advance for the length of this. I seem to be in
"stream-of-consciousness" mode this week...
- - - - -
>That does not get us matching POSIX/SUSv3, but it does get us a
>lot closer. There are a few questions/issues that came up for me
>while writing this, but I'll list those in separate messages. I'll
>also do a minimal update to the man page before commiting this.
Wrt "standards issues", the following things came up. I made
arbitrary decisions on these things, and wanted to know what
other people felt.
With the new '-g pgidlist' option: This is a standard option in
posix, and I never remembered using a -g option, and our man page
for `ps' does not mention one. Much to my surprise, there already
was a -g option in the option-processing code of `ps':
case 'g':
break; /* no-op */
A quick check of FreeBSD, NetBSD, and OpenBSD shows that everyone has
had this no-op option, going back to 1993/1994. More amusing, SUSv3
writes: "The -A option is equivalent to the BSD -g and the SVID -e.
Because the two systems differed, a mnemonic compromise
was selected."
So, what BSD had a `-g' option which behaved like `-A'?
In any case, I figured that if the option has been a no-op, and
undocumented for 10+ years, that it would be safe to just steal it.
I am going to assume this is okay, unless there is some strong
objection to it.
- - - - -
The SUSv3 standard describes an option `-U userlist':
Write information for processes whose real user ID numbers
or login names are given in userlist
We already have a `-u`, and I even use it, so I wasn't going to
steal that! However, I did want to have this ability, so I added
it as -R. I will assume this seems reasonable.
- - - - -
SUSv3 does not describe the option `-s sidlist', but many of the
other ps's that I work with have it, and I like having that ability.
I can imagine people screaming "creeping featurism!", but hey, I
was on a roll and it seemed like a pretty safe thing (standards-
wise) to add. I *like* creeping features, as long as they don't
bloat the code too much...
- - - - -
Indirectly related to that, I noticed that there was a flag named
KERN_PROC_SESSION defined for the kvm_getprocs() routine. But when
I tried to use that flag, I get an error:
ps: kvm_getprocs: No such file or directory
I do not have the time to look into this, so I guess I should write
up a PR for it. (or is it not-supposed to work?). It was easy to
avoid that by having the main() routine always do the selection
for '-s' processing.
- - - - -
One of the things I puzzled over for awhile was how `-x' processing
should interact with all the "selector options". I decided that
by default, all the options (except -p) should act like -x was
NOT specified. By that I mean they will NOT match processes
which have no controlling terminal. (it is a little confusing to
discuss this, due to all the double-and-triple negatives...).
That way, if the user does want to see those extra processes,
they can specify -x to see them, no matter what selectors were
specified. If I did it the other way, then the user would need
yet another (new) option to indicate that they did NOT want to
see those processes.
I also reasoned that 'ps' (with no options) should behave the
same as 'ps -U myuserid'. Prior to my updates, 'ps -U userid'
DID show the extra processes, but a plain 'ps' did not. So,
what I have implemented is a slight change in behavior. The
code in question had said:
case 'U':
uids = getuids(optarg, &nuids);
xflg++; /* XXX: intuitive? */
break;
And I decided to answer that as "No". This is a minor change
in behavior, but I'm hoping that in practice nobody will have
any problems due to this. If they do, "just add -x"...
- - - - -
Obviously the code for `-p pidlist' should show every process
it is told to, without caring if it has a controlling terminal.
The code used to do this by:
case 'p':
pid = atol(optarg);
xflg = 1;
break;
But that sets the "global xflg processing switch" for *all*
selector options given on the command, and I didn't think that
was right. So I removed the xflg setting from there, but
changed the way the selection was done such that the pidlist
is matched before checking xflag.
- - - - -
For `-U', there is a minor change in error-processing behavior
which should probably be done to match the standards, and to
match how other operating systems handle the same errors. But
I did not make that change, because it was possible someone
cares about the behavior. And that is:
If you specify multiple userids, and if any of those userids
are *invalid* (which is to say, there *is* no such username or
userid), then we presently print out a warning message and
ignore that one parameter. We do not abort the command. So
if you do: ps -U root,gad,mail,baduser
you get a full 'ps' output with the warning message way at the
top of it. When I tried this on other operating systems, they
all aborted the command with an error, and did not list any
processes.
That is what I would *like* to do with our `ps', but I could
imagine someone who was used to that behavior and depended on
it for some silly scripts or command-aliases that they have
written. So, I left it as a warning -- but only for the `-U'
option. For all other options, any value which would never
be valid is treated as a fatal error.
Would it be alright if I changed that to a fatal error, and
thus removed the ten lines of comments where I'm wringing my
hands in angst over making that change?
- - - - -
My original intent was to MFC all of this to 4.x-stable before
4.10-release, but if I do that I will skip anything which is a
"new behavior". I think that means it would be easier to skip
MFC-ing it at all (or at least wait until after 4.10-release).
--
Garance Alistair Drosehn = gad at gilead.netel.rpi.edu
Senior Systems Programmer or gad at freebsd.org
Rensselaer Polytechnic Institute or drosih at rpi.edu
More information about the freebsd-standards
mailing list