int main(int argc, char **argv) { int nb_fils, shm_id; char *adr_att; key_t cle; /* Nombre d'arguments invalide */ if (argc != 2) { printf("Usage : ./remonte_ipc nb_fils\n"); return EXIT_FAILURE; } /* Nombre de file invalide */ nb_fils = atoi(argv[1]); if (!nb_fils) { printf("nb_fils doit être un nombre strictement positif.\n"); return EXIT_FAILURE; } /* Création clé = (nom du programme, 8 LSB du pid) */ if ((cle = ftok(argv[0], getpid() & 0xFF)) == -1) { perror("Erreur ftok.\n"); return EXIT_FAILURE; } /* Création ID du segment partagé */ if ((shm_id = shmget(cle, nb_fils * sizeof(int), 0666 | IPC_CREAT)) == -1) { perror("Erreur shmget.\n"); return EXIT_FAILURE; } /* On récupère l'addresse du segment partagé */ adr_att = shmat(shm_id, NULL, 0600); remonte_partagee(nb_fils, shm_id, adr_att); shmdt_shmctl(adr_att, shm_id); /* On supprime le segment partagé */ if (shmctl(shm_id, IPC_RMID, NULL) == -1) { perror("Erreur shmctl.\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
int main(int argc, char* argv[]) { key_t cle; int nb_fils, i; if (argc != 2) { printf("%derror syntaxe : %s nbProcessus \n", argc, argv[0]); exit(1); } nb_fils = atoi(argv[1]); /*------------------------------------------------------*/ /* creation segment memoir */ /*------------------------------------------------------*/ taille = (nb_fils + 1) * sizeof(int); char *shm_nom = "/remonte_posix_partagee"; if ((shm_id = shm_open(shm_nom, O_CREAT | O_RDWR, 0600)) == -1) { perror("shm_open"); exit(-1); } if (ftruncate(shm_id, taille) == -1) { perror("ftruncate"); exit(-1); } if ((adr_att = mmap(NULL, taille, PROT_READ | PROT_WRITE, MAP_SHARED, shm_id, 0)) == MAP_FAILED) { perror("mmap"); exit(-1); } p_int = (int*) adr_att; p_int[0] = 0; /*------------------------------------------------------*/ /* traitement liberation memoir partage */ /*------------------------------------------------------*/ remonte_partagee(nb_fils); while (p_int[0] == 0) { printf("attend while %d \n", p_int[0]); sleep(1); } int result = 0; for (i = 1; i < nb_fils + 1; i++) { printf("pere from fils %d ===> %d \n", i, p_int[i]); result += p_int[i]; } printf("pere %d : la somme est %d \n", getpid(), result); if (shm_unlink(shm_nom) == -1) { perror("shm_unlink"); exit(-1); } return EXIT_SUCCESS; }
int main(int argc, char* argv[]) { key_t cle; int taille = 0; int nb_fils, i; if (argc != 2) { printf("%derror syntaxe : %s nbProcessus \n", argc, argv[0]); exit(1); } nb_fils = atoi(argv[1]); /*------------------------------------------------------*/ /* creation segment memoir */ /*------------------------------------------------------*/ taille = (nb_fils + 1) * sizeof(int); char code = 0; code = getpid() & 255; if (code == 0) { printf("error code = 0"); exit(-1); } if ((cle = ftok(argv[0], code)) == -1) { perror("ftok"); exit(-1); } if ((shm_id = shmget(cle, taille, IPC_CREAT | 0666)) < 0) { perror("shmget"); exit(-1); } if ((adr_att = shmat(shm_id, NULL, 0600)) == (void *) -1) { perror("shmat"); exit(-1); } tab_val_random = (int*) adr_att; tab_val_random[0] = 0; /*------------------------------------------------------*/ /* traitement liberation memoir partage */ /*------------------------------------------------------*/ remonte_partagee(nb_fils); while (tab_val_random[0] == 0) { printf("attend while %d \n", tab_val_random[0]); sleep(1); } int result = 0; for (i = 1; i < nb_fils + 1; i++) { printf("shm%d recu %d \n", i, tab_val_random[i]); result += tab_val_random[i]; } printf("pere %d : la somme est %d \n", getpid(), result); shmdt(adr_att); shmctl(shm_id, IPC_RMID, NULL); return EXIT_SUCCESS; }