• Roland McGrath's avatar
    [PATCH] waitid system call · ca3f74aa
    Roland McGrath authored
    This patch adds a new system call `waitid'.  This is a new POSIX call that
    subsumes the rest of the wait* family and can do some things the older
    calls cannot.  A minor addition is the ability to select what kinds of
    status to check for with a mask of independent bits, so you can wait for
    just stops and not terminations, for example.  A more significant
    improvement is the WNOWAIT flag, which allows for polling child status
    without reaping.  This interface fills in a siginfo_t with the same details
    that a SIGCHLD for the status change has; some of that info (e.g.  si_uid)
    is not available via wait4 or other calls.
    
    I've added a new system call that has the parameter conventions of the
    POSIX function because that seems like the cleanest thing.  This patch
    includes the actual system call table additions for i386 and x86-64; other
    architectures will need to assign the system call number, and 64-bit ones
    may need to implement 32-bit compat support for it as I did for x86-64. 
    The new features could instead be provided by some new kludge inventions in
    the wait4 system call interface (that's what BSD did).  If kludges are
    preferable to adding a system call, I can work up something different.
    
    I added a struct rusage field si_rusage to siginfo_t in the SIGCHLD case
    (this does not affect the size or layout of the struct).  This is not part
    of the POSIX interface, but it makes it so that `waitid' subsumes all the
    functionality of `wait4'.  Future kernel ABIs (new arch's or whatnot) can
    have only the `waitid' system call and the rest of the wait* family
    including wait3 and wait4 can be implemented in user space using waitid.
    There is nothing in user space as yet that would make use of the new field.
    
    Most of the new functionality is implemented purely in the waitid system
    call itself.  POSIX also provides for the WCONTINUED flag to report when a
    child process had been stopped by job control and then resumed with
    SIGCONT.  Corresponding to this, a SIGCHLD is now generated when a child
    resumes (unless SA_NOCLDSTOP is set), with the value CLD_CONTINUED in
    siginfo_t.si_code.  To implement this, some additional bookkeeping is
    required in the signal code handling job control stops.
    
    The motivation for this work is to make it possible to implement the POSIX
    semantics of the `waitid' function in glibc completely and correctly.  If
    changing either the system call interface used to accomplish that, or any
    details of the kernel implementation work, would improve the chances of
    getting this incorporated, I am more than happy to work through any issues.
    Signed-off-by: default avatarRoland McGrath <roland@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    ca3f74aa
siginfo.h 8.13 KB