Accueil > Forum > > > > [Programmation système] Comment synchroniser des signaux entre processus?
[Programmation système] Comment synchroniser des signaux entre processus?
vendredi 9 avril 2004 à 20:21:03 |
[Programmation système] Comment synchroniser des signaux entre processus?

biglittlekiss
|
Bonjour, Voila je fait cet exercice et je bloque sur l'execution ens équence des processus. Exercice: Un processus père, construit 2 processus fils, place leur pid dans 2 fichiers et s'endort immédiatement sur un wait. Le père se termine après la terminaison des fils. Les 2 processus Pa et Pb sont identiques: ils executent 3 sequences. A la fin de chaque séquence, le fils actif envoie in signal SIGUSR1 à l'autre fils et s'endort en attendant d'être réveillé par un signal SIGSUSR2. L'autre fils réveillé, agit de même, il execute sa séquence et ensuite envoie le signal SIGUSR2 et s'endort. Chacun des processus fils exécute ses 3 séquences et ensuite se termine. (donc les sequence se dérouleront dans cette ordre: Sa1, Sb1, Sa2, Sb2, Sa3, Sb3). Pour ma part, j'ai programmer ça, mais je ne vois pas pourquoi mes processus ne marche pas en sequence l'un après l'autre. Au secourrrrrrrrrr #include <stdio.h> /* printf */ #include <stdlib.h> /* exit */ #include <unistd.h> /* Fork write sleep */ #include <errno.h> /* Obtenir nuemro erreur */ #include <sys/wait.h> /* Wait WIFEXITED*/ #include <sys/types.h> /* Wait kill*/ #include <signal.h> /* SIGUSR1 SIGUSR2... kill */
int nbrseqPa = 3, nbrseqPb = 3, retcodePa = 15, retcodePb = 16; int nbr1 = 1, nbr2 = 1; int SIGSUSR2;
struct sigaction mode_signal;
void signal_for_son(int signal){
if (signal == SIGUSR1) { printf("Je suis dans SIGUSR1 Je vais réveiller mon frère Pb...");} if (signal == SIGUSR2) { printf("Je suis dans SIGUSR2 Je vais réveiller mon frère Pa...");}
printf("\nRéveil en cours...\n\n"); kill(getpid(), SIGSUSR2); }
int main(){
FILE * sortie_Pa; /* Déclaration d'un fichier de sortie pour le pid de Pa */ FILE * sortie_Pb; /* Déclaration d'un fichier de sortie pour le pid de Pb */ sortie_Pa = fopen( "Pid_Pa.txt" , "w"); /* Ouverture du fichier Pid_Pa.txt en mode ecriture */ sortie_Pb = fopen( "Pid_Pb.txt" , "w"); /* Ouverture du fichier Pid_Pb.txt en mode ecriture */
//############################## //############################## mode_signal.sa_handler = signal_for_son; mode_signal.sa_flags = 0; sigemptyset(&mode_signal.sa_mask); sigaction(SIGUSR1, &mode_signal, NULL); /* set traitement_signal pour SIGUSR1 */ sigaction(SIGUSR2, &mode_signal, NULL); /* set traitement_signal pour SIGUSR2 */ sigaction(SIGSUSR2, &mode_signal, NULL); /* set traitement_signal pour SIGSUSR2 */ //############################## //##############################
/* Test de la création de Pid_Pa.txt et de Pid_Pb.txt */ if ( sortie_Pa == NULL) { printf("****Erreur création du fichier sortie_Pa.txt impossible***"); exit(EXIT_FAILURE); } if ( sortie_Pb == NULL) { printf("****Erreur création du fichier sortie_Pb.txt impossible***"); exit(EXIT_FAILURE); }
printf ("\n\nJe suis PIPE.exe, processus père, titulaire du pid: %d \n", (int) getpid()); printf ("Je vais enfanter 2 fils: Pa et Pb, qui vont travailler en séquence\n\n");
/* Creation du processus Pa */ pid_t Pa; switch (Pa = fork()) { case -1 : printf("Erreur lors de la création de Pa! \nerrno= %d\n",errno); exit(EXIT_FAILURE); case 0 : fprintf(sortie_Pa, "Pa: No= %3d PID=%3d Pere= %d",Pa,getpid(), getppid() );
while (nbr1 <= nbrseqPa){ printf("Moi Pa fils de PIPE.exe, j'execute ma séquence %d \n\n",nbr1);
if (nbr1 < nbrseqPa) kill(getpid(), SIGUSR1); nbr1++; pause(); /* Mise en pause de Pa en attente d'un signal */ } exit(retcodePa); }
/* Creation du processus Pb */ pid_t Pb; switch (Pb = fork()) { case -1 : printf("Erreur lors de la création de Pb! \nerrno= %d\n",errno); exit(EXIT_FAILURE); case 0 : fprintf(sortie_Pb, "Pb: No= %3d PID=%3d Pere= %d",Pb,getpid(), getppid() );
while (nbr2 <= nbrseqPb){ printf("Moi Pb fils de PIPE.exe, j'execute ma séquence %d \n\n",nbr2); if (nbr2 < nbrseqPb) kill(getpid(), SIGUSR2); nbr2++; pause(); /* Mise en pause de Pb en attente d'un signal */ } exit(retcodePb); } /* Execution du processus père */ int attendcodePa, attendcodePb;
wait (&attendcodePa);/* On attend que Pa se finisse...*/ wait (&attendcodePb);/* On attend que Pb se finisse avant de commencer le code du père */ /* On affiche un message qu'au moin un des fils à mal travaillé */ if ( (WIFEXITED(attendcodePa) <= 0) && (WIFEXITED(attendcodePa) <= 0) ){ printf("Mes fils ne savent même pas travailler en partenaria se sont des incapables \n"); exit(EXIT_FAILURE); } /* On affiche que Pa et Pb ont bien accomplient leur job */ if ( (WIFEXITED(attendcodePa) > 0) && (WIFEXITED(attendcodePa) > 0) ){ printf("\nLes pid respectifs de Pa et Pb ont été enregistré dans Pid_Pa.txt et Pid_Pb.txt\n"); printf("\n\nMes fils ont bien travaillé! \n"); } printf("Je peux maintenant arrêter mon exécution\n\n\n"); exit(EXIT_SUCCESS); // }
|
|
|
samedi 10 avril 2004 à 05:01:02 |
Re : [Programmation système] Comment synchroniser des signaux entre processus?

Guillemouze
|
j'ai pas regarder ton code exactement mais si tu fais de processus legers (pthread_create, ...), tu poura utiliser les commandes signal de thread (pthread_cond_...) ou alors fais les communiquer par un tube (pipe) si tu garde des processus lourds.
|
|
Cette discussion est classée dans : pb, pa, printf, signal, pid
Répondre à ce message
Sujets en rapport avec ce message
palindrome [ par rhumsek ]
> /*Ecrire de deux façons différentes, un programme qui vérifie sans utiliser une> fonction de , si une chaîne CH introduite au clavier est un palindr
palindrome 2 [ par rhumsek ]
/*Ecrire de deux façons différentes, un programme qui vérifie sans utiliser une> fonction de , si une chaîne CH introduite au clavier est un palindrom
pb programme très très simple [ par surfeurnet ]
voila il s'agit d'un programme très simple qui ne fait pas d'erreurs à la compilation avec dev-cpp mais qui plante quand je l'exécute :#include char n
Pb peut etre de compilateur ?! Need Help please [ par Orezza ]
Orezzasalut à tous, je ne comprends vraiment pas le Pb, le compilateur Visual C++ indique 0 erreur-0 warning, or kand j'execute mon prog des ke je ren
importer une classe dans une dll [ par ilimo ]
bonjour : j'ai deux programmes : Pa Pb Pa contient la classe Ca Pb contient la classe Cb Pb est une dll pour Pa comment importer la classe Cb dans la
La hierarchie pere et fils [:(] !!!!!!!!!!!! HELP!!!!!!!!!!! [ par laetitia334 ]
bonjour a tous! j'ai un probleme avec un programme! car je ne comprend pas les termes utilisés:Main (){int pid;printf("je suis le processus initial \n
Pb de printf [ par AlexMAN ]
Bonjour, Voila, j'ai un ptit pb dans la fonction ki suit : si je place le printf ki suit getch() en commentaire, le code ne fonctionne plus, au contra
Problème avec les modules en C [urgent] [ par john_cc ]
Bonsoir, Merci, c'est bon, j'ai reglé mon précédent problème.J'ai encore un problème.J'ai 2 modules : un pour la saisie, un pour le combat.Quand je ve
fork(), kill() et wait() ... [ par LocalStone ]
Salut à tous, Alors voilà, je suis face à un problème qui me prend la tête depuis au moins une heure, mais je ne trouve vraiment pas de solution ni d
Communication Intra Executable (signal / kill) [ par Nitrakz ]
Bonjour, Dans le cadre d'un projet genre "chat", je doit faire communiquer 2 threads entre eux a l'aide de: signal() en réception kill() en envoyeur
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|