The latest diff (www.freebsd.org/~cracauer/) passes all tests for SIGINT. SIGQUIT is a different matter, though. OUTDATED INFORMATION FOLLOWS, don't use %% Neue bde-version: test09 (shell-wait is not interruptable by SIGINT) %% CRA = my diffs. BDE = Bruce diffs. BDE version 19980212: Test 2: It should send SIGQUIT to cat, it doesn't. Test 9: can't break wait() %% older notes: test2: trap '' 2 while : ; do cat ; echo -n $? ; done test6: trap '' 3 while : ; do cat ; echo -n $? ; done The trapped signal should be ignored. If SIGINT is ignored (test 2), SIGQUIT exits `cat`, but not the shell (means the loop will continue and `cat` will be called again). If SIGQUIT is ignored, SIGINT both exit the whole script. I'm not sure this asymmetric behaviour is intended, but currently CRA and BDE versions has is. I think SIGTERM should exit the script in all cases immedeatly. CRA version does this, BDE version ignores SIGTERM. bash1 falls over completely on these tests. bash2 works like CRA version. Other tests: ------------ BDE version fails on 5, the shell terminated while the forground child is running (like the unpatched FreeBSD sh did). BDE version handles SIGQUIT seperately from SIGINT in test 1, and 3, but not in test 4 and 5. bash2 fails on 5, it gets a SIGQUIT that was sent to a SIGQUIT-catching process after that process exits. Reliably, it doesn't matter how much time was passed between SIGQUIT to process and exit or process. As Bruce noted, bash version 1 fails on test 2 like my version of sh does. bash1 doesn't have the bash2 problem on test 5 (getting signals that were caught by the child after the child exits). zsh fails on test 1 and 5 in a similar way bash2 failed on 5: After a child exits that received SIGINT, it terminates immedeatly. I wonder how bash 2 manages to fail on test 5, but to pass test 1... csh fails on test 1 in two ways: - when the SIGINT/SIGQUIT-catching child receives both SIGQUIT and SIGINT, csh exits immedeatly, while the child is still running. - when only one or more SIGQUIT are delivered to the child, csh gets it after the child exits and terminates with coredump. csh also ignores SIGQUIT where SIGINT is caught. test2.csh is different from test1.sh in that all signals should be caught. csh fails in that it sometimes gets SIGQUIT and exits with coredump (the shell, not the child). Other stuff not directly relevant to these fixes: ================================================= csh oddness: ------------ When the "catcher" program resets the terminal, there's a time-window where C-g is mapped to SIGQUIT, but "catcher" already exited. In other word, if you type C-g while in "catcher", then immedeatly C-d, csh will get SIGQUIT. I thought that remapping the terminal keys should have been done before the shell is re-entered. The same happens to tcsh. With sh variants I didn't manage to deliver SIGQUIT by C-g.