system(3) in SunOS 4.0 vs. 3.2

Guy Harris auspex!guy at uunet.uu.net
Thu May 11 18:07:00 AEST 1989


>I checked the man pages and note that wait(2) took an int (the pid) in 3.2
>but takes a (union wait *) in 4.0 and that system(3) calls wait(2).

I'm somewhat surprised about this; I thought the 3.2 man page was *more*
insistent than the 4.0 man page about using the stupid "union wait" (in
fact, I remember making the 4.0 man page less insistent...).

"union wait" was the idea of some well-intentioned chap at Berkeley.
(S)he wanted, apparently, to provide a nice way of dissecting an status
from "wait" - no, "wait(2)" never took an "int" as an argument; it has,
since time immemorial in UNIX, or at least since V6, taken an "int *",
which points to a variable into which the exit status from the program is
stuffed.  The *return value* of "wait" is the PID of the process that
exited.

Unfortunately, (s)he used bitfields, which depend on the C implementation;
some implementations go from most-significant-bit to least-significant-bit
in assigning bit fields, and others go the other way around.  However,
UNIX has always specified the bit fields of an exit status in an
implementation-*independent* fashion.  The "fix" was to put "#ifdef"s into
the bit-field definitions.

Furthermore, UNIX systems other than BSD use just an "int *" as the
argument to "wait"; if you use the "union wait" stuff, your code is not
portable to those systems.  However, since the "union wait" stuff
represents only a change in:

	1) the manual pages;

	2) the include files (<wait.h> was added);

	3) the "lint" library

and *not* a change in the BSD kernel - the kernel still thinks it works
the traditional way, with an "int *" - you can still use the "int *" and
have it work, the "union wait *" glop nonwithstanding.

The 4.0 man page describes this:

     The other members of the  wait()  union  merely  provide  an
     alternate  way of analyzing the status.  The value stored in
     the w_status field is compatible with the values  stored  by
     other  versions  of the UNIX system, and an argument of type
     int * may be provided instead of an argument of  type  union
     wait * for compatibility with those versions.

The underlying problem lies elsewhere:

>Is there a fix for this problem?  Should I not be expecting to be able to
>run 4.0 binaries on a 3.2 system?  The owner of the 3/50 (SunOS 3.2) is in
>no hurry to downgrade his machine to 4.0.
>
>[[ In general, I would not recommend trying to run 4.0 binaries under 3.2.
>--wnl ]]

William is right; no guarantees are offered that binaries built under 4.0
will run under *any* 3.x release (not even if linked statically - they
obviously won't work if linked dynamically).  In 4.0, "wait" and "wait3"
are wrappers around the new "wait4" system call; as such, code using
"wait" won't work under 3.x systems lacking "wait4".



More information about the Comp.sys.sun mailing list