salve a tutti, sto svolgendo il seguente esercizio:
Realizzare un programma C (processo Pp ) che soddisfi i seguenti requisiti :
1. Pp riceve 3 ≤ N ≤ 10 argomenti di invocazione sulla linea di comando, da interpretare
come interi e per cui deve valere 1 ≤ Ni≤ 4;
2. inizialmente Pp dovr`a creare N processi figli Pi che attendono un intervallo di durata casuale 1 ≤ Ti ≤ 5 secondi, visualizzano un messaggio e terminano;
3. ogni volta che l’i-esimo processo figlio termina, il padre Pp deve decrementare il valore di Ni e creare un nuovo figlio per Pi solo se Ni ≥ 0 :
• Se Ni > 0, Pp deve creare un nuovo figlio con il comportamento descritto
in precedenza ;
• Se Ni = 0, Pp deve creare un nuovo figlio che esegue il programma /usr/bin/xmessage con argomento Il figlio n. [i] termina e terminare;
4. quando tutti i figli sono terminati e non `e possibile creare altri processi (Ni = −1, ∀Ni ),Pp visualizza un messaggio finale e termina anch’esso.
il codice da me prodotto e allegato è ancora del tutto in sviluppo e contiene tutti i miei appunti commenti ma soprattutto errori ^^ e mi scuso con tutti per le possibili cavolate che troverete (naturalmente correggetemi in ogni parte).
il mio problema è che non riesco ad incrementare in modo corretto la variabile j che permette l'attraversamento dell'array Ni, che dovrebbe far diventare i valori al suo interno tutti 0 per permettere la terminazione del ciclo.
A me j non aumenta in modo corretto generandomi un ciclo infinito.
Premetto che non ho mai lavorato in ambiente Unix che che quindi presento alcune lacune sul funzionamento delle fork.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char **argv)
{
srand(time(NULL));
int N,status;
int atteso,gin=0,gi=0;
/*N figli*/ N=rand()%2;
N=N+3;
printf("%d\n", N);
int Ni[N];
int pid;
int v=getppid();
int b=0,i=0;
srand(time(NULL));
printf("\n");
/*Riempio Ni*/ for(b=0;b<N;b++)
{
Ni[b]= rand()%4;
Ni[b]=Ni[b]+1;
printf("%d ",Ni[b]);
}
printf("\n");
printf(" \n");
/*Creo Figlio*/
int j=0;
while(gin!=1)
{
if(j==N)
j=0;
/*ERRORE*/ if((pid=fork())<0)
{
perror("figlio nn parte");
exit(-1);
}
/*FIGLIO*/ else if(pid==0 && Ni[j]!=0)
{
/*SLEEP FIGLIO*/ /*il figlio si ferma per g secondi
int g=rand()%5;
sleep(g);*/
/*MEX FIGLIO*/ printf("\nIo sono PID %d, mio padre è %d e il mio ni é %d\n", getpid(), v,Ni[j]);
/*printf("ho atteso %d secondi\n",g);*/
exit(0);
}
/*PADRE*/ else
{
printf("sono il padre %d %d\n", v, j);
/*ATTESA*/ wait(&status);
if(Ni[j]>0)
{
Ni[j]--;
j++;
pid=fork();
}
else if(Ni[i]==0)
{
printf("CREO ULTIMO PROCESSO con xmessage\n");
}
else printf("fine"); exit(0);
for(gi=0,gin=0;gi<N;gi++)
{
if(Ni[gi]==0)
gin++;
}
printf("\n GIN %d \n",gin);
int f;
for(f=0;f<N;f++)
printf("%d ",Ni[f]);
printf("\n ");
}
}
return 0;
}
grazie in anticipo a chi risponderà