There is a race with dd setting up the signal handler for SIGUSR1, and some async process sending it. If dd loses the race it's killed. This was pointed out to me by Federico (CC'd). The race was addressed, but only narrowed with: http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=e4caea5
I was wondering about making things more general by allowing the parent process to set SIGUSR1 to SIGIGN, and dd would still setup the signal handler in this case. This isn't too much of a stretch I think as it would only possibly result in unwanted output to stderr (and dd is already quite noisy to stderr by default), rather than unwanted process termination. Though doing the above would still need existing apps to change (to ignore SIGUSR1), so instead it might be better to just support a simpler mechanism through something like a "status=progress" option, which would avoid the general issues and awkwardness of signals as mentioned here: http://lists.gnu.org/archive/html/bug-coreutils/2004-04/threads.html#00127 I'm leaning towards the latter option here. thanks, Pádraig.
