RISOLTO Problema con ciclo for

Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
184
14
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.jpeg
    WhatsApp Image 2022-10-31 at 21.51.27.jpeg
    422.4 KB · Visualizzazioni: 30

bigendian

Utente Attivo
749
432
OS
Linux
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));
 
  • Mi piace
Reazioni: DispatchCode

bigendian

Utente Attivo
749
432
OS
Linux
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
 

Vito-

Utente Attivo
184
14
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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
  • Mi piace
Reazioni: Mursey

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
  • Mi piace
Reazioni: bigendian e Vito-
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili