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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    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 chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    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 très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    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 chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    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 ...

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    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()?

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    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()

  8. #8
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    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.

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