Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторки по ОС препод Челноков / 2семестр / VD / Nsouz / lab4_1
.c
#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;
}