ceccoggi
21-07-2008, 03:14
Mi trovo in questa situazione:
- un primo sistema che produce un pezzo da assemblare ogni x secondi. Questo sistema è costituito da 4 sottosistemi che tale lavoro.
- un secondo sistema che lavora come il primo (anch'esso costituito da 4 sottosistemi)
- un assemblatore che una volta ottenuto un pezzo dal sist1 e uno dal sist2 li assembla. Consideriamo fino a 4 assemblatori paralleli.
A grandi linee ho 2 pipe, la prima permette ai figli del primo sistema di comunicare con l'assemblatore, e la seconda che fa lo stesso con il secondo sistema.
Ogni sottosistema produce un pezzo ogni x secondi generati casualmente.
Ogni volta che l'assemblatore legge dalla pipe, riempie una cella del vettore relativo al sistema che ha prodotto il pezzo (tale vettore ha 4 celle, come il num max di assemblatori).
Ogni volta che vedo che c'è una coppia vett1 e vett2 a 1, vuol dire che posso assemblare e lancio un altro figlio che faccia delle cose.
Ora il mio problema è che non mi aggiorna correttamente il vettore!
Per debuggare stampo il risultato del primo vettore, e al primo ciclo normalmente son tutti 0.
Una volta che viene prodotto un pezzo però dovrei avere il contenuto del vettore che si riempie mano a mano..però così non avviene..si riempie casualmente:|...e cosa ancor + strana...SI SVUOTA senza che nessuno gli azzeri le celle:muro:
Ecco il codice:
while(1)
{
printf(".\n");
select (max, &fds, NULL, NULL, NULL);
if (FD_ISSET(pipe1[0], &fds)){
FD_SET (pipe2[0], &fds);
read (pipe1[0], &buf, 1);
printf("prodotto pezzo da sottosistema 1\n");
printf("vett1[%d %d %d %d]\n", vett1[0], vett1[1], vett1[2], vett1[3]);
i=0;
while((i<0)&&(vett1[i]==1))
i++;
vett1[i]=1;
if(possoassemblare()>=0){
cont++;
printf("incrementato cont %d\n", cont);
figlio();
}
if((cont1=ancoraposti1())>=0){
sem_signal(s1);
printf("%d posti liberi nel vett1\n", 4-cont1);
}
}
else if (FD_ISSET(pipe2[0], &fds)){
FD_SET (pipe1[0], &fds);
read (pipe2[0], &buf, 1);
printf("prodotto pezzo da sottosistema 2\n");
printf("vett2[%d %d %d %d]\n", vett2[0], vett2[1], vett2[2], vett2[3]);
i=0;
while((i<4)&&(vett2[i]==1))
i++;
vett2[i]=1;
if(possoassemblare()>=0){
cont++;
printf("incrementato cont %d\n", cont);
figlio();
if((cont2=ancoraposti2())>=0){
sem_signal(s2);
printf("%d posti liberi nel vett2\n", 4-cont2);
}
}
}
Cos'è che non va?
- un primo sistema che produce un pezzo da assemblare ogni x secondi. Questo sistema è costituito da 4 sottosistemi che tale lavoro.
- un secondo sistema che lavora come il primo (anch'esso costituito da 4 sottosistemi)
- un assemblatore che una volta ottenuto un pezzo dal sist1 e uno dal sist2 li assembla. Consideriamo fino a 4 assemblatori paralleli.
A grandi linee ho 2 pipe, la prima permette ai figli del primo sistema di comunicare con l'assemblatore, e la seconda che fa lo stesso con il secondo sistema.
Ogni sottosistema produce un pezzo ogni x secondi generati casualmente.
Ogni volta che l'assemblatore legge dalla pipe, riempie una cella del vettore relativo al sistema che ha prodotto il pezzo (tale vettore ha 4 celle, come il num max di assemblatori).
Ogni volta che vedo che c'è una coppia vett1 e vett2 a 1, vuol dire che posso assemblare e lancio un altro figlio che faccia delle cose.
Ora il mio problema è che non mi aggiorna correttamente il vettore!
Per debuggare stampo il risultato del primo vettore, e al primo ciclo normalmente son tutti 0.
Una volta che viene prodotto un pezzo però dovrei avere il contenuto del vettore che si riempie mano a mano..però così non avviene..si riempie casualmente:|...e cosa ancor + strana...SI SVUOTA senza che nessuno gli azzeri le celle:muro:
Ecco il codice:
while(1)
{
printf(".\n");
select (max, &fds, NULL, NULL, NULL);
if (FD_ISSET(pipe1[0], &fds)){
FD_SET (pipe2[0], &fds);
read (pipe1[0], &buf, 1);
printf("prodotto pezzo da sottosistema 1\n");
printf("vett1[%d %d %d %d]\n", vett1[0], vett1[1], vett1[2], vett1[3]);
i=0;
while((i<0)&&(vett1[i]==1))
i++;
vett1[i]=1;
if(possoassemblare()>=0){
cont++;
printf("incrementato cont %d\n", cont);
figlio();
}
if((cont1=ancoraposti1())>=0){
sem_signal(s1);
printf("%d posti liberi nel vett1\n", 4-cont1);
}
}
else if (FD_ISSET(pipe2[0], &fds)){
FD_SET (pipe1[0], &fds);
read (pipe2[0], &buf, 1);
printf("prodotto pezzo da sottosistema 2\n");
printf("vett2[%d %d %d %d]\n", vett2[0], vett2[1], vett2[2], vett2[3]);
i=0;
while((i<4)&&(vett2[i]==1))
i++;
vett2[i]=1;
if(possoassemblare()>=0){
cont++;
printf("incrementato cont %d\n", cont);
figlio();
if((cont2=ancoraposti2())>=0){
sem_signal(s2);
printf("%d posti liberi nel vett2\n", 4-cont2);
}
}
}
Cos'è che non va?