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

C Discussion :

Redirection '>' plus read


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut Redirection '>' plus read
    Bonjour, je suis actuellement sur un projet scolaire,
    Le principe de base est de recree un minishell, je n'attend pas de reponse sous forme de code mais je ne vois pas comment bien gerer mes fork...

    je vous explique rapidement, je dois par example executer un ls avec execve ce qui dois me donner

    $> ls
    main.c prim.c toto.c etc...
    $>

    Voila a noter que le $> est le prompte de mon shell perso ce qui veux dire que apres l'execution de execve je revien dans mon programe.

    je sais comment cree un fichier si il est inexistant et lui attribuer des droit ainsi que ecrire a l'interieur. Mais mon soucis principale ne reside pas la de dans.

    je dois en effet utiliser les redirections tel que > ou <.

    si je remprend mon example precedent mais cette fois avec la redirection droite ce qui a pour but d'ecrire a "l'interieur" de mon fd

    $> ls > toto
    main.c etc....
    $>

    je dois faire n'importe quoi, mais le seul resultat que j'obtien c'est la creation de mon fichier si il est inexistant.

    Donc, je fork deux fois, une fois pour executer le execve, et une autre fois pour lire sur le fd 0.

    mais la lecture ne ce fais pas surment a cause de mon wait...

    voila une partie de mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if ((pid = fork()) < 0)                                                                          
        aff_err("fork");                                                                               
      if (pid)                                                                                         
        {                                                                                              
          int       status;                                                                            
     
          wait(&status);                                                                               
          return (0);                                                                                  
        }                                                                                              
      else                                                                                             
        {                                                                                              
          com = more_fork(com, shell);                                                                 
          execve(str, com, env);                                                                       
        }                                                                                              
      return (0);
    dans la fonction more_fork, je regarde si il y a un caractere '>' dans la ligne saisie par l'utilisateur. si c'est bien le cas je coupe la chaine en deux ls -la envoier a la commande execve puis je fork, et je recupere le nom du fichier apres ls -la > toto, et je fork, ensuite je fais des read en boucle sur le fd(0) que je recris dans le int fd(toto).

    je pensse que je dois me planter dans mes fork, si vous penssez que mon pb vien d'ailleur je suis ouvert a toutes critiques

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    peut etre un dup2 je creuse de ce coter la mais je ne connais pas dup2 :p ben voila on en apprend tout les jours ^^ man dup2

    si vous avez une idee c'est toujours d'actualite ^^

    Merci

  3. #3
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Moi je ferais un freopen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    freopen(filename, "w", stdout);
    Juste avant le exec*.
    Et ne pas oublier de vérifier le code de retour (NULL si échec)

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    j'ignore si les fichiers à haut niveau sont conservés.
    Je conseillerais plutôt un dup2() sur les descripteurs standard (STDIN_FILENO, etc.) avec un tube anonyme (pipe()).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    Citation Envoyé par Skyrunner
    Moi je ferais un freopen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    freopen(filename, "w", stdout);
    Juste avant le exec*.
    Et ne pas oublier de vérifier le code de retour (NULL si échec)
    je suis desoler mais cette fonction nous est interdite :/

    Si non pour le tube anonyme je ne vois pas

    Mais le dup2 ne devrais pas suffire ?

    si oui, ca dois donner quelque chose de quel genre ? je conserve toujours mon system a double fork ?

    car execve a pour sale habitude de mettre fin a son precessus... ce qui me rend impossible a lire en meme temps....

    si non executer les deux en meme temps, pour ecrire sur 0 et lire en meme temps, mais je ne vois pas du tout comment faire, et je suis encore a la recherche de la bonne utilisation de dup2 ^^

    je vous remerci tout les deux pour vos reponses mais je suis au meme point :/

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je pense qu'un seul fork suffit, en fait. Et pardon pour le tube anonyme, j'ai confondu avec une commande du genre ls | grep.

    De dirais un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fork()
    if(fils)
    {
       desc = open(fichier)
       dup2(desc, STDOUT_FILENO)
       exec()
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Par défaut
    je te remerci je vais essai

  8. #8
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ca sent Epita ou Epitech là non ?

    Comme la montré Medinoc, il te faut utiliser dup2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redirection quand la session n'existe plus
    Par Invité dans le forum Struts 1
    Réponses: 3
    Dernier message: 22/07/2009, 11h48
  2. Can't read superblock, plus de disque dur
    Par black is beautiful dans le forum Administration système
    Réponses: 2
    Dernier message: 28/01/2008, 10h58
  3. [Réseau] Fsockopen plus redirection en même temps
    Par AnGe7s dans le forum Langage
    Réponses: 10
    Dernier message: 22/08/2007, 10h00
  4. [Sql*Plus]redirection d'une requête
    Par Wormus dans le forum Oracle
    Réponses: 3
    Dernier message: 08/02/2006, 11h30
  5. Redirection sur des fichiers qui n'existent plus
    Par gaia_dev dans le forum Apache
    Réponses: 3
    Dernier message: 03/02/2006, 19h09

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