Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4611 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Transfert par pipe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Transfert par pipe

n°1310090
chinmi1
Posté le 20-02-2006 à 21:48:50  profilanswer
 

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

mood
Publicité
Posté le 20-02-2006 à 21:48:50  profilanswer
 

n°1310128
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-02-2006 à 22:18:51  profilanswer
 

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/
n°1310639
Sve@r
Posté le 21-02-2006 à 14:37:21  profilanswer
 

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
n°1310674
Emmanuel D​elahaye
C is a sharp tool
Posté le 21-02-2006 à 14:56:46  profilanswer
 

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/
n°1310678
skelter
Posté le 21-02-2006 à 14:58:04  profilanswer
 

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
n°1310874
Sve@r
Posté le 21-02-2006 à 17:27:00  profilanswer
 

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.
n°1310930
Emmanuel D​elahaye
C is a sharp tool
Posté le 21-02-2006 à 18:44:38  profilanswer
 

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/
n°1310931
Sve@r
Posté le 21-02-2006 à 18:49:58  profilanswer
 

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.
n°1696415
hsmrpro
Posté le 03-03-2008 à 16:28:39  profilanswer
 

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

n°1696420
Taz
bisounours-codeur
Posté le 03-03-2008 à 16:31:58  profilanswer
 

Emmanuel Delahaye a écrit :


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


Maintenant joue avec sizeof :na:

mood
Publicité
Posté le 03-03-2008 à 16:31:58  profilanswer
 

n°1696583
ptitchep
Posté le 03-03-2008 à 21:06:12  profilanswer
 

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
n°1696908
hsmrpro
Posté le 04-03-2008 à 12:48:19  profilanswer
 

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

n°1697201
ptitchep
Posté le 04-03-2008 à 20:35:25  profilanswer
 

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
n°1697834
hsmrpro
Posté le 05-03-2008 à 19:15:04  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Transfert par pipe

 

Sujets relatifs
Macro de transfert dans Outlook 2000transfert entre 2 BdD local à internet => besoin d'aide
probleme du transfert d'un fichiertransfert ftp de fichier ascii avec ftp_put en php
batch de transfert ftp de repertoires et fichiersTransfert champ texte vers liste multiple
transfert automatique de fichiers vers un site webtransfert d'image via soap wsdl
transfert entre deux base MySQL[MS-DOS] Utilisation du pipe
Plus de sujets relatifs à : Transfert par pipe


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)