Так вот мой код:
void sigHandle(int sig)
{
signal(SIGINT, sigHandle); //Is this line necessairy?
cout<<"Signal: "<<sig<<endl;
}
int main(){
signal(SIGINT, sigHandle);
while(true){ //Supposed to loop until user exits.
//rest of my code
}
}
Теперь я понимаю, что signal () означает, что при получении команды SIGINT (Ctrl + C справа?) Моя функция sigHandle должна вызываться с целочисленным значением 2 (номер SIGINT), метод должен запускаться и Программа должна НЕ выйти.
Все, что я хотел бы сделать, это просто напечатать номер сигнала и двигаться дальше, однако после распечатки «Сигнал: 2» он выходит.
(В конце концов я должен был обработать первые 32 прерывания, но я подумал, что Ctrl + C будет самым сложным, поэтому я начинаю здесь.)
В основном, если я делаю сигнал (SIGINT, SIG_IGN); он игнорирует сигнал правильно и не выходит, но теперь у меня нет возможности узнать, получил ли я прерывание SIGINT.
Раньше я играл со структурой sigaction, но я не мог найти по-настоящему полной документации по ней, поэтому решил заняться просто «необработанной» обработкой сигналов.
Это был мой код sigaction (та же проблема, что и выше):
struct sigaction action;
action.sa_handler = sigHandle;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGINT, &action, 0);
Спасибо за вашу помощь!
EDIT
OK SO. Через много-много часов просмотра справочных страниц и Интернета я наткнулся на (очень) гетто-решение, включающее сохранение прединконечного цикла в стеке, затем, когда приходит прерывание, делает то, что мне нужно, затем переустановка стека обратно туда, где он был, и вызов команды sigrelse () для переустановки любых состояний, которые могли быть изменены и не загружены повторно.
Я понимаю, что это не самое элегантное / эффективное / или даже социально приемлемое решение этой проблемы, но оно работает, и, насколько я могу судить, я никуда не теряю память, так что все хорошо ...
Я все еще ищу решение этой проблемы, и я считаю, что мой стек переустанавливает shenanigins как только временное исправление ...
Спасибо!