zagniezdzone petle, semafory

0

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;
}
0

Źle forkujesz. Po sforkowaniu nadal jesteś w pętli for (sklonowane procesy same się klonują!). Poza tym 'getchar' powinieneś wywołać po wyjściu z pętli for, jak już wszystkie child'y zostaną stworzone, a nie tak jak do tej pory po każdym stworzeniu pojedynczego childe'a:

for(i = 0; i < nchild; ++i)
{
	switch(fork())
	{
		case -1:
			error("fork");
			break;

		case 0:                                
			child(i, sem_id, blok,nchild);
			return 0; // <------------ !!!
	}
}
getchar();
//...

1 użytkowników online, w tym zalogowanych: 0, gości: 1