• R
    optimize posix_spawn to avoid spurious sigaction syscalls · 3c5c5e6f
    Rich Felker 提交于
    the trick here is that sigaction can track for us which signals have
    ever had a signal handler set for them, and only those signals need to
    be considered for reset. this tracking mask may have false positives,
    since it is impossible to remove bits from it without race conditions.
    false negatives are not possible since the mask is updated with atomic
    operations prior to making the sigaction syscall.
    
    implementation-internal signals are set to SIG_IGN rather than SIG_DFL
    so that a signal raised in the parent (e.g. calling pthread_cancel on
    the thread executing pthread_spawn) does not have any chance make it
    to the child, where it would cause spurious termination by signal.
    
    this change reduces the minimum/typical number of syscalls in the
    child from around 70 to 4 (including execve). this should greatly
    improve the performance of posix_spawn and other interfaces which use
    it (popen and system).
    
    to facilitate these changes, sigismember is also changed to return 0
    rather than -1 for invalid signals, and to return the actual status of
    implementation-internal signals. POSIX allows but does not require an
    error on invalid signal numbers, and in fact returning an error tends
    to confuse applications which wrongly assume the return value of
    sigismember is boolean.
    3c5c5e6f
sigaction.c 1.5 KB