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
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
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. –
@shamba C'était le problème. Merci beaucoup ! – Ezak