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

Réseau C Discussion :

Utilisation des fork et des pipes


Sujet :

Réseau C

  1. #1
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut Utilisation des fork et des pipes
    Bonjour à tous j'essaye de faire circuler un entier sur un anneau à 5 noeuds. Le premier fils
    l'initialise, il s'incrémente sur chaque site. lorsque le fils 1 reçoit
    un jeton dont la valeur est supérieure à 50 il gère la terminaison de
    ses frères et du père.
    Le problème c'est que là il me fait n'importe quoi et je ne sais pas très bien pourquoi ? Une petite aide serait la bienvenue.


    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
     
    #define lire 0
    #define ecrire 1
     
    int i;
    int nbClient;
    int status;
     
    int main(int argc, char **argv)
    {
     
    //Initialisation des variables
    nbClient = atoi(argv[1]);
    int tube[nbClient][2];
    int pid[nbClient];
     
     
    //Creation des tubes
    for(i=0;i<nbClient;i++)
    {
    	pipe(tube[i]);
    }
     
     
    //Creation des processus
    for(i=0;i<nbClient;i++)
    {
     
    	switch(fork())
    	{
    	case 0:
    		pid[i] = getpid();
    		close(tube[i][lire]);
    		close(tube[((i-1)%nbClient)][ecrire]);
    		int jeton;
     
    		if(i==0)
    		{
    			jeton=0;
    			printf("Client Numero : %d(%d) => Envoie du jeton : %d\n",i+1,getpid(),jeton);
    			write(tube[i][ecrire],&jeton,sizeof(jeton));
    		}
     
    		do
    		{
    			read(tube[((i-1)%nbClient)][lire],&jeton,sizeof(jeton));
    			//printf("Processus: %d => Lecture du jeton : %d\n",getpid(),jeton);
    			//printf("Client Numero : %d => PID : %d\n",i+1,pid[i]);
     
    			if(jeton < 10)
    			{
     
    				jeton++;
    				printf("Processus: %d => Envoie du jeton : %d\n",getpid(),jeton);
    				write(tube[i][ecrire],&jeton,sizeof(jeton));
    			}
    			else
    			{
     
    			}
     
    		} while(jeton < 10);
     
    			close(tube[((i-1)%nbClient)][lire]);
    			write(tube[((i-1)%nbClient)][ecrire],&jeton,sizeof(jeton));
     
    		close(tube[i][ecrire]);
    		close(tube[((i-1)%nbClient)][lire]);
     
    		exit(i);
    		break;
     
    	case -1:
    		printf("Probleme dans la creation du processus\n");
    		exit(EXIT_FAILURE);
     
    	/*default:
    		printf("");*/
    	}
    }
     
    //Attente des processus
    for(i=0;i<nbClient;i++)
    {
    	wait(&status);
    	//printf("Mise en attente du processus : %d\n",&status);
    }
     
     
     
    return EXIT_SUCCESS;
     
    }
    Bonne soirée

  2. #2
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 101
    Points
    101
    Par défaut
    Salut,

    Je te conseille de revoir ton algo.

    Déjà le jeton n'atteindra jamais 50 puisqu'il est incrémenter si il est <10.

    Ton code fait que chaque fils écrit 10 fois le jeton. Rien à voir avec ton énoncé.

    Bon travail

    Fred

  3. #3
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Bah avant de mettre 50 j'ai mis 10 c'est pour sa

    Sinon oui en effet cela affiche pour chaque processus 10 fois...
    Mais comment faire alors ? C'est cela la question...

    Un petit coup de pouce serait le bienvenue...

    Bonne journée

  4. #4
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 101
    Points
    101
    Par défaut
    Dans ton switch case 0: tu fait ta boucle do while. Elle est faite pour chaque processus fils. Donc chaque fils affiche 10*.

    Mais en fait à quoi te sert cette boucle?

    Pour moi l'algo de base serait:

    1) créer les tubes:
    tube0 fils 0 vers 1
    tube1 fils 1 vers 2
    tube2 fils 2 vers 3
    tube3 fils 3 vers 4
    tube4 fils 4 vers 0

    2) créer les fils.
    le père fork 5 * et attend.

    3) Travail des fils:
    3.1)si on est le premier fils. Ecrire jeton dans tube 0 puis attendre sur lecture tube 4: si jeton = 50 arret sinon incrémenter jeton et le mettre dans tube 0.
    3.2) Si on est un autre fils: attendre sur lecture puis incrémenter jeton et écrire

    Fred

  5. #5
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 101
    Points
    101
    Par défaut
    Une solution rapide et pas optimale à ton problème... Je culpabilise un peu de faire tes exercices mais bon...

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
     
    #define lire 0
    #define ecrire 1
    #define Nbclient 5
     
    int tube[Nbclient][2];
     
    void premierfils(void){
     
        close (tube[0][lire]);
        close (tube [Nbclient-1][ecrire]);
     
        int jeton = 0;
     
        while (jeton <50){
            write (tube[0][ecrire],&jeton,sizeof(int));
            printf ("Ecriture de fils 0 jeton %d \n",jeton);
            read (tube[Nbclient-1][lire],&jeton,sizeof(int));
            jeton++;
        }
        jeton = -1;
        write (tube[0][ecrire],&jeton,sizeof(int));
        exit(EXIT_SUCCESS);
     
    }
     
    void autrefils(int numero){
     
        close (tube[numero][lire]);
        close (tube[numero-1][ecrire]);
     
        int jeton = 0;
     
        while (jeton != -1){
            read (tube[numero-1][lire],&jeton,sizeof(int));
            write (tube[numero][ecrire],&jeton,sizeof(int));
            printf ("Ecriture de fils %d jeton %d \n",numero,jeton);
        }
     
        exit(EXIT_SUCCESS);
     
    }
     
     
    int main (int argc, char * argv[]){
     
    int pid;
     
    // creation des tubes
     
    int i;
     
    for (i=0;i<Nbclient;i++) pipe(tube[i]);
     
    for (i=0;i<Nbclient;i++){
     
        pid = fork();
     
        if (pid==0){
     
            if (i==0) {premierfils();} else {autrefils(i);}
     
        }
    }
     
    for (i=0;i<Nbclient;i++) wait(0);
     
    exit(0);
     
    }

  6. #6
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Coucou Merci de votre aide.

    J'ai tester ton programme fredremy68 mais le problème c'est que le jeton s'incrèmente pas sur chaque fils... Tu vois ce que je veux dire ?
    Il s'incrémente à chaque tour.

    Cela dit je vais prendre exemple sur ton code car il est pas mal. Oh tu sais je suis pas très fort en C alors ne culpabilise pas trop

  7. #7
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 101
    Points
    101
    Par défaut
    A d'accord, je le modifie pour avoir un incrément à chaque fils, essaye quand même de le comprendre..

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <string.h>
     
    #define lire 0
    #define ecrire 1
    #define Nbclient 5
     
    int tube[Nbclient][2];
     
    void premierfils(void){
     
        close (tube[0][lire]);
        close (tube [Nbclient-1][ecrire]);
     
        int jeton = 0;
     
        while (jeton <50){
            write (tube[0][ecrire],&jeton,sizeof(int));
            printf ("Ecriture de fils 0 jeton %d \n",jeton);
            read (tube[Nbclient-1][lire],&jeton,sizeof(int));
            jeton++;
        }
        jeton = -1;
        write (tube[0][ecrire],&jeton,sizeof(int));
        exit(EXIT_SUCCESS);
     
    }
     
    void autrefils(int numero){
     
        close (tube[numero][lire]);
        close (tube[numero-1][ecrire]);
     
        int jeton = 0;
     
        while (jeton != -1){
            read (tube[numero-1][lire],&jeton,sizeof(int));
            jeton++; // incremente a chaque fils
            write (tube[numero][ecrire],&jeton,sizeof(int));
            printf ("Ecriture de fils %d jeton %d \n",numero,jeton);
        }
     
        exit(EXIT_SUCCESS);
     
    }
     
     
    int main (int argc, char * argv[]){
     
    int pid;
     
    // creation des tubes
     
    int i;
     
    for (i=0;i<Nbclient;i++) pipe(tube[i]);
     
    for (i=0;i<Nbclient;i++){
     
        pid = fork();
     
        if (pid==0){
     
            if (i==0) {premierfils();} else {autrefils(i);}
     
        }
    }
     
    for (i=0;i<Nbclient;i++) wait(0);
     
    exit(0);
     
    }

  8. #8
    Membre actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Points : 228
    Points
    228
    Par défaut
    Coucou !

    Encore merci de m'avoir m'aidé mais je n'arrive pas à comprendre quelque chose...
    A la fin de l'exécution du programme il se s'arrête pas normalement. J'ai pourtant essayé de l'arrêter en mettant des closes et des exit un peu partout...

    Mais rien y fait ? Une idée ?

Discussions similaires

  1. Utiliser JOGL + shader pour des effets sur des images 2D.
    Par nouknouk dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 19/12/2007, 10h46
  2. Réponses: 3
    Dernier message: 23/01/2007, 08h14
  3. Utilisation du Enable avec des combobox ou des listbox
    Par legos dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 19/09/2006, 22h35
  4. Utilisation de tubes dans des fork
    Par je®ome dans le forum Linux
    Réponses: 4
    Dernier message: 31/05/2006, 21h50
  5. Réponses: 2
    Dernier message: 27/04/2006, 16h45

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