[synchronisation de processus][unix] Soucis d'itération

Fermé
Nelween - Modifié le 5 juin 2017 à 09:58
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Derniè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;
void fils1();
void fils2();
char* createSHM();
void killReceiver(int signum);
void extendedPause(void);
int killReceived;
void stopBoucle(int signum);
int pidFils1, pidFils2, pidP;
int stop;

int main(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);

}

void fils1()
{
 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); 
 
}

void fils2()
{
 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_t key;
 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;
}
 
void killReceiver(int signum)
{
 killReceived++;
}

void stopBoucle(int signum)
{
  stop=1;
}

void extendedPause(void)
{
 if(killReceived==0)
 { 
  pause();
 }
 killReceived--;
 
}


Si quelqu'un a la solution, je lui en serais très reconnaissant ! Merci ! :)

1 réponse

Résolu
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
6 juin 2017 à 00:19
Et la solution est?
0