Прерывание функции с последующим продолжением её выполнения - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Имеется некая функция, которая представляет из себя бесконечный цикл(например печатает "1", затем "2", затем "3"). Необходимо при нажатии определенной комбинации клавиш приостановить её выполнение, вызвать другую функцию и при её завершении продолжить цикл. Пытался использовать функцию SIGNAL(SIGINT,&SecontFunc). При вызове сигнала(CTRL-C) необходимая функция вызывалась, однако после её выполнения программа завершала свою работу. Буду рад, если подскажите какие-либо идеи. Заранее спасибо.

Решение задачи: «Прерывание функции с последующим продолжением её выполнения»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5.  
  6. void int_handler(int n) {
  7.     char buf[32];
  8.     printf("\nRealy stop? ");
  9.     scanf("%31s", buf);
  10.     if ( *buf == 'y' || *buf == 'Y' )
  11.         exit(0);
  12.     else
  13.         raise(SIGCONT);
  14. }
  15.  
  16. int main(void) {
  17.     int b = 99;
  18.    
  19.     if ( signal(SIGINT, int_handler) == SIG_ERR ) {
  20.         fprintf(stderr, "Can't set up interrupt handler!\n");
  21.         exit(1);
  22.     }
  23.    
  24.     while ( 1 ) {
  25.         if ( b ) {
  26.             printf("%d bottles of beer on the wall, %d bottles of beer...\n", b, b);
  27.             b -= 1;
  28.             printf("Take one down and pass it around, %d bottles of beer on the wall.\n\n", b);
  29.         }
  30.         else {
  31.             printf("No more bottles of beer on the wall, no more bottles of beer...\n");
  32.             b = 99;
  33.             printf("Go to the store and buy some more, %d bottles of beer on the wall.\n\n", b);
  34.         }
  35.         usleep(500000);
  36.        
  37.     }
  38.    
  39.     exit(0);
  40. }

Объяснение кода листинга программы

  1. Объявление функции int_handler, которая будет обрабатывать прерывание
  2. В функции int_handler происходит вывод сообщения и запрос на ввод, используя функцию scanf
  3. Если пользователь вводит 'y' или 'Y', то функция exit прекращает выполнение программы
  4. Если пользователь вводит что-то другое, то функция raise возобновляет выполнение программы
  5. В функции main происходит установка обработчика прерывания с помощью функции signal
  6. Если установка обработчика прерывания не удалась, то программа выводит сообщение об ошибке и завершает своё выполнение с кодом 1
  7. В цикле while происходит вывод количества бутылок пива и уменьшение его на 1
  8. Когда количество бутылок становится равным нулю, программа выводит соответствующее сообщение и устанавливает новое начальное значение для количества бутылок
  9. Между выводами сообщений происходит задержка с помощью функции usleep
  10. Программа завершает своё выполнение с кодом 0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы