• Ian Lance Taylor's avatar
    os: on GNU/Linux use waitid to avoid wait/kill race · cea29c4a
    Ian Lance Taylor authored
    On systems that support the POSIX.1-2008 waitid function, we can use it
    to block until a wait will succeed. This avoids a possible race
    condition: if a program calls p.Kill/p.Signal and p.Wait from two
    different goroutines, then it is possible for the wait to complete just
    before the signal is sent. In that case, it is possible that the system
    will start a new process using the same PID between the wait and the
    signal, causing the signal to be sent to the wrong process. The
    Process.isdone field attempts to avoid that race, but there is a small
    gap of time between when wait returns and isdone is set when the race
    can occur.
    
    This CL avoids that race by using waitid to wait until the process has
    exited without actually collecting the PID. Then it sets isdone, then
    waits for any active signals to complete, and only then collects the PID.
    
    No test because any plausible test would require starting enough
    processes to recycle all the process IDs.
    
    Update #13987.
    Update #16028.
    
    Change-Id: Id2939431991d3b355dfb22f08793585fc0568ce8
    Reviewed-on: https://go-review.googlesource.com/23967
    Run-TryBot: Ian Lance Taylor <iant@golang.org>
    Reviewed-by: default avatarAustin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    cea29c4a
wait_linux.go 874 Bytes