IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

Synchroniser plusieurs processus avec SIGUSR1/SIGUSR2


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Synchroniser plusieurs processus avec SIGUSR1/SIGUSR2
    Bonjour,

    j'ai un programme principal qui crée deux fils, puis execute calcul_1 et calcul_2. Je veux faire en sorte que les 3 processus aient fini leur calcul_1 avant que l'un d'eux ne commence le calcul_2.
    En gros je veux faire une barrière de synchronisation avec les signaux SIGUSR.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include <signal.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv){
    	int i = 0;
    	pid_t pid_fils[2];
    	struct sigaction act;
     
    	while ((i<2) && (pid_fils[i] = fork()) != 0))
    		i++;
     
    	calcul_1();
    	calcul_2();
     
    	printf("fin processus %d \n", i);
     
    	return EXIT_SUCCESS;
    }

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et la question est ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    La question est comment mettre en place une barrière de synchro à l'aide de SIGUSR1/SIGUSR2.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Points : 122
    Points
    122
    Par défaut
    utiliser SIGUSR1/SIGUSR2 pour ca me paraît compliqué, surtout si en fait ton exemple n'est qu'un code pour vérifier ce qui est possible et qu'en conséquence tu augmente le nombre de processus, etc.
    Voici une liste d'IPC : http://en.wikipedia.org/wiki/Interprocess_communication.

    Si tes processus ne sont pas sensés migrer, travaille sur de la mémoire partagée (ce qui te permettra également de faire circuler les résultats des calculs entre process) ; auquel cas voici des liens :
    http://www.opengroup.org/onlinepubs/.../shm_open.html

    (pour le C++ et portable : http://www.boost.org/doc/libs/1_36_0...erprocess.html)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Points : 122
    Points
    122
    Par défaut précisions
    au cas où la réponse n'aurait pas été comprise, il faut ensuite utiliser des mutex (ou semaphores) pour synchroniser ces processus.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lemmel Voir le message
    utiliser SIGUSR1/SIGUSR2 pour ca me paraît compliqué,
    Citation Envoyé par lemmel Voir le message
    au cas où la réponse n'aurait pas été comprise, il faut ensuite utiliser des mutex (ou semaphores) pour synchroniser ces processus.
    Autant je suis d'accord avec la mémoire partagée sur une seule machine autnt une solution "simple" me semble effectivement plus basée sur les signaux que les mutex + le reste de ce que tu dis

    Citation Envoyé par micaz Voir le message
    La question est comment mettre en place une barrière de synchro à l'aide de SIGUSR1/SIGUSR2.


    Simplement en mettant une callback sur la réception de SIGUSR1 et faire appeler calcul2 après la mise d'un drapeau dans cette callback..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Points : 122
    Points
    122
    Par défaut
    une solution "simple" me semble effectivement plus basée sur les signaux
    Le hic c'est que son problème n'a pas été présenté de manière détaillé, et je suppose que cette histoire de signaux ne sera que le début de ses problèmes ; dans le cas des signaux il veut que tous les processus attendent que tous soient arrivés au même point (juste avant le calcul_2). À coup de signaux, une solution serait :

    - les fils une fois arrivé au calcul_2 (mais avant de le faire) envoit un SIGUSR à leur père
    - le père comptabilise les signaux reçus
    - une fois le nombre de signaux reçus étant égales au nombre de fils, il envoit un SIGUSR à tous ses fils

    très sincèrement le mutex/semaphore est fait pour ce type de synchro, et surtout permet beaucoup plus de souplesse (si les processus doivent être synchro sur le calcul_2, c'est très probablement qu'il va y avoir une mise en commun des résultats précédents[1]) ; peut-être est-ce du à l'habitude, mais les mutex/sémaphore me paraissent être plus simple dans ce cas et plus adaptés.


    [1] alors il risque d'y avoir une bidouille, dans le genre enregistrement des résultats dans un fichier, et relecture par les fils, etc

Discussions similaires

  1. Synchronisation de processus avec semaphores
    Par kaso54 dans le forum POSIX
    Réponses: 7
    Dernier message: 26/11/2008, 11h14
  2. Lancement de processus avec priorité
    Par GMI3 dans le forum Administration système
    Réponses: 2
    Dernier message: 14/06/2004, 16h43
  3. [ Struts ] plusieurs conditions avec equal?
    Par njac dans le forum Struts 1
    Réponses: 7
    Dernier message: 04/06/2004, 09h04
  4. Combiner plusieurs textures avec couches alpha
    Par TibobiT dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2004, 15h20
  5. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo