Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2012
    Messages : 62
    Points : 46
    Points
    46

    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 :
    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 émérite
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 858
    Points
    858

    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2012
    Messages : 62
    Points : 46
    Points
    46

    Par défaut

    Merci Kirilenko !

    Bonne soirée et merci encore.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •