IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

ouverture de fichier et pipe


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut ouverture de fichier et pipe
    Bonjour tout le monde, voilà j'ai du m'absenter des cours pendant deux semaines pour des raisons familiales, je me suis mis à jour en partie mais j'ai encore quelques lacunes en unix et shell.
    J'ai un devoir à rendre pour demain qui consiste à créer un programme C qui crée trois processus fils qui lient de trois fichiers différents et écrivent dans le meme pipe dans le processus parent.
    Le parent doit lire du pipe et écrit le tout dans un nouveau fichier.

    est-ce que quelqu'un peut me donner un petit tuyau ou au moins me donner un lieu vers un bon tuto sur pipe dup2 etc...

    Merci de votre gentillesse

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magfen Voir le message
    Bonjour tout le monde, voilà j'ai du m'absenter des cours pendant deux semaines pour des raisons familiales, je me suis mis à jour en partie mais j'ai encore quelques lacunes en unix et shell.
    J'ai un devoir à rendre pour demain qui consiste à créer un programme C qui crée trois processus fils qui lient de trois fichiers différents et écrivent dans le meme pipe dans le processus parent.
    Le parent doit lire du pipe et écrit le tout dans un nouveau fichier.

    est-ce que quelqu'un peut me donner un petit tuyau ou au moins me donner un lieu vers un bon tuto sur pipe dup2 etc...

    Merci de votre gentillesse

    Pour ton tp, voici le schéma
    1) créer le fichier pipe
    2) créer les 3 processus fils (dans une boucle) => Point "un peu" délicat => Bien arriver à détecter, dans le code tapé, dans quelle partie on est (père/fils ?)

    A partir de ce point, on a un père et des fils
    Le père devra lire le pipe et écrire dans fichier texte

    Chaque fils devra
    1) ouvrir le pipe en écriture
    2) ouvrir le fichier en lecture
    3) lire le fichier et écrire dans le pipe
    4) fermer le pipe
    5) se terminer proprement (via exit)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    merci beaucoup pour ton aide frederic.

    En m'aidant des aides que tu m'as fournies, j'ai décidé tout d'abord de créer un programme avec un processus fils qui ouvre un fichier, le lit et l'écrit dans le pipe. Ensuite, le père lit du pipe, et affiche ce qu'il lit à l'ecran.
    Voici mon code joint.

    Cependant, j'obtient l'erreur suivante:
    Undefined first referenced
    symbol in file
    __gxx_personality_v0 /var/tmp//cceQVSm1.o
    ld: fatal: Symbol referencing errors. No output written to a.exe
    collect2: ld returned 1 exit status

    merci encore
    Fichiers attachés Fichiers attachés

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    En voyant ton message d'erreur, j'ai l'impression que tu compiles sous zindow. Si c'est ça t'es mal barré parce que zindow ne connait pas le multi processus (fork, pipe, etc)

    J'ai testé ton code sous Linux et il semble fonctionner. En tout cas, je lui ai donné un fichier à bouffer et il me l'a recraché.

    Bon, qq remarques
    1) La macrodéfinition "NULL" symbolise un pointeur invalide etnon le caractère '\0' donc si tu veux mettre '\0' dans ta chaine, ben mets-le tel quel
    2) la fonction "gets" est sensiblement dangereuse
    3) en voyant ton énoncé j'avais cru qu'il s'agissait de fichier pipe. Mais c'est pas primordial.
    4) Je ne comprends pas trop pourquoi tu fais du dup2() à tout va mais là non plus c'est pas grave.
    5) commentaires pas tiptop. T'as piqué ce code chez un pote anglais ???
    Sinon ça semble bon et tu sembles avoir compris le principe du fork et du pipe.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En voyant ton message d'erreur, j'ai l'impression que tu compiles sous zindow. Si c'est ça t'es mal barré parce que zindow ne connait pas le multi processus (fork, pipe, etc)

    J'ai testé ton code sous Linux et il semble fonctionner. En tout cas, je lui ai donné un fichier à bouffer et il me l'a recraché.

    Bon, qq remarques
    1) La macrodéfinition "NULL" symbolise un pointeur invalide etnon le caractère '\0' donc si tu veux mettre '\0' dans ta chaine, ben mets-le tel quel
    2) la fonction "gets" est sensiblement dangereuse
    3) en voyant ton énoncé j'avais cru qu'il s'agissait de fichier pipe. Mais c'est pas primordial.
    4) Je ne comprends pas trop pourquoi tu fais du dup2() à tout va mais là non plus c'est pas grave.
    5) commentaires pas tiptop. T'as piqué ce code chez un pote anglais ???
    Sinon ça semble bon et tu sembles avoir compris le principe du fork et du pipe.
    1) et si je n'ai pas linux, comment pourais-je compiler mon code sans rencontrer de problème? pour l'instant, en utilisant ssh je me connecte au ordinateurs sun de mon école et sur le terminel je tape gcc -o a.out lab2.cpp
    2)j'ai pas compris pourquoi tu m'as parlé de macrodefinition NULL
    3)j'utilise scanf à la place de gets?
    4)pour dup2 je croyais qu'il servait à rediriger la sortie et automatiquement quand le fils fait printf, le père reçoit dans son stdin. Mais d'après ce que tu dis, le pipe suffit. A quoi sert alors dup2?
    5)concernant to dernier commentaire, je n'ai pas piqué le code d'un pote anglais seulement notre prof nous a donné le code pour lire et comme c'est un américain ses commentaires sont en anglais. tous le reste est de moi.

    merci pour tout

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magfen Voir le message
    1) et si je n'ai pas linux, comment pourais-je compiler mon code sans rencontrer de problème? pour l'instant, en utilisant ssh je me connecte au ordinateurs sun de mon école et sur le terminel je tape gcc -o a.out lab2.cpp
    Aucun problème. Tu fais tout à distance comme si t'étais sur la machine cible (mais tu seras en mode texte comme sous une console). Tu peux aussi télécharger Knoppix qui t'offre un Linux complet sur dvd => tu bootes sur dvd et tu travailles sous Linux sans rien installer sur ton disque dur (et tu peux même monter tes disques locaux Windows pour y sauvegarder tes données)

    Citation Envoyé par magfen Voir le message
    2)j'ai pas compris pourquoi tu m'as parlé de macrodefinition NULL
    A un moment donné, tu mets "NULL" dans ta chaine. Ca marche mais c'est mal écrit (ton pointeur NULL est converti en caractère donc autant mettre directement un caractère)

    Citation Envoyé par magfen Voir le message
    3)j'utilise scanf à la place de gets?
    scanf c'est encore pire => ça attend une entrée formatée or ce que tape l'utilisateur est tout sauf formaté. Non, le danger de gets() c'est qu'il n'y a pas de contrôle sur la longueur donc tu peux saisir plus de caractères que ce que la zone peut en stocker. La soluce préconisée est d'utiliser fgets(buffer, taille_du_buffer, stdin)

    Citation Envoyé par magfen Voir le message
    4)pour dup2 je croyais qu'il servait à rediriger la sortie et automatiquement quand le fils fait printf, le père reçoit dans son stdin. Mais d'après ce que tu dis, le pipe suffit. A quoi sert alors dup2?
    dup2 sert effectivement à dupliquer un descripteur sur un autre mais c'est pas utile. Il te suffit au fils de
    - lire le fichier input (il a été ouvert donc t'as un descripteur)
    - écrire la data lue dans le coté [1] du tube

    Et le père va simplement
    - lire le coté [0] du tube
    - écrire la data lue dans le fichier output (qui a aussi un descripteur)

    Si j'ai bien compris l'énoncé...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. ouverture de fichier txt
    Par juguul dans le forum MFC
    Réponses: 11
    Dernier message: 18/12/2003, 09h44
  2. Ouverture de fichier en api
    Par Michaël dans le forum Windows
    Réponses: 9
    Dernier message: 10/12/2003, 16h47
  3. Ouverture de fichier
    Par Ricou.13 dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/10/2003, 08h59
  4. Réponses: 2
    Dernier message: 26/02/2003, 15h18
  5. [VBA-E] Evenement ouverture de fichier
    Par gjeff dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/12/2002, 09h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo