Сигнал SIGINT () / подпись в C ++ - PullRequest
       27

Сигнал SIGINT () / подпись в C ++

1 голос
/ 30 сентября 2011

Так вот мой код:

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 как только временное исправление ...

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Также обратите внимание, что вы не должны вызывать stdio (или другие не входящие функции) в обработчиках сигналов.(ваш обработчик сигнала может быть вызван в середине malloc или его эквивалента в C ++)

0 голосов
/ 30 сентября 2011

Это не так. Вы просто заменяете ручки SIGINT той же функцией. Как ваша программа выполняет ожидание?

Если у вас есть что-то вроде:

int main
{ 
 // ...

  int r = read(fd, &buff, read_size); // your program hangs here, waiting for the data.
                                      // but if signal occurred during this period of time
                                      // read will return immediately, and r may != read_size

  return 0;  // then it will go straight to return.
}
...