Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Istoria_vozniknovenia_i_razvitia_OS.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
208.65 Кб
Скачать

23. Алармымежпроцессного взаимодействия.

Программа “Будильник”.

Программа “Будильник”. Существуют задачи, в которых необходимо прервать выполнение процесса по истечении некоторого количества времени. Средствами ОС “заводится” будильник, который будет поторапливать ввести некоторое имя. Системный вызов alarm(): #include  unsignedintalarm(unsignedintseconds); инициализирует отложенное появление сигнала ^ SIGALRM - процесс запрашивает ядро отправить ему самому сигнал по прошествии определенного времени. #include  #include  #include  voidalrm(ints) /*обработчик сигнала^ SIG_ALRM */ { printf(“\n жду имя \n”); alarm(5); /* заводим будильник */ signal(SIGALRM, alrm); /* переустанавливаем реакцию на сигнал */ } intmain(intargc, char **argv) {  chars[80];  signal(SIGALRM, alrm);  /* установка обработчика alrm на приход сигнала SIG_ALRM */ alarm(5); /* заводим будильник */ printf(“Введите имя \n”); for (;;) { printf(“имя:”);  if (gets(s) != NULL) break; /* ожидаем ввода имени */ }; printf(“OK! \n”); return 0; } В начале программы мы устанавливаем реакцию на сигнал ^ SIGALRM - функцию alarm(), далее мы заводим будильник, запрашиваем “Введите имя” и ожидаем ввода строки символов. Если ввод строки задерживается, то будет вызвана функция alarm(), которая напомнит, что программа “ждет имя”, опять заведет будильник и поставит себя на обработку сигнала SIGALRM еще раз. И так будет до тех пор, пока не будет введена строка. Здесь имеется один нюанс: если в момент выполнения системного вызова возникает событие, связанное с сигналом, то система прерывает выполнение системного вызова и возвращает код ответа, равный «-1». 

Двухпроцессный вариант программы “Будильник”.

#include  #include  #include  #include  void alr(int s) {  printf(“\n Быстрее!!! \n”); signal(SIGALRM, alr);  /* переустановка обработчика alr на приход сигнала^ SIGALRM */ } int main(intargc, char **argv) {  char s[80];  intpid; signal(SIGALRM, alr);  /* установкаобработчикаalrнаприходсигнала SIGALRM */ if (pid = fork()) { for (;;)  { sleep(5); /*приостанавливаемпроцессна 5 секунд */ kill(pid, SIGALRM);  /*отправляемсигнал SIGALRM процессу- сыну */ } } else { printf(“Введитеимя \n”); for (;;)  { printf(“имя:”); if (gets(s) != NULL) break; /*ожидаемвводаимени*/ } printf(“OK!\n”); kill(getppid(), SIGKILL);  /* убиваемзациклившегосяотца */ } return 0; } Вданномслучаепрограммареализуетсявдвухпроцессах.Как и в предыдущем примере, имеется функция реакции на сигнал alr(), которая выводит на экран сообщение и переустанавливает функцию реакции на сигнал, опять же на себя. В основной программе мы также указываем alr() как реакцию на SIGALRM. После этого мы запускаем сыновний процесс, и отцовский процесс (бесконечный цикл) “засыпает” на 5 единиц времени, после чего сыновнему процессу будет отправлен сигнал SIGALRM. Все, что ниже цикла, будет выполняться в процессе-сыне: мы ожидаем ввода строки, если ввод осуществлен, то происходит уничтожение отца (SIGKILL).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]