Bonjour,
Je dois actuellement codé un petit programma a priori simple sous linux.
Il s'agit de faire un programme client serveur avec le client qui
envoit 2 entier et le serveur qui fait la somme et renvoi le résultat.
Biensur le client affiche le résultat donnée par le serveur.
Je précise que j'ai pour obligation d'utiliser les tubes.
Mon problème est je pense plus au niveau de la compréhension des systemes de pipes.
Au départ mon programme a donné ca :
[code]
clude <unistd.h>
#include <fcntl.h>
/*variables globale*/
int pid;//retourne le pid du fils
int tube[2];//tube avec les 2 descripteurs ecriture et lecture du tube
//tube[0] est le descripteur pour la lecture
//tube[1] est le descripteur pour l'ecriture
/*prototype fonction*/
void pere();
void fils();
/*fonction principale*/
int main()
{
pipe(tube);//creation du tube
switch(pid=fork())//pid prend le pid du fils et fork crée pere et fils
{
case -1:perror("fork");break; //en cas d'erreur
case 0:fils();break;//chez le fils
default:pere();break;//chez le pere
}
return 0;
}
/*fonction*/
/*fonction client*/
void pere()
{
int nbre[2];
int res=0;
int i;
printf("\n[pere] Ecrire 2 chiffres : ");
for(i=0;i<1;i++)
scanf("%d",&nbre[i]);
/*si on a pas ecrit 2 entier on ecrit l'erreur*/
if(write(tube[1],nbre,2)!=2*sizeof(int))
perror("[pere] write");
/*plus besoin d'ecrire*/
close(tube[1]);
/*on attend la fin de l'action du fils*/
wait(0);
printf("\n[pere] %d + %d = ",nbre[0],nbre[1]);
/*si on a pas un entier a lire on ecrit l'erreur*/
if(read(tube[0],&res,1)!=sizeof(int))
perror("[pere] read");
close(tube[0]);
}
/*fonction serveur*/
void fils()
{
int nbre[2];
int res=0;
/*si on ne lit pas 2 entier dans le tube*/
if(read(tube[0],nbre,2)!=2*sizeof(int))
perror("[fils] read");
/*je ferme le descripteur en lecture car je n'ai plus besoin de lire*/
close(tube[0]);
printf("\n[fils] j'ai recu %d et %d \n",nbre[0],nbre[1]);
res=nbre[0]+nbre[1];
printf("\n[fils] je dois retourner %d \n",res);
/*si on ecrit pas un entier dans le tube*/
if(write(tube[1],&res,1)!=sizeof(int))
perror("[fils] write");
close(tube[1]);
}
[/code]
j'avais pour résultat :
[pere] Ecrire 2 chiffres : 10
2
[pere] write: Success
[fils] read: Success
[fils] j'ai recu 9633802 et 134514496
[fils] je dois retourner 144148298
[fils] write: Illegal seek
[pere] read: Illegal seek
[pere] 10 + 2 =
Ensuite quelque par d'autre on m'a dit qu'en faite c'etait normal car
quand je crée un tube si le pere est en ecriture le fils ne
pourra pas l'etre sur le meme tube donc il fallait que j'en crée
un deuxieme.
J'ai donc crée un deuxieme tube nommé tube2[2]; et la ou le fils
doit ecrite la reponse au pere j'ai mis tube2[1] au lieu de tube[1] et
la oou le pere doit lire la reponse tube2[2] au lieu de tube[2].
Cependant meme resultat.
Merci d'avance