Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}