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 :

Communiquer entre processus avec des pipe


Sujet :

Linux

  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 Communiquer entre processus avec des pipe
    Bonjour,

    Je souhaite réaliser un programme pour m'entrainer à créer des anneaux avant de passer à la programmation socket. Mon objectif : faire passer un entier qui s'incrémente sur chaque fils grâce à un jeton. Je dois créer une topologie virtuelle avec des fork() et faire circuler un jeton qui contient un entier qui s'incrémente en passant dans chaque processus.

    J'ai besoin de votre aide au niveau algorithmique. En effet j'y ai réfléchi ce soir et je ne voit pas comment faire pour mettre en attente un processus qui doit en attendre un autre. C'est mon premier problème. Mon second est le suivant : qu'elle sera l'identifiant unique de chaque processus ? Comment les récupérer en C ?

    Voilà si vous pouvez me guider un peu car je sais pas trop comment m'y prendre.

    Bonne soirée

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    ceci va surement t aider à comprendre et à réaliser ce que tu veux faire

    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
    #include <stdio.h>
    #include <memory.h>
    #include <unistd.h>
     
    int main(int argc, char **argv)
    {
    	/* Création du pipe */
    	int pfd[2];
    	int pfd_2[2];
     
    	if(pipe(pfd) == -1)
    	{
    		printf("pipe failed\n");
    		return 1;
    	}
     
    	if(pipe(pfd_2) == -1)
    	{
    		printf("pipe failed\n");
    		return 1;
    	}
     
    	/* Création du processus fils */
    	int pid;
    	if( (pid = fork()) < 0 )
    	{
    		printf("fork failed\n");
    		return 2;
    	}
     
    	if (pid == 0)
    	{
    		/* processus enfant */
    		char buffer[BUFSIZ];
     
    		close(pfd[1]); /* Fermeture du coté ecriture de pfd */
    		close(pfd_2[0]); /* Fermeture du coté lecture de pfd_2 */
     
    		/* Lecture des données envoyées par le pere */
    		while(read(pfd[0], buffer, BUFSIZ) != 0)
    			printf("child reads %s", buffer);
     
    		close(pfd[1]); /* close the pipe */
     
    		/* Envoi de l'accusé de reception */
    		strcpy(buffer, "OK, reçu 5 sur 5\n");
    		write(pfd_2[1], buffer, strlen(buffer) + 1);
     
    		/* Fermeture du pipe */
    		close(pfd_2[1]);
    	}
    	else
    	{
    		/* Processus pere */
    		char buffer[BUFSIZ];
     
    		close(pfd[0]); /* Fermeture du coté lecture de pfd */
    		close(pfd_2[1]); /* Fremeture du coté ecriture de pfd_2 */
     
    		/* Envoi de données vers le processus Fils */
    		strcpy(buffer, "Salut Filston!\n");
    		write(pfd[1], buffer, strlen(buffer) + 1);
     
    		/* Fermeture du coté ecriture */
    		close(pfd[1]);
     
    		/* Reception de l'acusé */
    		while(read(pfd_2[0], buffer, BUFSIZ) != 0)
    			printf("father reads %s", buffer);
     
    		/* Fermeture du coté lecture */
    		close(pfd_2[0]);
    	}
    	return 0;
    }

  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
    Merci de ton aide ashin. Mais en fait j'ai déjà plusieurs programme avec un père et un fils mais pour moi la complexité réside dans le fait d'avoir plusieurs fils et un père...

    Pas besoin de me donné du code à la limite je me contenterais d'une explication.

    J'ai quand même lu ton code et j'ai plusieurs questions :
    - Pourquoi ajouter memory.h ? J'ai jamais utiliser cette bibliothèque pour strcpy ?
    - A quoi sert le while quand il lise ?

    Merci encore

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par akrogames Voir le message
    J'ai quand même lu ton code et j'ai plusieurs questions :
    - Pourquoi ajouter memory.h ? J'ai jamais utiliser cette bibliothèque pour strcpy ?
    C'est une aberration, il faut inclure string.h et non memory.h.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Ce code ne vient pas de moi, je l'ai trouvé il fonctionne et c était un bon exemple.

    par contre quel est ton problème, chaque fils à un identifiant différent retourné par getpid()

  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
    En fait je voulais créer un anneaux virtuelle avec des processus etfaire transmettre un entier à l'aide d'un jeton sur l'anneaux. Chaque fils correspond à une machine virtuelle quand le jeton arrive sur la machine l'entier s'incrémente.

    Voilà mais point de vue algorithmique je ne sais pas trop quoi faire.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    C'est une aberration, il faut inclure string.h et non memory.h.
    effectivement memory.h n'a rien a faire ici ... tout comme string.h ...

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Ashin Voir le message
    effectivement memory.h n'a rien a faire ici ... tout comme string.h ...
    Ah? et comment tu gères l'appel à strcpy()?

  9. #9
    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
    Perso j'utilise string.h

    Vous pouvez m'aider alors au niveau algorithmique ou pas ?

    Bonne journée

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    gcc fournit strcpy vu qu'il en a besoin pour son usage perso

    mais effectivement sinon string.h ou memory.h est utile



    Niveau algo, il faudrai que tu détailles ton anneau virtuel (genre un petit dessin). je suppose que tu ne vas pas avoir besoin de faire 50 forks

  11. #11
    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
    Alors voilà ce que je souhaite faire :

    Pere > Fils1 > Fils2 > Fils3> Fils4 > Fils5 > Fils1 > Fils2 etc...

    Jusqu'à ce que le jeton qui transite sur l'anneau qui contient l'entier atteigne 50. Il s'incrèmente sur chaque Fils de +1. Vous comprenez ?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    moi je ferais comme ça, par contre coté CPU je sais pas ce que ça donne

    tu créés autant de tubes que besoin (a priori 5)
    tu créés tes fils et sauvegarde le pid de chacun

    ensuite un switch/case selon le pid
    dans le switch, chacun se met en attente bloquante de lecture sur le pipe correspondant puis envoie le jeton sur le pipe correspondant ... (bien sur il faut que le premier envoie le jeton avant d'attendre )

    puis tu sors quand le jeton atteint 50

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Finalement je l'ai fait, ça me tentais

    donc c est bien

    creation des pipes
    création de tes fils (tu ne conserves pas les différents pères) et récupération des pid
    affectation des différents pipes d'écriture et de lecture à tes fils

    ensuite lecture et écriture dans une boucle avec sortie quand le jeton est à 50

  14. #14
    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
    Ok je vais essayer de le faire aussi ce soir si je n'y arrive pas tu pourras m'aider comme sa.

    A toute

  15. #15
    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
    Re bonsoir,

    Donc voilà j'ai créer mes processus ainsi :

    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
    99
    100
    101
    102
    103
     
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <stdlib.h>
     
    #define lire 0
    #define ecrire 1
     
    int main(int argc,char **argv)
    {
    	//Gestion des clients
    	int pid[5]; //Liste des clients fils
    	int f1;
    	int f2;
    	int f3;
     
    	//Gestion des tubes
    	int f1f2[2];
    	int f2f3[2];
    	int f3f4[2];
    	int f4f5[2];
    	int f5f1[2];
     
    	//Creation des differents tubes
    	if(pipe(f1f2) == -1)
    	{
    		printf("ERREUR : INITIALISATION IMPOSSIBLE DU TUBE ENTRE FILS 1 et FILS 2\n");
    		return 1;
    	}
    	if(pipe(f2f3) == -1)
    	{
    		printf("ERREUR : INITIALISATION IMPOSSIBLE DU TUBE ENTRE FILS 2 et FILS 3\n");
    		return 1;
    	}
    	if(pipe(f3f4) == -1)
    	{
    		printf("ERREUR : INITIALISATION IMPOSSIBLE DU TUBE ENTRE FILS 3 et FILS 4\n");
    		return 1;
    	}
    	if(pipe(f4f5) == -1)
    	{
    		printf("ERREUR : INITIALISATION IMPOSSIBLE DU TUBE ENTRE FILS 4 et FILS 5\n");
    		return 1;
    	}
    	if(pipe(f5f1) == -1)
    	{
    		printf("ERREUR : INITIALISATION IMPOSSIBLE DU TUBE ENTRE FILS 5 et FILS 1\n");
    		return 1;
    	}
     
     
    	//FILS 1
    	if((f1 = fork()) < 0 )
    	{
    		printf("ERREUR : CREATION IMPOSSIBLE DU FILS 1\n");
    		return 1;
    	}
     
    	if(f1 == 0)
    	{
    		pid[0] = getpid();
    		printf("FILS 1 CREER AVEC LE NUMERO : %d \n",pid[0]);
     
    			//FILS 2
    			if((f2 = fork()) < 0 )
    			{
    				printf("ERREUR : CREATION IMPOSSIBLE DU FILS 2\n");
    				return 1;
    			}
     
    			if(f2 == 0)
    			{
    				pid[1] = getpid();
    				printf("FILS 2 CREER AVEC LE NUMERO : %d  \n",pid[1]);
     
    				//FILS 3
    				if((f3 = fork()) < 0 )
    				{
    					printf("ERREUR : CREATION IMPOSSIBLE DU FILS 2\n");
    					return 1;
    				}
     
    				if(f3 == 0)
    				{
    					pid[2] = getpid();
    					printf("FILS 3 CREER AVEC LE NUMERO : %d  \n",pid[1]);
    					//Liste des processus actif :
    					printf("Liste des processus du programme : %d || %d || %d \n\n",pid[0],pid[1],pid[2]);
    					wait(NULL);
    				}
     
    				wait(NULL);
    			}	
     
    		wait(NULL);
    	}
     
    	exit(0);
     
     
     
    }
    Mais cela ne marche pas car il me donne pas les même processus dans le tableau...


    Si tu peux m'orienter un peu..

    Bonne soirée

Discussions similaires

  1. [Débutant] colonnes liées entre elles avec des requetes
    Par spring.time dans le forum VB.NET
    Réponses: 1
    Dernier message: 13/09/2012, 14h03
  2. [XL-2007] ALEA.ENTRE.BORNE() avec des mots en résultats : Est ce possible ?
    Par kenycolasdu43 dans le forum Excel
    Réponses: 2
    Dernier message: 31/03/2011, 14h22
  3. Communication inter processus avec des sockets
    Par kek's dans le forum Réseau
    Réponses: 4
    Dernier message: 17/01/2011, 11h43
  4. Traitement de chaine avec des pipes
    Par ag_77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/10/2007, 11h37
  5. communication entre jsp avec des liens
    Par opensource dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 09/05/2007, 14h54

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