[synchronisation de processus][unix] Soucis d'itération
Fermé
Nelween
-
Modifié le 5 juin 2017 à 09:58
ElementW
Messages postés4814Date d'inscriptiondimanche 12 juin 2011StatutContributeurDernière intervention 5 octobre 2021
-
6 juin 2017 à 00:19
Bonjour,
je suis un débutant qui essaye de comprendre le fonctionnement des processus sous unix.
j'essaye d' afficher sur la console ceci, en utilisant la synchronisation des processus pour afficher les output dans l'ordre et la mémoire partagée pour stocker l'output affiché :
Message 0 du fils
Message 1 du fils
Message 2 du fils
Message 3 du fils
Message 4 du fils
Message 5 du fils
Le problème...c'est que je n'ai qu'une seule itération sur deux qui s'affiche !
Message 0 du fils
Message 2 du fils
Message 4 du fils
Message 6 du fils
Voici mon code :
#include<sys/ipc.h>#include<sys/shm.h>#include<sys/types.h>#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<errno.h>#include<signal.h>#include<stdbool.h>#include<sys/wait.h>#define KEY_FOR_FTOK 'M'char memPartage[50];int shmId;voidfils1();voidfils2();char*createSHM();voidkillReceiver(int signum);voidextendedPause(void);int killReceived;voidstopBoucle(int signum);int pidFils1, pidFils2, pidP;int stop;intmain(int ac,char**av){
stop=0;
pidP=getpid();
killReceived=0;signal(SIGUSR1, killReceiver);int pidFils1;int pidFils2;
pidFils1=fork();printf("debut du pere\n");if(pidFils1 <0){printf("Erreur creation du fils 1");exit(EXIT_FAILURE);}if(pidFils1==0){fils1();}extendedPause();printf("Le pere se reveille !");
pidFils2=fork();if(pidFils2 <0){printf("Erreur creation du fils 1");exit(EXIT_FAILURE);}if(pidFils2==0){fils2();}printf("fin du pere\n");exit(EXIT_SUCCESS);}voidfils1(){
killReceived=0;signal(SIGUSR1, killReceiver);
pidFils1=getpid();char* pEcriture=createSHM();printf("debut du fils\n");kill(pidP,SIGUSR1);extendedPause();int i=0;for(i=0;i<10;i++){sleep(2);sprintf(pEcriture,"Message %d du fils\n", i);kill(pidFils2, SIGUSR1);extendedPause();}printf(" -- FIN DU FILS --\n");kill(pidFils2,SIGUSR2);}voidfils2(){
killReceived=0;signal(SIGUSR1, killReceiver);signal(SIGUSR2, stopBoucle);char* pLecture=createSHM();
pidFils2=getpid();kill(pidFils1, SIGUSR1);extendedPause();while(stop==0){sleep(2);fflush(stdout);printf(pLecture);fflush(stdout);kill(pidFils1, SIGUSR1);extendedPause();}}char*createSHM(){key_tkey;int i;
key =ftok(getenv("HOME"), KEY_FOR_FTOK);if( key ==-1){perror("erreur creation cle");exit(EXIT_FAILURE);}printf("key : %d\n",key);
shmId =shmget(key,sizeof(char[50]), IPC_CREAT|0600);if(shmId ==-1){switch(errno){case ENOENT :printf("pas de segment");exit(EXIT_SUCCESS);case EEXIST :fprintf(stderr,"le segment exite deja");break;default:perror("shmget");exit(EXIT_FAILURE);}exit(EXIT_FAILURE);}char* pMemoire =(char*)shmat(shmId,NULL, SHM_R | SHM_W);if(pMemoire == NULL ||(int)pMemoire ==-1){perror("Erreur attache memoire");shmctl(shmId, IPC_RMID, NULL);exit(EXIT_FAILURE);}return pMemoire;}voidkillReceiver(int signum){
killReceived++;}voidstopBoucle(int signum){
stop=1;}voidextendedPause(void){if(killReceived==0){pause();}
killReceived--;}
Si quelqu'un a la solution, je lui en serais très reconnaissant ! Merci ! :)
A voir également:
[synchronisation de processus][unix] Soucis d'itération
6 juin 2017 à 00:19