On Sat 12 Aug 2023 at 11:58:36 +0000, Taylor R Campbell wrote: > So if a process already has a child, and calls system(3) as it is > currently implemented in libc in ~all versions of NetBSD, system(3) > will hang indefinitely until the existing child exits. I thought of a strategy that doesn't seem to be discussed in the PR yet; maybe it could work. https://pubs.opengroup.org/onlinepubs/007908799/xsh/system.html: The system() function ignores the SIGINT and SIGQUIT signals, and blocks the SIGCHLD signal, while waiting for the command to terminate. and we can see in lib/libc/stdlib/signal.c indeed sigemptyset(&nmask); sigaddset(&nmask, SIGCHLD); if (sigprocmask(SIG_BLOCK, &nmask, &omask) == -1) { So what if blocking a signal overrides the fact that it has been set to SIG_IGN (or the SA_NOCLDWAIT flag)? In a way it makes sense, because for a signal that is "blocked from delivery", it is moot what is done when it is delivered. I can think of two potential issues with such a solution: - If this is done consistently in all places where there is a check for SIGCHLD being SIG_IGN'd (if there are any), would this have unexpected other effects? - Does POSIX say something somewhere that blocks this way out? I didn't research those questions yet. -Olaf. -- ___ Olaf 'Rhialto' Seibert <rhialto/at/falu.nl> \X/ There is no AI. There is just someone else's work. --I. Rose
Attachment:
signature.asc
Description: PGP signature