Прерывание функции с последующим продолжением её выполнения - C (СИ)
Формулировка задачи:
Доброго времени суток!
Имеется некая функция, которая представляет из себя бесконечный цикл(например печатает "1", затем "2", затем "3"). Необходимо при нажатии определенной комбинации клавиш приостановить её выполнение, вызвать другую функцию и при её завершении продолжить цикл.
Пытался использовать функцию SIGNAL(SIGINT,&SecontFunc). При вызове сигнала(CTRL-C) необходимая функция вызывалась, однако после её выполнения программа завершала свою работу.
Буду рад, если подскажите какие-либо идеи. Заранее спасибо.
Решение задачи: «Прерывание функции с последующим продолжением её выполнения»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <unistd.h>
- void int_handler(int n) {
- char buf[32];
- printf("\nRealy stop? ");
- scanf("%31s", buf);
- if ( *buf == 'y' || *buf == 'Y' )
- exit(0);
- else
- raise(SIGCONT);
- }
- int main(void) {
- int b = 99;
- if ( signal(SIGINT, int_handler) == SIG_ERR ) {
- fprintf(stderr, "Can't set up interrupt handler!\n");
- exit(1);
- }
- while ( 1 ) {
- if ( b ) {
- printf("%d bottles of beer on the wall, %d bottles of beer...\n", b, b);
- b -= 1;
- printf("Take one down and pass it around, %d bottles of beer on the wall.\n\n", b);
- }
- else {
- printf("No more bottles of beer on the wall, no more bottles of beer...\n");
- b = 99;
- printf("Go to the store and buy some more, %d bottles of beer on the wall.\n\n", b);
- }
- usleep(500000);
- }
- exit(0);
- }
Объяснение кода листинга программы
- Объявление функции int_handler, которая будет обрабатывать прерывание
- В функции int_handler происходит вывод сообщения и запрос на ввод, используя функцию scanf
- Если пользователь вводит 'y' или 'Y', то функция exit прекращает выполнение программы
- Если пользователь вводит что-то другое, то функция raise возобновляет выполнение программы
- В функции main происходит установка обработчика прерывания с помощью функции signal
- Если установка обработчика прерывания не удалась, то программа выводит сообщение об ошибке и завершает своё выполнение с кодом 1
- В цикле while происходит вывод количества бутылок пива и уменьшение его на 1
- Когда количество бутылок становится равным нулю, программа выводит соответствующее сообщение и устанавливает новое начальное значение для количества бутылок
- Между выводами сообщений происходит задержка с помощью функции usleep
- Программа завершает своё выполнение с кодом 0
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д