Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
26.05.2014
Размер:
3.15 Кб
Скачать
#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);
  
}


Соседние файлы в папке lab34
  • #
    26.05.20143.15 Кб4341.c
  • #
    26.05.201413.76 Кб4a.out