If I invoke gpg to unlock a private key, pinentry-curses pops up. If I hit ^C, gpg appears to exit, and my shell prompt comes up. However, some characters don't echo and some are replaced with asterisks. I can't even type reset into my terminal since some of the letters disappear. the only way to salvage the terminal is to open a new one, and kill pinentry-curses from there, and even then, the terminal is left in a weird state that makes it hard to reset, and I'm usually better off closing that terminal as well. If I don't go through this whole dance, any future gpg invocations just hang indefinitely when they get to the prompt for a passphrase.
Because of this behavior, I switched to pinentry-tty, and noticed slightly less annoying but similar behavior: control+C will send me back to the shell, but it still lurks in the background, grabbing keystrokes and making a mess. at least this one seems to give up after a few presses of the enter key.
Anyways, I suppose the solution would be to handle SIGINTs by invoking the pinentry program's normal exit routine (like the cancel button on the curses UI).