Call rl_clear_signals().
This will disable the signal handlers libreadline installed. The one that handles SIGINT is responsible for the observed behaviour of restoring the prompt.
More details on how to manage readline()s signal handling can be read here.