diff --git a/pkgs/racket-test-core/tests/racket/subprocess.rktl b/pkgs/racket-test-core/tests/racket/subprocess.rktl index 9e48507701..af7f6b68e1 100644 --- a/pkgs/racket-test-core/tests/racket/subprocess.rktl +++ b/pkgs/racket-test-core/tests/racket/subprocess.rktl @@ -543,6 +543,22 @@ (close-input-port (car p)) (close-input-port (cadddr p)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check the process state for subprocesses to ensure that, for example, +;; SIGCHLD is not blocked + +(unless (eq? (system-type) 'windows) + (let* ([dir (make-temporary-file "sub~a" 'directory)] + [exe (build-path dir "check")]) + (when (system* (or (find-executable-path "cc") + (find-executable-path "gcc")) + "-o" + exe + (path->complete-path "unix_check.c" (or (current-load-relative-directory) + (current-directory)))) + (test #t 'subprocess-state (system* exe))) + (delete-directory/files dir))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (for ([f (list tmpfile tmpfile2)] #:when (file-exists? f)) (delete-file f)) diff --git a/pkgs/racket-test-core/tests/racket/unix_check.c b/pkgs/racket-test-core/tests/racket/unix_check.c new file mode 100644 index 0000000000..8345b14e66 --- /dev/null +++ b/pkgs/racket-test-core/tests/racket/unix_check.c @@ -0,0 +1,17 @@ +#include +#include + +/* Make sure a child process is started with normal properties, such + as no blocked signals */ + +int main() +{ + sigset_t set, old_set; + sigemptyset(&set); + sigprocmask(SIG_BLOCK, &set, &old_set); + + return (sigismember(&old_set, SIGCHLD) + || sigismember(&old_set, SIGINT) + || sigismember(&old_set, SIGHUP) + || sigismember(&old_set, SIGQUIT)); +} diff --git a/racket/src/rktio/rktio_process.c b/racket/src/rktio/rktio_process.c index e3d5977925..0b922055d2 100644 --- a/racket/src/rktio/rktio_process.c +++ b/racket/src/rktio/rktio_process.c @@ -392,6 +392,10 @@ void centralized_block_child_signal() void centralized_unblock_child_signal() { + sigset_t set; + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigprocmask(SIG_UNBLOCK, &set, NULL); } void centralized_start_child_signal_handler()