PDA

View Full Version : [c]processi forcati che cercano un numero


dyablo96
11-11-2013, 19:03
ciao a tutti, ho un problema nel seguente esercizio:
allora dopo aver generato un vettore con dei numeri casuali devo forkare un certo numero di processi che decide l'utente.
ora ogni processo forkato dovra cercare in una certa area del vettore.
così creo una matrice che in base alla lunghezza del vettore e del numero dei processi contiene l'inizio e la fine dell'area riservata ad ogni processo figlio.
gli spazzi esclusi dovranno essere controllati dal processo padre.
io incontro problemi solo nel momento in cui i processi figli devono cercare un numero, infatti sono così veloci che non faccio in tempo ad incrementare la riga della matrice di ricerca che loro hanno già acquisito l'area di ricerca sbagliata.

forse però se vi posto il codice che devono eseguire i processi figli e il processo padre capite meglio :D .


if(PIDfiglio != ProcessoPadre)
{
int inizio = matrice_ricerca[indice_riga_matrice][1];
int fine = matrice_ricerca[indice_riga_matrice][2];
indice_riga_matrice++;
for(i=inizio;i<=fine;i++)
{
if(elementi[i] == num_da_cercare)
{
printf("F: E' stato trovato alla posizione %d del vettore elementi\n",i);
}
}
}
else
{
sleep(2);
int inizio = matrice_ricerca[Numero][1];
int fine = matrice_ricerca[Numero][2];
for(i=inizio;i<=fine;i++)
{
if(elementi[i] == num_da_cercare)
{
printf("P: E' stato trovato alla posizione %d del vettore elementi\n",i);
}
}

}

se non avete capito quello che devo fare scrivete pure, cercherò di essere ancora più chiaro :)

dyablo96
11-11-2013, 19:26
credo di aver capito l'errore, la varibile che indica ai processi la riga da cui leggere loro la copiano dal processo padre quindi anche se un processo l'aumenta per far leggere al processo successivo la prossima riga il processo successivo leggerà la variabile presente nel processo padre che non è stata modificata, io dovrei fare in modo che la variabile sia comune ai processi figli, come potrei fare ????

dyablo96
12-11-2013, 18:06
risolto, posto il codice così se qualcuno ha lo stesso problema può trovare la soluzione

//Ciclo che genera i processi figli
for(i=0; i<Numero; i++)
{
//Se il padre esegue questo controllo allora risponderà positivamente e crerà un nuovo processo figlio
if(getpid() == ProcessoPadre)
{
n = fork();
}
//Se un processo figlio incontra il controllo precedente allora esegue l'else e quindi termina l'esecuzione del for
else
break;
}
//Ogni processo forkato ha una i differente che lo identifica
//Sottraggo 1 alla i perche essa indica l'indice di riga della matrice che però parte da 0
i--;

//Pid del figlio
int PIDfiglio = getpid();

//A questo if rispondera positivamente solo il figlio
if(PIDfiglio != ProcessoPadre)
{
//Creo 2 varibili ricavate dalla matrice che indicano l'inzio e la fine della lettura
int inizio = matrice_ricerca[i][1];
int fine = matrice_ricerca[i][2];
//Inizio a leggere
for(i=inizio;i<=fine;i++)
{
//Se trovo una corrispondeza stampo un messaggio
if(elementi[i] == num_da_cercare)
{
printf("F %d: E' stato trovato alla posizione %d del vettore elementi\n",PIDfiglio,i);
}
}
}
//Solo il padre entrerà nell'else
else
{
//Dato che non sono riuscito a far funzionare il waitpid allora faccio aspettare al padre 1 secondo
//Così che tutti gli altri processi figli possano terminare
sleep(1);
//Ciclo di lettura per il padre
for(i=start_padre;i<=fine_padre;i++)
{
//Se trovo una corrispondenza allora stampo un messaggio
if(elementi[i] == num_da_cercare)
{
printf("P: E' stato trovato alla posizione %d del vettore elementi\n",i);
}
}

}

//Termino il programma
return 0;