Well you could hangle Unix signals synchronously by using a thread which waits for signals with sigwait(). Usually you block certain signals in main thread, then one (signal catching) thread calls sigwait() waiting for a signal. When the signal arrives, signal catching thread stops/restarts other threads, depending on what the signal was meant to do.
I could also play with a volatile sig_atomic_t, set it to 1 in handler and clear it in the dd(1) write loop.
I am not sure that turning dd(1) in a MT binary is the right approach :)
-- Jean-Yves Migeon jeanyves.migeon%free.fr@localhost