Mam problem, zeby program nie zatrzaskiwal sie w nieskonczonej petli, tylko zeby wykonal najpierw wszystkie iteracje w petli for. W sposob jaki jest tu przedstawiony informacje wyswietla jedynie zerowy proces potomny, a kolejne (ktorych jest nchild) nie. Jesli na koncu petli while dodam goto nie wroce z kolei do niej, a procesy maja caly czas probowac podnosic semafor - dopoki proces macierzysty nie dostanie getchara od uzytkownika. Mam nadzieje ze przedstawilem problem dosc jasno. Jest tam kilka moich funkcji umieszczonych w 5.1.h ale ich znajomosc nie jest konieczna, zeby rozwiazac moj problem. Z gory dziekuje za pomoc.
#include "5.1.h"
int child(int i, int sem_id, int blok, int nchild)
{
int sk;
int count_in=0;
int count_out=0;
while(1)
{
sleep(1);
sk = sem_op(sem_id, -1, blok);
if(sk == 1)
{
fflush(stdout);
count_in++;
printf("\033[%d;1H Proces [%d] (%d/%d) W sekcji krytycznej",i+1, i, count_in, count_out);
sleep(1);
sem_op(sem_id, 1, blok);
}
else
{
fflush(stdout);
count_out++;
printf("\033[%d;1H Proces [%d] (%d/%d) Poza sekcja krytyczna",i+1, i, count_in, count_out);
}
}
}
int main(int argc, char *argv[])
{
int klucz, nchild, blok, i;
if(argc>1) { klucz = atoi(argv[1]); }
if(argc>2) { nchild = atoi(argv[2]); }
if(argc>3) { blok = atoi(argv[3]); }
int pgrp, sem_id;
pgrp=getpgrp();
sem_id = sem_get(klucz);
sem_set(sem_id);
printf("\033[2J\033[H");
for(i=0;i<nchild;++i)
{
switch(fork())
{
case -1:
error("fork");
break;
case 0:
child(i, sem_id, blok,nchild);
break;
default:
getchar();
sem_del(sem_id);
if( killpg(pgrp, 9) == -1)
{error("killpg");}
break;
}
}
return 0;
}