Не использовать sigset()
. Хотя это и есть в POSIX 2008, оно помечено как устаревшее и небезопасное в многопоточных программах.
Затем у вас есть выбор между signal()
, который благословлен ISO C, но имеет некоторые нежелательные характеристики, и sigaction()
, который является предпочтительным решением в системах POSIX.
Одним из ключевых моментов при обработке сигналов является обеспечение того, что вы не перехватываете любые сигналы, которые игнорируются при входе в программу - если вы не знаете что-то, что вызывающий не может (например, вам нужно перехватывать сигналы SIGCHLD для мертвых детей) .
Это приводит к стандартным формулировкам, проповедуемым с незапамятных времен, для signal()
:
if (signal(SIGINT, SIG_IGN) != SIG_IGN)
signal(SIGINT, ignore);
Или, для sigaction()
:
struct sigaction new_sa;
struct sigaction old_sa;
sigfillset(&new_sa.sa_mask);
new_sa.sa_handler = SIG_IGN;
new_sa.sa_flags = 0;
if (sigaction(SIGINT, &new_sa, &old_sa) == 0 && old_sa.sa_handler != SIG_IGN)
{
new_sa.sa_handler = ignore;
sigaction(SIGINT, &new_sa, 0);
}
Поскольку вы не показываете нам функцию getUserInput()
, мы не можем предсказать, почему вы видите «Ошибка синтаксиса». Однако, если у вас есть грамматика в работе, вполне возможно, что ваше чтение не возвращает действительные данные, и анализатор недоволен тем, что осталось в буфере для его обработки.