On Wed, Jan 11, 2012 at 06:37:31PM +0100, Richard Braun wrote: > When built with an old thread implementation (or for a sparc target), > the implementation of the system() function doesn't conform to its > specification. Namely, it resets the SIGCHLD handler to its default > instead of blocking the signal, which may result in "lost" signals > if a custom handler was installed. Replace this by appropriate calls > to sigprocmask().
sigprocmask alone is not sufficient to implement the required behavior for system. In particular, in a multi-threaded program, another thread will receive the signal and reap the child, causing system to malfunction. Really there's no safe way to use system in a multi-threaded program (or whatsoever, IMO), but to conform to POSIX it must block SIGCHLD: The system() function shall ignore the SIGINT and SIGQUIT signals, and shall block the SIGCHLD signal, while waiting for the command to terminate. If this might cause the application to miss a signal that would have killed it, then the application should examine the return value from system() and take whatever action is appropriate to the application if the command terminated due to receipt of a signal. Source: http://pubs.opengroup.org/onlinepubs/9699919799/functions/system.html Rich _______________________________________________ uClibc mailing list uClibc@uclibc.org http://lists.busybox.net/mailman/listinfo/uclibc