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 :

Communication par tubes


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut Communication par tubes
    Bonjour à tous,

    je tente de faire un programme qui crée deux fils. Le premier fils demanderait 2 nombres à l'utilisateur puis le second fils calculerait R = n1 * n2.


    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
    int tube[2];  //Les consignes m'obligent à déclarer en global...
    int tube2[2];
     
    void fctfils1(void)
    {
    	int nombre[2];
    	printf("Insérez le premier nombre:");
    	scanf("%d",&nombre[0]);
    	printf("Insérez le deuxième nombre:");
    	scanf("%d",&nombre[1]);
    	close(tube[0]); 	                               
    	write(tube[1],nombre,sizeof(nombre));          
    	exit(0);
    }
     
    void fctfils2(void)
    {
    	int receptionNb[2];                  
    	close(tube[1]);                         			 
    	read(tube[0],receptionNb,sizeof(receptionNb));
    	printf("le fils recoit: %d et %d\n", receptionNb[0], receptionNb[1]);
    	int multi = receptionNb[0] * receptionNb[1];
     
    	close(tube2[0]);
    	write(tube2[1],multi,sizeof(multi));
    	exit(0);
    }
     
     
    void fctpere(void)
    {
    	int multi;                  
    	close(tube2[1]);                         	
    	read(tube2[0],multi,sizeof(multi));
    	printf("le père recoit: %d\n", multi); 				
    	wait(0);
    	wait(0);
    	exit(0);
    }
     
    int main (int argc, char * argv[])
    {
     
        if (((pipe(tube))<0) | ((pipe(tube2))<0)) exit(1);	
     
        pid_t pid = 1;
     
    	if ((pid = fork()) < 0) exit(1);					
    	if (pid == 0) fctfils1();				
     
    	else{
    		if ((pid = fork()) < 0) exit(1);				
    		if (pid == 0) fctfils2();
    		else fctpere();		
    		}
     
    }
    J'obtiens un résultat extravagant...

    Voici mes erreurs :

    • tube.c:34: warning: passing arg 2 of `write' makes pointer from integer without a cast
    • tube.c:43: warning: passing arg 2 of `read' makes pointer from integer without a cast


    Aussi je ne parviens pas à utiliser un type double pour ma variable multi sans provoquer les erreurs:
    • tube.c:32: error: incompatible type for argument 2 of `write'
    • tube.c:41: error: incompatible type for argument 2 of `read'


    Un immense merci pour votre aide...

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    Les fonctions read et write attendent toutes deux des (const) void *, c'est-à-dire des pointeurs sur tes données. En passant &multi et &nombre, par exemple, à tes fonctions, cela fonctionne correctement.

    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut
    Merci Kirilenko !

    Bonne soirée et merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Communication par tube
    Par Laurent4033 dans le forum C
    Réponses: 2
    Dernier message: 27/11/2012, 09h25
  2. Réponses: 0
    Dernier message: 30/10/2012, 21h34
  3. Communication inter-processus par tubes nommés
    Par arkham55 dans le forum Shell et commandes POSIX
    Réponses: 3
    Dernier message: 05/05/2012, 19h12
  4. Réponses: 4
    Dernier message: 28/10/2011, 14h42
  5. Réponses: 3
    Dernier message: 19/10/2011, 15h52

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