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

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut Comment écrire un programme qui redirige la sortie standard vers un fichier et effectue un ls vers ce fichier?
    Bonsoir!

    Je suis actuellement en train de réviser l'UNIX en vue d'un examen.

    J'essaye de fairre un exercice mais je pense que je pars dans la mauvaise direction:
    Comment écrire un programme qui redirige la sortie standard vers un fichier et effectue un ls vers ce fichier?

    je pense qu'il faut faire d'abord open()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int f = open(fichier, O_RDWR, O_CREAT);
    puis un dup2(), car dup2() duplique le premier descripteur et en un deuxième correspondant au second argument.

    donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dup2(1,#je sais pas quoi mettre en deuxime descripteur);
    et enfin la redirection:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #je sais pas quoi mettre en deuxime descripteur >  fichier;
    ensuite pour executer un ls on va faire exec qui remplace le processis en cours par un nouveau précisé dans les arguments.


    Donc finalement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int f = open(fichier, O_RDWR, O_CREAT);
    dup2(1,#je sais pas quoi mettre en deuxime descripteur#);
    #je sais pas quoi mettre en deuxime descripteur# >  fichier;
    execlp("ls",NULL);
    Mais faire une telle construction par brique me parait assez rudimentaire... Pouvez vous me corriger? Me dire ou j'ai faux et me guider pour m'améliorer?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Avril 2014
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 498
    Points : 1 178
    Points
    1 178
    Par défaut
    Salut

    Alors je vais globalement te guider en espérant pas dire de conneries parce que j'ai franchement faim et que je n'ai pas trop la tête à me plonger dans un raisonnement

    Il faut que tu crée un pipe déja avec pipe(fd[2]).
    Puis tu dois redirigé l'entrée de ce pipe vers la sortie standard, (en l'occurence 1 ou STDOUT_FILENO dans la table des descripteurs) avec dup2 puis tu ferme la sortie standard (close(STDOUT_FILENO))ou bien tu ferme d abord la sortie standard puis tu utilise dup(fd[1]).
    Voila lentrée de ton pipe est "redirigée" vers la sortie standard (même si au fond, l'entrée de ton pipe pointe vers le même fichier que ton stdout initial que tu as fermé)
    Ton processus fait un read() avec une boucle while() de ton pipe (sur fd[0] donc)et fait de suite un write() intégré dans un while() direction un fichier (que tu a d abord ouvert avec open()).
    Puis execl("ls") de ton fichier.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Avril 2014
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 498
    Points : 1 178
    Points
    1 178
    Par défaut
    O j ai oulié de te dire : il faut que tu fasse un fork() et ton fils redirige la sortie vers le pipe.Puis cest le pere qui fera le execl("ls").

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    la méthode proposée par tabouret est propre avec le fork et le pipe, sinon le code suivant est suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <unistd.h>
    #include <fcntl.h>
     
    int main (void) {
            char *cmd[] = {"/bin/ls", NULL};
            int fd = open("fichier", O_CREAT | O_WRONLY, 0640);
            dup2(fd, STDOUT_FILENO);
            dup2(fd, STDERR_FILENO);
            execve(cmd[0], cmd, NULL);
            return 0; /* pour faire plaisir au compilateur */
    }

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/04/2009, 10h23
  2. Comment écrire un shell qui transforme un code ascii en caractère?
    Par jack-ft dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 21/04/2008, 17h51
  3. Réponses: 23
    Dernier message: 30/06/2007, 18h14
  4. comment faire un programme qui calcul la somme ?
    Par jahjouna dans le forum C++
    Réponses: 18
    Dernier message: 13/12/2006, 00h33
  5. Réponses: 2
    Dernier message: 22/05/2006, 11h02

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