Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
26.05.2014
Размер:
3.84 Кб
Скачать

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <signal.h>

char name[10];
pid_t proc1,proc2,proc3,proc4,proc5;
static key_t key,semid;


static struct sembuf fork1[2]={0,0,0,
                               0,1,0};

static struct sembuf delfork1[1]={0,-1,0};

static struct sembuf fork2[2]={0,0,0,
                               0,1,0};

static struct sembuf delfork2[1]={0,-1,0};



static void sigcntrlc(int sig);
static void sigalarm(int sig);
static void disp(int st);
static void struc(int num);

int p;


//******************************************************************
int main(int argc, char *argv[])
{
  signal(SIGINT,&sigcntrlc);
  semid=semget(key,5,0777 | IPC_CREAT);

  switch(proc1=fork())
  {
    case  0:
      {
        strcpy(name,"Process1 ");
        struc(0);
        disp(0);
      }    
    default:
      switch (proc2=fork())
      {
        case  0:
          {
            strcpy(name,"Process2 ");
            struc(1);
            disp(0);
          }    
        default:
          {
            switch(proc3=fork())
            {
              case  0:
                {
                  strcpy(name,"Process3 ");
                  struc(2);
                  disp(0);
                }    
              default:
                {
                  switch(proc4=fork())
                  {
                    case  0:
                      {
                        strcpy(name,"Process4 ");
                        struc(3);
                        disp(0);
                      }    
                    default:
                      {
                        switch(proc5=fork())
                        {
                          case  0:
                            {
                              strcpy(name,"Process5 ");
                              printf("\nStart Programm!\n");
                              struc(4);
                              disp(0);
                            }    
                          default:
                            signal(SIGALRM,&sigalarm);
                            alarm(38);
                            while(1)
                               pause()  ;
                        }
                      }
                  }
                }
              
            }
          }
        
      }
  }
  return 0;
}



void disp(int st)
{
  switch(st)
  {
     
  case 0:
      { sleep(2);
        semop(semid,&fork1[0],2);
        disp(1);
      };
      
  case 1:
      {
        semop(semid,&fork2[0],2);
        disp(2);
      };
  case 2:
      {
        sleep(2);
        disp(3);
      };

      
  case 3:
      {
        
        printf("%s: Prosess are working\n",name);
        sleep(5);
        semop(semid,&delfork1[0],1);
        disp(4);
      };
  case 4:
      {
        semop(semid,&delfork2[0],1);
        disp(5);
      };
  case 5:
      {
        printf("%s: Prosess are waiting\n",name);
        disp(0);
      };
     
   
  }//end switch
}//end state



void sigcntrlc(int sig)
{
  printf("Deleating allsem with semid!\n",getpid());
  semctl(semid,p,IPC_RMID);
  exit(0);
}
void sigalarm(int sig)
{
  printf("All processes have already DONE 2times!\n");
  printf("All processes will have been KILLED!\n");
  printf("Press 'Ctrl+c' to exit programm!\n");
  kill(proc1,9);
  kill(proc2,9);
  kill(proc3,9);
  kill(proc4,9);
  kill(proc5,9);
}

void struc(int num)  //Don't repeat!
{
  p=num;
  fork1[0].sem_num=num;
  fork1[1].sem_num=num;
  fork2[0].sem_num=(num+1)%5;
  fork2[1].sem_num=(num+1)%5;
  delfork1[0].sem_num=num;
  delfork2[0].sem_num=(num+1)%5;
} 


Соседние файлы в папке Nsouz