> it could take an infinite amount of time between when the user sent SIGINT to when the program stopped by the very nature of what that utility does
A well coordinated signal-handling-thread and a workload-thread won't manifest this issue - poorly managed threads however, will.
>By using longjmp(), a SIGINT becomes a true interrupt, which is what users want.
Hard disagree.
What you've done is turned signals into interrupts, which is .. hokey. And not how signals are intended to be used. Its quite possible to get the behaviour you expect - fast interruption and death of work-code - but you'd have to sort your issues with threads out, first.
EDIT: its decades-old proven technology: use a semaphore or a mutex to keep your threads in lockstep, and avoid this longjmp() malarkey... signals aren't hard, but maybe they're only just a little less harder than threads ..