Використання сигналів для синхронізації процесів, страница 2

    /* установка обработчика сигналов */

    signal(SIGUSR1,usrHandler);

    signal(SIGUSR2,usrHandler);

    *t3=*t4=0;

    /* цикл по массиву Грузовиков */

    for (nt=0; nt<NT; nt++) {

       #include "../incl_str.c"

       #include "../incl_cal.c"

       }

    #include "../incl_chk.c"

    /* пауза монитора, Грузовики в это время выполняются */

    sleep(20);

    printf("%s ВРЕМЯ ОЖИДАНИЯ ИСТЕКЛО\n",curtime());

    /* перебор всех запущенных Грузовиков */

    for (nt=0; nt<NT; nt++) {

      /* если состояние процесса "не запущен", он не проверяется */

      if (mtr[nt].status<0) continue;

      /* проверка завершения Грузовика с заданным ID, без ожидания завершения */

      pw=waitpid(mtr[nt].chpid,&stat,WNOHANG);

      if (mtr[nt].chpid==pw) {

        /* если Грузовик завершился - сообщение о его успешном завершении */

        printf("%s Грузовик %s нормально завершился\n",

         curtime(),mtr[nt].tr->name);

        cnt--;

        }

      else {

        /* если Грузовик не завершился, ему посылается сигнал USR1 */

        if (kill(mtr[nt].chpid,SIGUSR1)==0) {

          /* ожидание обработки ответного сигнала */

          while (!mtr[nt].status);

          kill(mtr[nt].chpid,SIGTERM);

            printf("%s Грузовику %s послан SIGTERM\n",curtime(),mtr[nt].tr->name);

          }

        else cnt--;

        }

      }

    while (cnt) {

      pw=wait(&stat);

      for (nt=0; nt<NT; nt++) if (pw==mtr[nt].chpid) break;

      if (stat)

        printf("%s Грузовик %s разбился\n",curtime(),mtr[nt].tr->name);

      else

        printf("%s Грузовик %s нормально завершился \n",

         curtime(),mtr[nt].tr->name);

      cnt--;

      }

  }



/**********************************************/

  /* Пример для работы N2                       */

  /**********************************************/

  /* Дочерний процесс,

                моделирующий поведение Грузовика*/

  /**********************************************/

  #include <stdio.h>

  #include <string.h>

  #include <unistd.h>

  #include <stdlib.h>

  #include <sys/types.h>

  #include <sys/time.h>

  #include <time.h>

  #include <sys/resource.h>

  #include <signal.h>

  #include "../a0wait.c"

  #include "../a1wait.c"

  #include "../curtime.c"

  #include "../truck.h"

  static struct truck this;

  static int thisState;

  /* обработчик сигнала SIGUSR1 */

  void usr1Handler(int sig_num) {

    if (!thisState) kill(getppid(),SIGUSR1);

    else kill(getppid(),SIGUSR2);

    }

  /* обработчик сигнала SIGTERM */

  void termHandler(int sig_num) {

    if ( !thisState || (waitFactor>1000) ) exit(8);

    else

     printf("%s Грузовик %s получил ещё немного времени на доставку (%d)\n",

        curtime(),this.name,waitFactor);

    }

  main(int an, char *av[]) {

   int need;

   int opt;

    /* установка обработчика сигнала SIGUSR1 */

    signal(SIGUSR1,usr1Handler);

    signal(SIGTERM,termHandler);

    #include "../incl_tr1.c"

    #include "../incl_t2.c"

    #include "../incl_t3.c"

    exit(0);

  }


Нижче приводиться приклад виконання цієї моделі

20:39:37.864 Начало работы

20:39:37.866 - Грузовик Freightliner загрузку начал, приоритет=0

20:39:37.870 - Грузовик International загрузку начал, приоритет=0

20:39:37.874 - Грузовик Mack загрузку начал, приоритет=0

20:39:37.894 - Грузовик Peterbilt загрузку начал, приоритет=0

20:39:37.898 - Грузовик Kenuorth загрузку начал, приоритет=0

20:39:37.910 - Грузовик Volvo загрузку начал, приоритет=0

20:39:37.975 - Грузовик Sterling загрузку начал, приоритет=0

20:39:37.978 - Грузовик Western_Star загрузку начал, приоритет=0

20:39:43.422 - Грузовик International закончил погрузку

20:39:44.744 - Грузовик Mack закончил погрузку

20:39:44.914 - Грузовик Peterbilt закончил погрузку

20:39:48.712 - Грузовик Sterling закончил погрузку

20:39:51.518 - Грузовик Freightliner закончил погрузку

20:39:53.296 - Грузовик Volvo закончил погрузку

20:39:54.207 - Грузовик Western_Star закончил погрузку

20:39:55.210 - Грузовик Peterbilt доставил товар

20:39:56.564 - Грузовик Mack доставил товар

20:39:56.657 - Грузовик International доставил товар

20:39:57.722 - Грузовик Freightliner доставил товар

20:39:58.536 - Грузовик Sterling доставил товар

20:39:59.034 ВРЕМЯ ОЖИДАНИЯ ИСТЕКЛО

20:39:59.035 Грузовик Freightliner нормально завершился

20:39:59.035 Грузовик International нормально завершился

20:39:59.035 Грузовик Mack нормально завершился

20:39:59.035 Грузовик Peterbilt нормально завершился

20:39:59.135 - Грузовик Western_Star доставил товар

20:39:59.284 - Грузовик Kenuorth закончил погрузку

20:39:59.434 Грузовику Kenuorth послан SIGTERM

20:39:59.538 Грузовик Kenuorth получил ещё немного времени на доставку (169)

20:39:59.743 Грузовику Volvo послан SIGTERM

20:39:59.743 Грузовик Sterling нормально завершился

20:39:59.743 Грузовик Western_Star нормально завершился

20:39:59.847 Грузовик Volvo разбился

20:40:00.501 - Грузовик Kenuorth доставил товар

20:40:00.502 Грузовик Kenuorth нормально завершился

Висновок: засвоїв способи використання сигналів для синхронізації процесів.