RISOLTO Problema con ciclo for

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
Messaggi
193
Reazioni
15
Punteggio
43
Ciao a tutti, quando avvio questo codice sul terminale di Lubuntu il figliI 2 e 3 hanno lo stesso valore, sapete perché? Cosa sbaglio?

C:
#include "library.h"

void handler(int sig)
{
}

int main()
{
    pid_t res;
    int id, *ptr, num=0;

    signal(SIGUSR1, handler);
    srand(time(NULL));


    printf("INIZIO PROGRAMMA\n\n");

    id=shmget(IPC_PRIVATE, 4*sizeof(int), IPC_CREAT|0666);
    if(id<0)
    {
        perror("ERRORE");
        exit(1);
    }
    else
    {
        printf("[PADRE]:Ho creato una shared memory di 4 interi con ID %d.\n", id);
    }
    printf("[PADRE]:Inserisco un valore casuale nella shared memory.\n");
    ptr=(int*)shmat(id, NULL, 0);
    if((int)ptr==-1)
        {
            perror("ERRORE");
            exit(1);
        }   

    num=rand()%100+1;
    ptr[0]=num;
    shmdt(ptr);

    for(int i=0;i<3;i++)
    {
        res=fork();
        switch(res)
        {
            case -1:
                perror("ERRORE");
                exit(1);
            case 0:
                pause();
                ptr=(int*)shmat(id, NULL, 0);
                if((int)ptr==-1)
                {
                    perror("ERRORE");
                    exit(1);
                }   
                num=rand()%100+1;
                ptr[i+1]=num;
                printf("[FIGLIO %d]:Ho letto i valori:\n", i+1);
                for(int k=0;k<i+2;k++)
                {
                    printf("%d\n", ptr[k]);
                }
                pause();
            default:
                sleep(1);
                printf("\n[PADRE]:Attivo il figlio %d...\n", i+1);
                kill(res, SIGUSR1);
                sleep(1);
                kill(res, SIGKILL);
                break;
        }
    }
    printf("\n");
    printf("FINE PROGRAMMA\n");
    return(0);
}
 

Allegati

  • WhatsApp Image 2022-10-31 at 21.51.27.webp
    WhatsApp Image 2022-10-31 at 21.51.27.webp
    330.6 KB · Visualizzazioni: 30
a parte quel i+1 e quel loop con k che non si capisce,
dal tuo codice a ogni primo rand dopo srand, da diversi child, avrai lo stesso valore.

Usa srand di nuovo dopo ogni fork, cosi':
Codice:
srand(time(NULL) ^ (getpid()<<16));
 
a parte quel i+1 e quel loop con k che non si capisce,
dal tuo codice a ogni primo rand dopo srand, da diversi child, avrai lo stesso valore.

Usa srand di nuovo dopo ogni fork, cosi':
Codice:
srand(time(NULL) ^ (getpid()<<16));
cosa non si capisce
 
non capisco perche' scrivi alla locazione "i+1"
non capisco perche il ciclo k se scrivi sempre alla stessa locazione

Cmq, non e' importante se io capisco o no quello che avei in mente, ma che ti ho indicato l'errore.

Ri-esegui

srand(time(NULL) ^ (getpid()<<16));

dal processo figlio (child), mi raccomando usando il pid
 
non capisco perche' scrivi alla locazione "i+1"
non capisco perche il ciclo k se scrivi sempre alla stessa locazione

Cmq, non e' importante se io capisco o no quello che avei in mente, ma che ti ho indicato l'errore.

Ri-esegui

srand(time(NULL) ^ (getpid()<<16));

dal processo figlio (child), mi raccomando usando il pid
si ho fatto e funziona.

i+1 lo uso per salvare il numero nella posizione i-esima dell'array e non sovrascrivere mentre il ciclo k lo uso per stamparli a schermo
 
boh., ok, importante e' che funziona, risolto !
PS: a volte un "grazie" non costa nulla.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top