Хорошо, так что я разобрался с проблемой.
Когда я нажимал ^ C, он перехватывал прерывание в основном процессе, но убивал дочерний процесс. Когда я запустил system("ps")
изнутри программы, он показал, что дочерний процесс a.out больше не работает.
Чтобы исправить это, я добавил следующее к процессу ребенка:
struct sigaction act;
act.sa_handler = CHILD_PRESERVER;
sigemptyset ( &act.sa_mask);
sigaction (SIGINT, &act, 0);
Где CHILD PRESERVER
была фиктивной функцией, которая ничего не делала, кроме как поддерживала ее.
Не видно, что это решение очень элегантно, поэтому, если у кого-то есть более правильный способ сделать это, пожалуйста, опубликуйте его.