Transfert par pipe

Transfert par pipe - C - Programmation

Marsh Posté le 20-02-2006 à 21:48:50    

Bonjour :  
je sais utiliser des pipes pour faire des transferts de messages sous forme de chaine de caracteres entre deux processus pere et fils ( avec des tubes sans nom )  
 
Mais voila : je voudrais faire des transfert d'une structure que j'ai defini.  
 
Est ce possible ?  
 
je voudrais faire un transfert de structure comme celle ci :

Code :
  1. typedef struct
  2. {
  3.         char* message;
  4.         int entier;
  5. }nouveau;


 
entre un processus fils et pere.
 
voila, merci d'avance si vous avez une réponse

Reply

Marsh Posté le 20-02-2006 à 21:48:50   

Reply

Marsh Posté le 20-02-2006 à 22:18:51    

chinmi1 a écrit :

je sais utiliser des pipes pour faire des transferts de messages sous forme de chaine de caracteres entre deux processus pere et fils ( avec des tubes sans nom )  
 
Mais voila : je voudrais faire des transfert d'une structure que j'ai defini.  
 
Est ce possible ?  
 
je voudrais faire un transfert de structure comme celle ci :

Code :
  1. typedef struct
  2. {
  3.         char* message;
  4.         int entier;
  5. }nouveau;


 
entre un processus fils et pere.


 
Si tu tiens au pointeur 'message', il fa valloir qu'il pointe sur de la mémoire commune donc partagée. Compliqué... Si une copie ne te fait pas peur, utilise plutôt un tableau de char de taille fixe...


typedef struct
{
        char message[TAILLE_QUI_VA_BIEN];
        int entier;
}nouveau;


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-02-2006 à 14:37:21    

chinmi1 a écrit :

Bonjour :  
je sais utiliser des pipes pour faire des transferts de messages sous forme de chaine de caracteres entre deux processus pere et fils ( avec des tubes sans nom )  
 
Mais voila : je voudrais faire des transfert d'une structure que j'ai defini.  
 
Est ce possible ?  
 
je voudrais faire un transfert de structure comme celle ci :

Code :
  1. typedef struct
  2. {
  3.         char* message;
  4.         int entier;
  5. }nouveau;


 
entre un processus fils et pere.
 
voila, merci d'avance si vous avez une réponse


 
Comme le dit Emmanuel, si tu fais un simple transfert de ta structure, ton fils ne récupèrera qu'une adresse vers une chaine vers laquelle il risque de ne pas avoir accès. On retrouve des problèmes analogues en C++ quand on utilise la copie par défaut pour copier des objets contenant des pointeurs (shallow copy). On ne copie que le pointeur et non le pointé.
 
Avec sa solution, ta structure contient tout le message. Il te suffit de faire un simple "write(p[0], &variable, sizeof(nouveau))" pour que l'ensemble de ta structure passe dans le pipe.
 
PS: Il est plus judicieux de nommer ses types "t_qqchose" ou "qqchose_t" (par exemple "t_nouveau" ). Ca améliore la lisibilité du code et tu conserve toujours le token "nouveau" disponible pour le nom de ta variable qui sera justement de type "t_nouveau".

Message cité 2 fois
Message édité par Sve@r le 21-02-2006 à 14:38:23
Reply

Marsh Posté le 21-02-2006 à 14:56:46    

Sve@r a écrit :

PS: Il est plus judicieux de nommer ses types "t_qqchose" ou "qqchose_t"


Attention, le suffixe _t est réservé par POSIX.
 
Pas de problème avec *_s ou t_* ou T*...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-02-2006 à 14:58:04    

Sve@r a écrit :

PS: Il est plus judicieux de nommer ses types "t_qqchose" ou "qqchose_t" (par exemple "t_nouveau" ). Ca améliore la lisibilité du code et tu conserve toujours le token "nouveau" disponible pour le nom de ta variable qui sera justement de type "t_nouveau".


 
il me semble qu'une variable et un type (autre qu'un type de base) peuvent se partager le meme nom, c'est d'ailleur pour ca qu'il faut mettre un nom de type entre parantheses (et qu'il ne faut pas mettre de parantheses dans les autres cas) lorsqu'on le passe à sizeof, pour lever ce genre d'ambiguité

Message cité 1 fois
Message édité par skelter le 21-02-2006 à 14:59:42
Reply

Marsh Posté le 21-02-2006 à 17:27:00    

Emmanuel Delahaye a écrit :

Attention, le suffixe _t est réservé par POSIX.


Tiens ? Je ne savais pas.
 

skelter a écrit :

il me semble qu'une variable et un type (autre qu'un type de base) peuvent se partager le meme nom


 
Ca veut dire qu'on peut écrire un truc de ce style...

typedef struct {
    int x;
    double y;
} essai;
 
int main()
{
    essai essai;
    ...
}


???
 
J'ai jamais essayé...


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

Marsh Posté le 21-02-2006 à 18:44:38    

Sve@r a écrit :

Ca veut dire qu'on peut écrire un truc de ce style...

int main()
{
    essai essai;
    ...
}




Oui.
 
