[synchronisation de processus][unix] Soucis d'itération
Nelween
-
ElementW Messages postés 5690 Statut Contributeur -
ElementW Messages postés 5690 Statut Contributeur -
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 :
Si quelqu'un a la solution, je lui en serais très reconnaissant ! Merci ! :)
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 ! :)
A voir également:
- [synchronisation de processus][unix] Soucis d'itération
- Processus inactif du systeme ✓ - Forum Windows
- Fichier executable unix ✓ - Forum MacOS
- Impossible de synchroniser manette wii - Forum Wii
- Processus déclaration tva rapport de stage ✓ - Forum compta / gestion
- Synchronisation agenda google et outlook - Guide