Загальні області пам’яті та семафори, страница 2

      in=0;

      /* преобразование идентификатора общей области в строку */

      sprintf(t,"%d",shmId);

      sprintf(t1,"%d",sk);

     /* порождение дочерних процессов */

      int ii=0;

      int jj=0;

      for (ne=0;ne<NE*2;ne++)

      {

             if (ne%2==0)

               {

                      wrt[ne].w=&wr[ii];

                      ii++; 

               }

               else

               {

                      rdt[ne].r=&rd[jj];

                      jj++;

               }               

      }

      for (ne=0; ne<NE*2; ne++)

      {

             if (ne%2==0)

            {

                 pw=fork();

                 if (pw==0){

                 if (execl(chld_nameWR, wrt[ne].w->name, t,t1, NULL)<0)

                 { 

                       perror(eee);

                       printf("%s\n",eee); exit(0);

                 }

                 }

                  wrt[ne].statusWR=-1;

                  wrt[ne].chpidWR=pw;

//               printf(" %d",pw);

            }

            else

            {

               pw=fork();    

               if (pw==0)     {

               if (execl(chld_nameRD, rdt[ne].r->name, t,t1, NULL)<0)

               {

                 perror(eee);

                 printf("%s\n",eee); exit(0);

               }

               }

                rdt[ne].statusRD=-1;

                rdt[ne].chpidRD=pw;

//             printf(" %d",pw);

         }   

      /* запоминание ID процесса-Слона */

       /*  if (ne%2==0)

          {

                 wrt[ne].statusWR=-1;

                 wrt[ne].chpidWR=pw;

         }

         else

         {

                 rdt[ne].statusRD=-1;

                 rdt[ne].chpidRD=pw;

          }*/

      } 

      /* пауза*/

       sleep(1);

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

       for (cnt=ne=0; ne<NE*2; ne++)

       {/* проверка - не закончился ли процесс */

        if(ne%2==0)

        {

          pw=waitpid(wrt[ne].chpidWR,&statWR,WNOHANG);

//        printf(" %d %d",pw,wrt[ne].chpidWR);

          if (pw==wrt[ne].chpidWR){

          /* если процесс закончился, значит, запуск faild*/

               printf("Writer %s не запущен\n",wrt[ne].w->name);

          }

          else

          {

//                printf("Writer %s запущен\n",rw[ne].p->name);

                  wrt[ne].statusWR=0;

                  cnt++;

          }

         }

        else

        {

          pw=waitpid(rdt[ne].chpidRD,&statRD,WNOHANG);

//        printf(" %d %d",pw,rdt[ne].chpidRD);

          if (pw==rdt[ne].chpidRD) {

                  /* если процесс закончился, значит faild*/ 

                  printf("Reader %s не запущен\n",rdt[ne].r->name);

          }

          else

          {

                rdt[ne].statusRD=0;

                cnt++;

          }

        }

       }

       /* если счетчик запущенных 0 - завершение Ганеши */

       if (!cnt)

       {

              printf("Ne odin process ne zapysshen!!!\n");

              exit(0);

       }

       sleep(10);

       //sleep(3);

       for (ne=0; ne<NE*2; ne++)

       {

        if (ne%2==0)

        {

                pw=waitpid(wrt[ne].chpidWR,&statWR,WNOHANG);

                if (wrt[ne].chpidWR!=pw)

                {

                   kill(wrt[ne].chpidWR,SIGKILL);

                   waitpid(wrt[ne].chpidWR,&statWR,0);

                   printf("%s - Writer %s finish\n",curtime(),

                                  wrt[ne].w->name,statWR);

                }

        }

        else

        {

                pw=waitpid(rdt[ne].chpidRD,&statRD,WNOHANG);

                if (rdt[ne].chpidRD!=pw)

                {

                   kill(rdt[ne].chpidRD,SIGKILL);

                   waitpid(rdt[ne].chpidRD,&statRD,0);

                   printf("%s - Reader %s finish\n",curtime(),

                                  rdt[ne].r->name,statRD);

                }

        }

       }

    /* уничтожение */

      shmdt(shm);

      shmctl(shmId,IPC_RMID,NULL);

      semctl(sk,0,IPC_RMID,arg);

      semctl(sk,1,IPC_RMID,arg);

      semctl(sk,2,IPC_RMID,arg);     

  }


Текст програми читача: