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

C Discussion :

[débutant] Communication inter-processus


Sujet :

C

  1. #1
    Nouveau membre du Club Avatar de tooney
    Inscrit en
    Avril 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 54
    Points : 29
    Points
    29
    Par défaut [débutant] Communication inter-processus
    Bonjour à tous!!!

    Je m'initie à la communication inter-processus, et par là-même je découvre le C (quel beau langage!!!)

    Bon voilà mon petit problème, je tourne en rond depuis ce matin :
    Je crée 3 tubes (tube[3][2]) à l'aide de la fonction pipe : pipe(tube[i]) (avec i entre 0 et 2)
    Ensuite je crée trois processus fils. Le père envoie 0 au 1er processus, 1 au 2ème et 2 au 3ème.
    Quand je code tout dans le main, pas de problème ça fonctionne.
    Mais pour éviter les lignes redondantes, j'ai voulu faire une fonction lecture(int n); (avec n entre 0 et 2), et là ça ne marche plus!!!

    Voici mon code :


    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
     
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
     
    int tube[3][2];
     
     
    void lecture(int n)
    {
    	char buf[6];
     
    	printf("%d-1\n",n);
    	close(tube[n][1]);
    	printf("%d-2\n",n);
    	read(tube[n][0], &buf, 6*sizeof(char));
    	printf("%d-3\n",n);
    	printf("buffer fils %d : %s\n",n ,buf);
    }
     
     
    int main(void)
    {
    	int i;
    	pid_t pid[3];
     
    	/* Initialisation des tubes */
    	pipe(tube[0]);
    	pipe(tube[1]);
    	pipe(tube[2]);
     
     
    	if(fork() == 0)
    	{
    		/* Nous sommes dans le fils 0 */
    		lecture(0);
    		exit(0);
    	}
    	else
    	{
    		/* Nous sommes dans le père */
    		char buffer[6];
    		close(tube[0][0]);
    		sprintf(buffer,"%d",0);
    		printf("buffer père 0 : %s\n", buffer);
    		write(tube[0][1], &buffer, 6*sizeof(char));
    		wait();
    	}
     
    	if(fork() == 0)
    	{
    		/* Nous sommes dans le fils 1 */
    		lecture(1);
    		exit(0);
    	}
    	else
    	{
    		/* Nous sommes dans le père */
    		char buffer[6];
    		close(tube[1][0]);
    		sprintf(buffer,"%d",1);
    		printf("buffer père 1 : %s\n", buffer);
    		write(tube[1][1],&buffer,6*sizeof(char));
    		wait();
    	}
     
    	if(fork() == 0)
    	{
    		/* Nous sommes dans le fils 2 */
    		lecture(2);
    		exit(0);
    	}
    	else
    	{
    		/* Nous sommes dans le père */
    		char buffer[6];
    		close(tube[2][0]);
    		sprintf(buffer,"%d",2);
    		printf("buffer père 2 : %s\n", buffer);
    		write(tube[2][1],&buffer,6*sizeof(char));
    		wait();
    	}
    }
    Vraiment je n'y comprends rien... Le fils 0 reçoit bien mon caractère, mais les deux autres ne dépassent pas le [b]read(...)[\b].

    Quelqu'un peut-il m'aider???

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Sinon en communication inter-processus tu peux regarder du cote (sous Linux bien sur) des sockets UPD, des segment de memoire partagées, des signaux ou des semaphores

  3. #3
    Nouveau membre du Club Avatar de tooney
    Inscrit en
    Avril 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Merci du conseil, effectivement les shm seraient peut-être plus faciles d'utilisation, mais en fait je dois impérativement utiliser des tubes (il s'agit d'un projet, et l'utilisation de tubes est imposée...)

    Donc si quelqu'un voit une explication...

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    ALors plusieurs choses moi je ferai plutot
    int tube[2*num]; // avec num nombre de fils qu'on veut
    int tube2[2];

    apres un petit for pour faire num tube
    en gros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (i=0, j=0; i<num; i++)
    	{
    		if (pipe(tube2)==-1) { perror("pipe"); exit(errno); }
    		tube[j]=tube2[0];
    		j++;
    		tube[j]=tube2[1];
    		j++;
    	}
    ensuite encore un for pour creer tes fils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for(i=0; i < num; i++) {
    		switch(fork()) {
    			case -1 : perror("fork"); exit(errno);
    			case 0: // le fils
    		}
    	}
     
    // tu fermes les descripteurs qu'il faut pour le pere
    // tu met le code du pere ici

Discussions similaires

  1. Communication Inter Processus
    Par pittacos dans le forum Windows
    Réponses: 3
    Dernier message: 29/07/2008, 09h50
  2. Communication inter-processus et pause()
    Par jsebfranck dans le forum POSIX
    Réponses: 10
    Dernier message: 14/02/2008, 14h52
  3. [windows] Communication inter-processus
    Par litbos dans le forum Windows
    Réponses: 6
    Dernier message: 16/01/2007, 09h13
  4. [Perl] communication Inter-Processus
    Par MarneusCalgarXP dans le forum Langage
    Réponses: 15
    Dernier message: 14/08/2006, 22h43
  5. communication inter-processus
    Par benoit70 dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 09h55

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