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)



The following reply was made to PR standards/51024; it has been noted by GNATS.

From: Joerg Schilling <Joerg.Schilling%fokus.fraunhofer.de@localhost>
To: <standards-manager%netbsd.org@localhost>, <netbsd-bugs%netbsd.org@localhost>,
        <gnats-bugs%netbsd.org@localhost>, <gnats-admin%netbsd.org@localhost>
Cc: 
Subject: Re: standards/51024 (NetBSD misses the mandatory waitid() syscall)
Date: Wed, 20 Apr 2016 11:45:15 +0200

 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