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 */
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.