NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: standards/51024 (NetBSD misses the mandatory waitid() syscall)



David Holland <dholland-bugs%netbsd.org@localhost> wrote:

> The following reply was made to PR standards/51024; it has been noted by GNATS.
>
> From: David Holland <dholland-bugs%netbsd.org@localhost>
> To: gnats-bugs%NetBSD.org@localhost
> Cc: 
> Subject: Re: standards/51024 (NetBSD misses the mandatory waitid() syscall)
> Date: Wed, 20 Apr 2016 08:50:11 +0000
>
>  On Mon, Apr 04, 2016 at 04:10:01PM +0000, Joerg Schilling wrote:
>   >    The value of status may be 0, EXIT_SUCCESS, EXIT_FAILURE, or any other 
>   >    value, though only the least significant 8 bits (that is, status & 0377)
>   >    shall be available from wait() and waitpid(); the full value shall
>   >    be available from waitid() and in the siginfo_t passed to a
>   >    signal handler for SIGCHLD.
>  
>  Am I supposed to interpret this to *prohibit* wait() from returning
>  more than 8 bits of status?

Do you confuse "status" with the exit status of the child?

wait() and waitpid() are deprecated historic interfaces that return a pointer 
to 16 bits of "stat-loc" data. The interface they implement was never designed 
to return more than 8 bits of the exit status from the child.

The POSIX standard indeed disallows WEXITSTATUS(statloc) to return more than 8 
bits from the child's exit code and even when you try to make use of the fact 
that stat-loc was and is an "int", you would not be able to include more than 
24 bits from the child's exit code in that int.

NOTE: while the definition of the behavior for WEXITSTATUS() could have been 
different, there are some people who are in fear that the shell could 
unexpectedly report a value != 0 in $? by default when the child calls 
exit(256). 

BTW: here is the history of the interfaces:

In 1980, a group of former AT&T employees created "Charles River Data Systems" 
that offered "UNOS", the first UNIX clone. This OS did come with an interface 
called "cwait":

	int cwait(pidp,statp)
	  int *pidp;            /* where to fill in pid */
	  int *statp;           /* where to fill in status */

	Returns  the  following  values, depending on  why  cwait()  came
	back:

	     < 0 error (no children)
	      0  normal termination, exit code of child
	      1  ^C
	      2  killed
	      3  trap, particular trap in status
	      4  suspended, can be resumed or killed
	      5  exec failure, standard system error code in status
	      6  syserr, error detected in kernel, standard error code


This interface already returned the full 32 bits from the child's exit code.

Later in 1989, AT&T added waitid() to UNIX for SVr4 and offered a very similar 
interface to "cwait". It just moved the exit reason, the pid and the child exit 
status into a structgure.

Jörg

-- 
 EMail:joerg%schily.net@localhost                    (home) Jörg Schilling D-13353 Berlin
       joerg.schilling%fokus.fraunhofer.de@localhost (work) Blog: http://schily.blogspot.com/
 URL:  http://cdrecord.org/private/ http://sourceforge.net/projects/schilytools/files/'



Home | Main Index | Thread Index | Old Index