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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 !

  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