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 :

notion de file descriptors, dup() et dup2()


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Par défaut notion de file descriptors, dup() et dup2()
    Bonjour,

    J'ai actuellement un problème lie aux file descriptors:

    J'ai code des fonctions qui grâce a dup2() redirigent l'entrée ou la sortie standard vers des fichiers, et jusque la tout va bien...

    Il s'agit d'un programme qui doit tourner en boucle (un shell), le soucis est que pour les fonctions basiques comme les redirections, un fork(), un dup2() et un close... Je récupère bien mon entrée ou ma sortie standard au tour suivant.

    Mais lorsque je les enchainent entre elles, je perds soit l'entrée, soit la sortie, soit les 2 selon les modifications que j'ai voulut apporter au code !

    Je suppose que le problème vient du fait que dup2(fd_new, fd_old) close automatiquement fd_old, ma question est donc assez précise, j'aimerais "sauvegarder" mon entrée et ma sortie standard en début de fonction, avant de fork() quoi que ce soit grâce a l'appel système dup(), et j'aimerais en fin de fonction le ré-attribuer ==> grâce a dup2() ?

    Voici un schémas de ce que j'aimerais faire, mais je trouve cela un peu... Bizarre:

    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
    16
    void    exemple()
    {
    int fd_in;
    int fd;
    pid_t pid;
     
    fd_in = dup(0); /*Rassurez moi, 0 n'est pas censé se close ?^^*/
     
    ...
    pid = fork();
    ...
    dup2(fd, 0); /*Ici je close l'entrée standard*/
    ...
     
    dup2(0, fd_in); /*Récupération de l'entrée standard ?*/
    }
    Merci !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 466
    Par défaut
    Bonsoir,

    Citation Envoyé par student_ Voir le message
    Je suppose que le problème vient du fait que dup2(fd_new, fd_old)
    C'est surtout dû au fait qu'il s'agit de dup2(fd_old,fd_new) et pas l'inverse ! Remet les descripteurs dans le bon ordre et ton programme devrait beaucoup mieux marcher.

    Bon courage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 77
    Par défaut
    Effectivement je viens de vérifier dans la man, pourtant ca fonctionnait pour des redirections simples et ca ne fonctionne plus en inversant les file descriptors (le résultat arrive maintenant sur la sortie standard, bien que le open crée toujours le fichier) !? En commentaire le code qui fonctionnait:

    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
    16
    17
    18
    19
    20
     
    int redir_right(...)
    {
    int status;
    pid_t pid;
    int fd;
     
     pid = xfork();
      if (pid)
        wait(&status);
      else
        {
          fd = xopen(chaine->next->cmd[0], O_CREAT | O_TRUNC | O_WRONLY, 0600);
          /*dup2(fd, 1);*/
          dup2(1, fd);
          xexecve(path, cmd2, env->env);
          close(fd);
        }
    return (0);
    }
    Comment pourrait on expliquer ca ?

    Merci !

Discussions similaires

  1. lire une ligne d'un file descriptor
    Par Pitou5464 dans le forum Réseau
    Réponses: 4
    Dernier message: 30/10/2006, 16h13
  2. pb file descriptor
    Par aimad41 dans le forum C
    Réponses: 2
    Dernier message: 23/10/2006, 18h16
  3. Coment obtenir le nombre total de file descriptor ouvert?
    Par homeostasie dans le forum Réseau
    Réponses: 7
    Dernier message: 21/06/2006, 11h55
  4. Bad file descriptor avec un read()
    Par je®ome dans le forum C
    Réponses: 2
    Dernier message: 04/04/2006, 19h30
  5. Etrange "Bad file descriptor"
    Par amauryxiv dans le forum Langage
    Réponses: 23
    Dernier message: 01/02/2006, 03h20

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