C'est moche et ça pose des tas de problèmes aux parseurs C...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-02-2006 à 18:49:58    

Emmanuel Delahaye a écrit :

Oui.
 
C'est moche et ça pose des tas de problèmes aux parseurs C...


 
Ca ne me serait jamais venu à l'idée de le faire tellement j'étais persuadé que c'était pas possible (sans compter que je me mettrais des claques si je me surprenais à faire ça :D)
On en apprend tous les jours... mais on n'apprend pas que des bonnes choses :)  


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

Marsh Posté le 03-03-2008 à 16:28:39    

Bjr à tous
Je débute en prog system et surtout avec les dup et pipe anonyme et fork. Ma question est la suivante: Comment faire pour créer un anneau de processus communiquant entre eux. 3 processus par exemple communiquant entre eux en anneau.
 
J'ai une partie d'un code que voici mais que je n'arrive pas à comprendre, notamment pourquoi faire une matrice de tube[][] tout en sachant que le tub doit contenant que les 2 descripteurs read et write du tube.
 
*****************************************************
int tube[atoi(argv[1])][2]; // CETTE MATRICE QUE JE COMPRENDS PAS
 
/* Création d'autant de tubes que de fils */
 for(i=0;i<atoi(argv[1]);i++)
 {
  testpipe=pipe(tube[i]);
  if(testpipe==-1)
   error("Erreur pipe" );
 }
 
 /* Création des fils nécessaire */
 for(i=0;i<atoi(argv[1]);i++)
 {
  fils=fork();
  if(fils==-1)
   error("Erreur fork" );
  else if(fils==0) // Fils
  {
   testdup=dup2(tube[i][0],STDIN_FILENO); //redirection de l'entrée standard du pus_i sur le tube_i[0]
   if(testdup==-1)
    error("Erreur dup2 IN" );
   
   testdup=dup2(tub[(i+1)%atoi(argv[1])][1],STDOUT_FILENO); //redirection de la sorti du pus_i sur le tube_i du pus suivant
   if(testdup==-1)
    error("Erreur dup2 OUT" );
 
   for(j=0;j<atoi(argv[1]);j++)
   {
    testclose=close(tube[j][0]);
    if(testclose==-1)
     error("Erreur close IN" );
     
    testclose=close(tube[j][1];
    if(testclose==-1)
     error("Erreur close OUT" );
   }
   
   execl("jeton",argv[2],NULL);
   error("Erreur execl" );
*****************************************************
 
 
Merci bien pour vos réponses

Reply

Marsh Posté le 03-03-2008 à 16:31:58    

Emmanuel Delahaye a écrit :


Oui.
 
C'est moche et ça pose des tas de problèmes aux parseurs C...


Maintenant joue avec sizeof :na:

Reply

Marsh Posté le 03-03-2008 à 16:31:58   

Reply

Marsh Posté le 03-03-2008 à 21:06:12    

hsmrpro a écrit :


int tube[atoi(argv[1])][2]; // CETTE MATRICE QUE JE COMPRENDS PAS


Ben ça te crée un tableau de tubes (2 entiers pour chaque tube) d'une dimension égale au nombre passé en premier argument au programme.
Si l'argument n'est pas un nombre, ça te donne un truc très moche:
 
SYNOPSIS
       #include <stdlib.h>
 
       int atoi(const char *nptr);
 
DESCRIPTION
       La  fonction  atoi()  convertit  le début de la chaîne pointée par nptr en entier de type int. Le résultat est
       identique à un appel à
 
              strtol(nptr, (char **)NULL, 10);
 
       à la différence que atoi() ne détecte pas d'erreur.


Message édité par ptitchep le 03-03-2008 à 21:19:59

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 04-03-2008 à 12:48:19    

slt  
et merci ptichep je vois la stratégie en gros. Une autre question quand le pus1 redirige le STDOUT_FILENO sur le tube2 et que le pus2 redirige son STDIN_FILENO sur le tube2; il y a donc une communication unidirectionnelle établie entre le pus1 et le pus2 via le tube2????
 
Si ce le cas, quel différence y'a t il entre cette technique de redirectiond es descripteurs par défaut, et faire: pour un pus(i) donne, ecrire(tube(i),....) et lire(tube(i-1),...) avec les primitives read et write sans redirection de (STDIN,STDOU)_FILENO.
 
Merci pour ton aide

Reply

Marsh Posté le 04-03-2008 à 20:35:25    

Disons que rediriger l'entrée/sortie standard vers le tube permet de lire/écrire dans le tube comme s'il s'agissait du clavier/ecran. Si tu n'utilises plus l'entrée/sortie habituelle (clavier/écran) cela peut alléger le code.
Je ne sais pas si ça répond à la question, je n'ai pas lu le code (utilise les balises de code, c'est hachement plus lisible, oui je suis un fainéant).
 
Sinon tu squatterais pas le post d'un autre par hasard?


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 05-03-2008 à 19:15:04    

lol! c'est pas tout à fait ça.
Disons que c'est une correction de TP que le prof nous a filé à la rache donc j'essaie de comprendre. Et là j'ai compris
Merci

Reply

Sujets relatifs:

Leave a Replay

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