Засвоєння іменованих програмних каналів як засобу обміну даними між процесами, страница 2

       need=(this.weight)*50;  /* вычисление потребности */

       printf("%s Политикан %s приступил. Потребность - %ld, приоритет - %d(%s)\n", 

               curtime(),this.name,need,getpriority(PRIO_PROCESS,getpid()),target);

       /* цикл, пока не будет удовлетворена потребность */

       while (need>0)

       {

               /* ожидание и получение порции */

               read(fdMy,&myport,sizeof(long));

               if (myport>need) myport=need;

               a0wait((int)(myport/this.power/10));

               /* уменьшение потребности */

               need-=myport;

               printf("%s Политикан %s нашел компромата на %ld, еще нужно - %ld\n",curtime(),this.name,myport,need);

               if(!(need>0)) break;

               read(fdMy2,&myport,sizeof(long));

               if (myport>need) myport=need;

               a0wait((int)(myport/this.power/5));

               need-=myport;

               printf("%s Политикан %s крадет у %s информации на %ld, еще нужно - %ld\n",curtime(),this.name,target,myport,need);

               if((10.*rand()/RAND_MAX)>7){

               myport/=2;

               write(fdMy2,&myport,sizeof(long));

               if (myport>need) myport=need;

               a0wait((int)(myport/this.power/8));

               need+=myport;

               printf("%s Политикан %s возвращает %s %ld информации , еще нужно %ld\n",curtime(),this.name,target,myport,need);     

               }

       }

       printf("%s Политикан %s завершил предвыборную программу\n",curtime(),this.name);

       /* вывод в канал доклада о завершении и завершение */

       fdG=open(gFname,O_WRONLY);

       write(fdG,this.name,strlen(this.name)+1);

       close(fdG);

       close(fdMy);

       close(fdMy2);

       close(fdMy3);

       exit(0);

}


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

#include <sys/time.h>

#include <time.h>

#include <fcntl.h>

#include <sys/resource.h>

#include <sys/stat.h>

#include "../truck.h"

#include "../base.h"

#include "../curtime.c"

#include "../incl_dcl.c"

#define NT 8

static char chld_name[]="./truck4";

static char state=0; 

static int fdE[NT];  /* Дескрипторы каналов */

static int fdG;  /* Дескриптор и имя канала монитора */

char gFname[]="Monitor";

static long need[NT];  /* Индивидуальные потребности Политиканов */

main()

{     

       pid_t pw;    /* PID запущенного процесса */

       int s;

       int i;

       long port;   /* размер очередной порции */

       long total;  /* общая потребность стада */

       char t1[20], t2[20], t3[20], t4[20];

       char eee[512];

       char mess[16];  /* текст доклада от Политикана */

       t3[0]=t4[0]=0;

    /* запуск процессов-Политиканов */

       int tgt=0;

       for (nt=0; nt<NT; nt++) {

               /*               файл incl_str.c                 */

               /* запись личных данных в управляющую информацию */

               mtr[nt].tr=&et[nt]; 

               /* представление нестроковых данных в строковом виде */

               sprintf(t1,"%d",mtr[nt].tr->power);

               sprintf(t2,"%lf",mtr[nt].tr->weight);

               tgt=3;

               if(nt>0) tgt=nt-1;

               pw=fork();

               if (pw==0) {

                      /* создание канала для Политикана */

                      unlink(mtr[nt].tr->name);

                      mknod(mtr[nt].tr->name,S_IFIFO|0x1b6,0);

                      /* вычисление потребности для Политикана */

                      need[nt]=mtr[nt].tr->weight*50;

                      if(execl(chld_name,mtr[nt].tr->name,t1,t2,mtr[tgt].tr->name,t4,NULL)<0) { 

                              /* если загрузка программы-Политикана почему-либо не удалась,

                              печатается сообщение об ошибке, и процесс завершается */

                              perror(eee);

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

                      }

                      /* если вызов execl выполнился успешно, то далее в

                      дочернем процессе выполняется программа elephant1 */

               }