Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторки по ОС препод Челноков / 2семестр / wi2 / chernok / lab34 / 341
.c#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
static int onsigalarm(int sig);
static void onsigint(int sig);
static void onsigusr1(int sig);
static void onsigusr2(int sig);
static void onsigusr3(int sig);
static void onsigcont(int sig);
static pid_t fpid,spid,tpid;
pid_t fdrd[2],fdwr[2];
int status,mes2,nsigs=0;
static struct sigaction act;
char buff[2],buff2[2];
sigset_t set;
int main(int argc, char *argv[])
{
signal(SIGINT,&onsigint);
pipe(fdrd);
pipe(fdwr);
fpid=getpid();
switch(spid=fork())
{
case -1:;
case 0:signal(SIGUSR1,&onsigusr2);
close(fdrd[1]);
close(fdwr[0]);
while(1)
pause();
default:
switch(tpid=fork())
{
case -1:;
case 0 :
close(fdrd[0]);
close(fdwr[1]);
signal(SIGUSR1,&onsigusr3);
while(1)
pause();
default:
close(fdrd[0]);
close(fdwr[1]);
buff[0]='a';
buff[1]='b';
signal(SIGUSR1,&onsigusr1);
kill(getpid(),SIGUSR1);
//while(1)
//wait();
}
}
}
void onsigint(int sig)
{
signal(SIGINT,&onsigint);
printf("Recieved signal to abort process %d\n",getpid());
exit(0);
}
void onsigusr1(int sig)
{
signal(SIGUSR1,&onsigusr1);
switch(nsigs=(nsigs+1)%5)
{
case 1:write(fdrd[1],buff,2);
sleep(1);
kill(spid,SIGUSR1);
case 2:write(fdrd[1],buff,2);
sleep(1);
kill(tpid,SIGUSR1);
case 3://sleep(1);
kill(spid,SIGUSR1);
case 4:read(fdwr[0],buff,2);
printf("FIRST process recieved: %s from SECOND process\n" ,buff);
sleep(4);
kill(tpid,SIGUSR1);
case 0:read(fdwr[0],buff,2);
printf("FIRST process recieved: %s from THIRD process\n" ,buff);
buff[0]=buff[0]+1;
buff[1]=buff[1]+1;
sleep(4);
kill(getpid(),SIGUSR1);
}
}
void onsigusr2(int sig)
{
signal(SIGUSR1,&onsigusr2);
switch(nsigs=(nsigs+1)%2)
{
case 1:
{
read(fdrd[0],buff,2)>0;
printf("SECOND process recieved: %s from FIRST process\n",buff);
sleep(4);
kill(fpid,SIGUSR1);
}
case 0:
{
buff[0]=buff[0]+1;
buff[1]=buff[1]+1;
write(fdwr[1],buff,2);
//sleep(4);
kill(fpid,SIGUSR1);
}
}
//signal(SIGUSR1,&onsigusr2);
}
void onsigusr3(int sig)
{
signal(SIGUSR1,&onsigusr3);
switch(nsigs=(nsigs+1)%2)
{
case 1:
{
read(fdrd[0],buff,2);
printf("THIRD process recieved: %s from FIRST process\n",buff);
sleep(4);
kill(fpid,SIGUSR1);
}
case 0:
{
buff[0]=buff[0]+1;
buff[1]=buff[1]+1;
write(fdwr[1],buff,2);
//sleep(4);
kill(fpid,SIGUSR1);
}
}
}
int onsigalarm(int sig)
{
signal(SIGALRM,&onsigalarm);
alarm(2);
}