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 :

probleme de redirection avec open et dup2


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 8
    Points
    8
    Par défaut probleme de redirection avec open et dup2
    bonjour à tous,
    je dois finir en tp en L3 info mais je galère on me demande de faire un mini shell et de faire les redirections donc avec une fonction redirection.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int redirection (char *argv[], char * in,char * out)
    {
    int desc1, desc2;
    desc1=open ( in, O_RDONLY);
    desc2=open( out, O_WRONLY | O_CREAT | O_APPEND);
    dup2(desc2,desc1);
    return 0;
    }
    mais malheureusement ca marche pas du tout,
    deja j'ai desc2 qui prend la valeur -1 donc une erreur et donc j'ai essayé de créer le fichier avec creat.... mais ca marche toujours pas car dup2 ne change pas la valeur de desc2...
    la variable errno vaut 0 apres desc2 et dup2


    merci a tous ceux qui vont m'aider

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    je rajoute des indication peut etre
    je fais un minishell
    argv contient une liste de commande
    argv[0] contien le fichier d entrer qui est aussi in
    argv[1] contien > ou <
    argv[2]contien le fichier de sortie qui est aussi out

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    C'est int descripteur = dup2(source, destination)

    l'appel à la fonction ferme le fichier destination. Dans le cas des e/s standard

    on aurait dup2(in, 0), dup2(out, 1) et dup2(err, 2)

    La procédure à suivre est donc de dupliquer le descripteur standard, d'assigner le nouveau et de le réaffecter ensuite à sa valeur d'origine, 3 appels a dup2 donc pour chaque descripteur. Bon courage.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    il n'y a pas moyen de changer la valeur du descrupteur de out... snif je n'ay arrive pas même avec ta maniére. Avec ddd je vois que la valeur du descripteur de out ne change pas du tout snif.... encore un peu d'aide svp j'y suis presque........

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    Je n'ai pas de compilateur sous la main. Ca devrait être quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int anc_sortie ;
    int nouv_sortie ;
    int res ;
     
    nouv_sortie = open(...
     
    anc_sortie=dup(STDOUT_FILENO) ;
    res= dup2(nouv_sortie, STDOUT_FILENO) ;
     
    /* ici on utilise la redirection */
     
    close(nouv_sortie) ;
    res = dup2(anc_sortie, STDOUT_FILENO) ;

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    voila ce que j'ai fait d'apres tes conseil mais ca ne marche toujours pas ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int desc1,desc2,desc3;
    desc1=open(in,O_RDONLY);
    desc2=open(out,O_WRONLY | O_CREAT);
    desc3=dup2(desc1,STDOUT_FILENO);
    close(desc1);
    desc3=dup2(desc2,STDOUT_FILENO);
    je rappele que je dois juste faire un mini-shell en faisan la gestion dezs redirections vers des fichiers en entre < et en sortie >;
    tout ce que je fais la c'est dans le cas ou en ligne de commande on tape par exemple:entrée > sortie;
    merci beaucoup pour ton aide.. j'y suis presque

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    Il ne faut pas mélanger in et out!

    la manip que j'ai donnée est pour stdout seulement. Il faut refaire pareil pour stdin et stderr si on veut les rediriger également.

    Voilà la page man de dup2() : http://man.developpez.com/man2/dup/

    Effectivement on reçoit un descripteur de fichier en retour (j'avais écrit un peu trop vite) mais on en n'a pas besoin car si l'opération s'est bien passée c'est le même que newfd.

    Dans un cas comme ça il faut procéder par étapes, la première consistant (par exemple) à utiliser dup2() sur stdout et vérifier que la direction se passe bien.

    Une redirection consiste à modifier les entrées/sorties standard. Ce n'est pas entree > sortie, c'est commande < entree > sortie 2> erreur

    On peut donc avoir commande < sortie ou commande > entree seulement.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    je dois faire a peu pres la meme chose mais je n'ai pas compris comment marche dup2, pour l'instant je redirige l'entrée standard vers un fichier puis j'execute la commande, puis je redirige la sortie standard vers le fichier de sortie. Mais ca ne marche pas.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Généralement, la redirection ne se fait pas pour le processus lui-même, mais pour un processus fils.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    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
    21
    22
    	int desc_fichier_entree,desc_fichier_sortie,res=0;
    	int pid,retour;
    	printf("in : %s, out : %s\n",in,out);
    	argv = 0;	
    	desc_fichier_entree = open(in,O_RDONLY);
    	desc_fichier_sortie = open(out,O_WRONLY | O_CREAT);
    	pid = fork();
    	printf("pid : %d\n",pid);
    	if(pid == 0)
    	{ 
    		retour = execvp(argv[0],argv);
    		printf("retour : %d\n",retour);
    		if(retour != -1 && desc_fichier_entree != -1)
    		{
    			res = dup2(desc_fichier_entree,STDIN_FILENO);
    			printf("res 1 : %d\n",res);
    			res = dup2(STDIN_FILENO,desc_fichier_sortie);
    			printf("res 2 : %d\n",res);
    		}	 
    	}
    	else
    		wait(&pid);
    voila ce que je fais mais il ne passe pas dans le if(pid == 0) et si je ne le mets pas ca ne marche pas.

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    pid vaut -1 ou bien est > 0 ? Un printf dans un fork je ne pense pas que ça marche il faut une trace plus évoluée (ouvrir un fichier dump.txt par exemple et écrire dedans).

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Tu mets l'appel à exec() beaucoup trop tôt.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Le pid est > 0

    Le exec il faut le mettre apres le premier dup2 ?
    Et est-ce que les dup2 sont bien enchainés ou c'est pas ca du tout ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Il faut mettre le exec() en dernier, puisque cette fonction n'est pas censée retourner.

    Note: Le pid est à la fois zéro et >0. Zéro dans le processus fils, supérieur à zéro dans le processus père.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    je pense que l'enchainement des dup2 n'est pas bon car même en mettant l'execution de la commande après les dup2 je n'ai toujours rien dans mon fichier de destination.
    je tape par exemple : cat essai > test
    dans essai j'ai écrit : "test de la redirection" mais le fichier test reste vide.
    Je ne comprends pas ce qui ne va pas dans ma redirection

  16. #16
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    En remplaçant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			res = dup2(STDIN_FILENO,desc_fichier_sortie);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			res = dup2(desc_fichier_sortie, STDOUT_FILENO);
    ça donne quoi ?

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 84
    Points : 69
    Points
    69
    Par défaut Erreur
    Excusez-moi je suis complètement à l'ouest, je voulais créer un nouveau topic et non répondre à a celui-ci...

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/06/2008, 13h40
  2. [vb6]=Probleme avec open for append
    Par prison_break dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/01/2007, 13h40
  3. Probleme de redirection avec Header
    Par ehmppowa dans le forum Langage
    Réponses: 7
    Dernier message: 28/12/2006, 18h26
  4. [xmlhttprequest] probleme avec open
    Par gorgonite dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/05/2006, 21h04
  5. Petit probleme stup**** avec Open
    Par Maxbrad dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/11/2005, 21h38

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