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

Linux Discussion :

Probleme de comunication pere fils


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Novembre 2007
    Messages : 74
    Points : 33
    Points
    33
    Par défaut Probleme de comunication pere fils
    bonjour
    mon probleme est le suivant ,je dois creer une communication entre un processus pere et k processus fils le pere doit communiquer avec chaque fils par un tube séparé mon code est le suivant
    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
     
    int tab[k][2] ;
    for(i=0 ;i<k ;i++){ 
                    pipe(tab[i]);
    		pid=fork();
    	  		if (pid==0){
                            close(tab[i][1]);
                            for(j=0;j<k;j++){
    				if (j!=i){
    				close(tab[j][0]);
    				}
    			}
    }
    else {
    			close(tab[i][0]);
     
    		       }}
    char comp[256]; 
             int w=5;              
    	sprintf(comp,"%d",w);
    	write(tab[2][1],comp,strlen(comp)+1);
    j ai pris au pif le tube 2 pour ecricre la valeur 5 qaund j essais de faire marcher la programme il tourne dans le vide meme si la compilation s est bien passé

    alors que quand j evite de fermer tab[i][0] au niveau du pere ca marche
    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
     
    int tab[k][2] ;
    for(i=0 ;i<k ;i++){ 
                    pipe(tab[i]);
    		pid=fork();
    	  		if (pid==0){
                            close(tab[i][1]);
                            for(j=0;j<k;j++){
    				if (j!=i){
    				close(tab[j][0]);
    				}
    			}
    }
    else {
    			//close(tab[i][0]);
     
    		       }}
    char comp[256]; 
             int w=5;              
    	sprintf(comp,"%d",w);
    	write(tab[2][1],comp,strlen(comp)+1);
    le probleme c est que je crois que les pipes ne sont pas bien branché avec les fils
    et que quand ca plante c est que pq le au niveau de l ecriture dans le tube il ne voit que la sortie du pere sans voir celles des fils
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flash_Over Voir le message
    bonjour
    mon probleme est le suivant ,je dois creer une communication entre un processus pere et k processus fils le pere doit communiquer avec chaque fils par un tube séparé mon code est le suivant
    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
     
    int tab[k][2] ;
    for(i=0 ;i<k ;i++){ 
                    pipe(tab[i]);
    		pid=fork();
    	  		if (pid==0){
                            close(tab[i][1]);
                            for(j=0;j<k;j++){
    				if (j!=i){
    				close(tab[j][0]);
    				}
    			}
    }
    else {
    			close(tab[i][0]);
     
    		       }}
    char comp[256]; 
             int w=5;              
    	sprintf(comp,"%d",w);
    	write(tab[2][1],comp,strlen(comp)+1);
    j ai pris au pif le tube 2 pour ecricre la valeur 5 qaund j essais de faire marcher la programme il tourne dans le vide meme si la compilation s est bien passé

    alors que quand j evite de fermer tab[i][0] au niveau du pere ca marche
    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
     
    int tab[k][2] ;
    for(i=0 ;i<k ;i++){ 
                    pipe(tab[i]);
    		pid=fork();
    	  		if (pid==0){
                            close(tab[i][1]);
                            for(j=0;j<k;j++){
    				if (j!=i){
    				close(tab[j][0]);
    				}
    			}
    }
    else {
    			//close(tab[i][0]);
     
    		       }}
    char comp[256]; 
             int w=5;              
    	sprintf(comp,"%d",w);
    	write(tab[2][1],comp,strlen(comp)+1);
    le probleme c est que je crois que les pipes ne sont pas bien branché avec les fils
    et que quand ca plante c est que pq le au niveau de l ecriture dans le tube il ne voit que la sortie du pere sans voir celles des fils
    Merci
    Le problème de tes boucles imbriquées (je crée un pipe et en même temps je crée un fils) c'est que le fils lui, va fermer tous les pipe (même ceux qui n'ont pas encore été créés avec le "for (j=0; j < k; j++)").
    Donc tu passes à close() des variables non initialisées => comportement indéterminé.

    Faut faire ça en 2 étapes
    1) je crée tous les pipe
    2) je crée tous les fils

    Puis chaque fils ferme tous les cotés "lecteur" et tous les cotés écrivains (sauf le sien) tandis que le père ferme le coté écrivain du fils créé et lit le fils

    PS: si tu pouvais te forcer à donner des noms significatifs à tes variables ("tab" ???) ben ce serait pas mal. Et si, au lieu d'utiliser un tableau 2D tu utilisais un tableau de structures où chaque structure va gérer un pipe, ça gagnerait encore plus en clarté. Surtout que tu peux y ajouter d'autres trucs à l'intérieur comme par exemple le pid du fils (ce qui pourra être utile plus tard)...

    Bon, un truc tapé vite fait mais qui devrait fonctionner
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    typedef struct {
        int tube[2];
        int pid;
    } t_fils;
     
    t_fils tab[k];
     
    for (i=0; i < k; i++)
        pipe(tab[i].tube);
     
    for (i=0; i < k; i++)
    {
        tab[i].pid=fork();
        if (tab[i].pid == 0)
        {
             // Fils
             // Fermeture de tous les lecteurs et tous les écrivains sauf lui
             for (j=0; j < k; j++)
             {
                 close(tab[j].tube[0]);
                 if (j != i)
                     close(tab[j].tube[1]);
             }
     
             // Ecriture
             sprintf(comp, "%d", 5);
             write(tab[i].tube[1], comp, strlen(comp + 1));
        }
        else
        {
             // Pere
             // Fermeture de l'écrivain
             close(tab[i].tube[1]);
     
             // Lecture et affichage
             read(tab[i].tube[0], comp, sizeof comp);
             printf("Fils %d (pid=%d) - Lu %s\n", i + 1, tab[i].pid, comp);
        }
    }

Discussions similaires

  1. [AC-2003] Probleme actualisation Champs pere-fils formulaires
    Par paytom dans le forum IHM
    Réponses: 4
    Dernier message: 25/04/2013, 01h15
  2. Probleme de pipe et de process pere-fils sous Windows
    Par Ipone dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 14/04/2010, 12h52
  3. [SQL server 2005] Problème de tris avec notion Père-Fils
    Par pedrover dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/12/2006, 16h43
  4. pere/fils
    Par innosang dans le forum C
    Réponses: 10
    Dernier message: 15/03/2006, 20h58
  5. modeliser relation pere fil
    Par flawer dans le forum Débuter
    Réponses: 20
    Dernier message: 12/12/2005, 11h59

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