2017-06-16 2 views
0

Je devrais écrire un programme qui écrirait des entiers dans une mémoire partagée, fork un childprocess et le childprocess devrait lire les entiers.C mémoire partagée seulement 1024 int en processus fourchu

shm.c

#define N_SHARED 2000 

int main(int argc, char **argv) { 
/* Ein Shared-Memory-Segment einrichten */ 
shmid = shmget(IPC_PRIVATE, N_SHARED, IPC_CREAT | SHM_R | SHM_W); 

if (shmid == -1) { 
perror("shmid"); 
exit(1); 
} 

/* Pointer zu Sharedm-Memory-Segment erhalten */ 
shmData = (int *)shmat(shmid,0, N_SHARED); 
if (shmData == (int *)(-1)) { 
    perror("shmat"); 
    exit(1); 
} 

/** ininitalisieren des Zufallsgenerator durch aktuellen Zeitstempel */ 
srand48(time(NULL)); 
for (i=0; i<N_SHARED; i++) { 
shmData[i] = lrand48(); 
printf("SHM-->%d-->%d\n",i+1,shmData[i]); 
} 

    pid = fork(); 

    snprintf(shmidArg,32, "%d", shmid); 

    // Kindprozess 
    if (pid == 0) { 
    execlp("./shm_child",shmidArg,NULL); 
    } else if (pid < 0) { 
     perror("Kindprozess konnte nicht erzeugt werden!"); 
     return 1; 
    } 

shm_child.c

#define N_SHARED 2000 

    int i; 
    int *shmData; 
    static int shmid; 

    int main(int argc, char **argv) { 
    shmid = atoi(argv[0]); 
    printf("shm_child shared memoryid:%d\n",shmid); 

    /* Shared-Memory laden */ 
    shmData = (int *)shmat(shmid,0,0); 
    if (shmData == (int *)(-1)) { 
     perror("shmat"); 
     exit(1); 
    } 


    for(i=0;i<N_SHARED;i++) { 
     printf("%d --> %d\n",i+1,shmData[i]); 
    } 

Mon problème: Chaque numéro après l'indice 1024 est 0 dans le child_process mais pas dans le processus principal.

Merci

+2

Je pense que vous n'avez pas spécifié la taille correcte de la mémoire partagée que vous avez créée avec la fonction shmget dans le processus parent. Le deuxième argument de cette fonction devrait être 'N_SHARED * sizeof (int)'. 'shmid = shmget (IPC_PRIVATE, N_SHARED * sizeof (int), IPC_CREAT | SHM_R | SHM_W);' – shamba

+0

Le troisième argument de 'shmat()' est un masque de bit de drapeau, mais à la place, vous semblez passer la taille (qui est un caractéristique inhérente au segment de mémoire partagée). C'est faux, mais on ne sait pas si cela explique votre problème. –

+0

@shamba C'était le problème. Merci beaucoup ! – Ezak

Répondre

2

Je crois que si vous changez #define N_SHARED 2000 à #define N_SHARED 2000*sizeof(int), vous code devrait fonctionner comme prévu.

shmat alloue de la mémoire partagée de taille égale à la valeur de la taille arrondie à un multiple de PAGE_SIZE. Vous code tente d'allouer 2000 octets qui est arrondie à 4096, c'est-à-dire 1024 * sizeof(int). Ceci explique pourquoi le premier 1024 int a une valeur attendue.