Tube nommé sous unix

Tube nommé sous unix - C - Programmation

Marsh Posté le 16-11-2006 à 18:46:50    

Bonjour,
 
J'ai un petit soucis en ce qui concerne les tubes nommés, je n'arrive pas à récupérer les valeurs entiéres que j'envoi.
 
En gros je voudrais qu'un serveur réceptionne des valeur int provenant de client , qu'il les additionne entre elles et les envois à son tour au différents clients.
 
Mais impossible de récupéré les valeurs en int  :(  
 
Je ne récupére qu'une suite de chiffre incompréhensible ...
 
Si quelqu'un pourrais m'expliqué la démarche pour écrire et recevoir des valeurs int dans un tube nommé merci d'avance !!

Reply

Marsh Posté le 16-11-2006 à 18:46:50   

Reply

Marsh Posté le 16-11-2006 à 19:06:27    

Tu peux nous monter un petit bout de code peut-etre ?

Reply

Marsh Posté le 17-11-2006 à 17:26:08    

hostile4 a écrit :

En gros je voudrais qu'un serveur réceptionne des valeur int provenant de client , qu'il les additionne entre elles et les envois à son tour au différents clients.


On utilise plus généralement des sockets pour faire ce genre de manip... mais ça marche aussi via tubes nommé.
 

hostile4 a écrit :

Si quelqu'un pouvais m'expliquer la démarche pour écrire et recevoir des valeurs int dans un tube nommé merci d'avance !!


C'est la même démarche que pour écrire et recevoir des valeurs int dans un fichier ordinaire

FILE *fp;
int i=10;
int nb_elem;
 
// Ecrire dans le tube
fp=fopen("tube", "w" );
if (fp == NULL) => erreur d'ouverture
nb_elem=fwrite(&i, sizeof(int), 1, fp);
if (nb_elem != 1) => erreur d'écriture
fclose(fp);
 
// Lire le tube
fp=fopen("tube", "r" );
if (fp == NULL) => erreur d'ouverture
nb_elem=fread(&i, sizeof(int), 1, fp);
if (nb_elem == -1) => erreur de lecture
fclose(fp);


 
La seule différence avec un fichier ordinaire, c'est qu'il te faudra impérativement avoir en parallèle 2 processus
- un processus qui lit
- un processus qui écrit
S'il n'y en a qu'un seul de lancé sur les deux, il sera bloqué dans sa phase lecture (ou écriture) tant que son homologue n'aura pas été lancé.

Message cité 1 fois
Message édité par Sve@r le 17-11-2006 à 17:29:05

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 17-11-2006 à 22:25:02    

Juste au passage... Il doit bien exister un système de buffer ou c'est vraiment de la consommation au fur et à mesure ?
(je n'y connais rien et il est un peu tard pour moi pour voir ce soir...)

Reply

Marsh Posté le 18-11-2006 à 06:30:17    

Un pipe, c'est un buffer, en quelque sorte.

Reply

Marsh Posté le 18-11-2006 à 13:13:13    

Sve@r a écrit :

On utilise plus généralement des sockets pour faire ce genre de manip... mais ça marche aussi via tubes nommé.
 
 
C'est la même démarche que pour écrire et recevoir des valeurs int dans un fichier ordinaire

FILE *fp;
int i=10;
int nb_elem;
 
// Ecrire dans le tube
fp=fopen("tube", "w" );
if (fp == NULL) => erreur d'ouverture
nb_elem=fwrite(&i, sizeof(int), 1, fp);
if (nb_elem != 1) => erreur d'écriture
fclose(fp);
 
// Lire le tube
fp=fopen("tube", "r" );
if (fp == NULL) => erreur d'ouverture
nb_elem=fread(&i, sizeof(int), 1, fp);
if (nb_elem == -1) => erreur de lecture
fclose(fp);


 
La seule différence avec un fichier ordinaire, c'est qu'il te faudra impérativement avoir en parallèle 2 processus
- un processus qui lit
- un processus qui écrit
S'il n'y en a qu'un seul de lancé sur les deux, il sera bloqué dans sa phase lecture (ou écriture) tant que son homologue n'aura pas été lancé.


 
 
Merci pour ton aide !!
Bien que je pensais au tube nommé (fifo , crée par mkfifo) , là j'ai compris le principe.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed