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