Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2880 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Redirections

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Redirections

n°2188878
maitre2b
La mort vient du Ciel.
Posté le 04-05-2013 à 01:50:55  profilanswer
 

Bonjour à tous,
 
Je suis un jeune étudiant en informatique, et je dois "coder" une partie du shell de Linux.
J'ai un gros problème au niveau des redirections (">" , ">>" ).
 
Je veux pouvoir écrire dans un fichier ce qu'un programme renvoie par sa sortie standard (STDOUT).
 
C'est à dire:

Code :
  1. ./a.out pwd >> toto.txt


 
Ce qui afficherait par exemple avec un "cat toto.txt":

Code :
  1. /home/login/projet/


 
Comment puis-je mettre dans un buffer par exemple la sortie standard du programme pour ensuite faire un open() du nom du fichier, puis un write() pour écrire à l'intérieur ce qui est bufferisé ?
Merci de bien vouloir m'indiquer une manière de procéder car je ne vois absolument pas comment faire.

mood
Publicité
Posté le 04-05-2013 à 01:50:55  profilanswer
 

n°2188879
Farian
Posté le 04-05-2013 à 01:59:03  profilanswer
 

Si j'ai bien compris votre souci, la commande dup est la solution : vous fermez puis dupliquez la sortie standard (1) et l'erreur standard (2).
 
La duplication se fait en utilisant un file descriptor obtenu par "open", vous trouverez un très grand nombre d'exemples sur Internet.
 
Bonne continuation !

n°2188880
maitre2b
La mort vient du Ciel.
Posté le 04-05-2013 à 02:04:17  profilanswer
 

Merci beaucoup Farian, je m'y remets tout de suite !

n°2189424
maitre2b
La mort vient du Ciel.
Posté le 09-05-2013 à 02:34:18  profilanswer
 

J'ai bien réussi à faire le ">"
Mais maintenant... j'ai du mal avec "<"
 
Par exemple:
 
./a.out < toto.txt
 
Le programme "a.out" reçoit ce qui est écrit dans le fichier toto.txt  .
 
Je ne comprends pas comment faire pour utiliser dup2() et de mettre en paramètre cet exécutable ... ? (Suis-je compréhensible ?)
 
C'est à dire que je commence avec un read() de toto.txt que je place dans un buffer, mais ensuite... comment rediriger l'entrée de l'éxécutable avec dup() ?.
 

n°2189428
Farian
Posté le 09-05-2013 à 05:38:53  profilanswer
 

Bonjour !
 
C'est le même principe : vous ouvrez le fichier en lecture avec open ("fdStdin = open("toto.txt", ...);" ) ,  vous fermez l'entrée standard ("close(0);" ) et vous dupliquez le fichier que vous avez ouvert (" dup(fdStdin);" ).  
 
C'est, a priori, le même principe que pour le ">".
 
En revanche, pour le "|", c'est un poil plus compliqué, mais à peine,  mais c'est une autre histoire :)

n°2189435
maitre2b
La mort vient du Ciel.
Posté le 09-05-2013 à 12:01:44  profilanswer
 

C'est bien ce que j'avais fait à la base, mais ça ne semble pas fonctionner.
 
Voici la foncton qui doit rediriger vers l'exécutable:

Code :
  1. int     redirection_gauche(char **av)
  2. {
  3.   int   fd;
  4.   if ((fd = open(av[3], O_RDONLY) == -1))
  5.     {
  6.       my_fputstr(2, "Could not open file.\n" );
  7.       return (-1);
  8.     }
  9.   close(0);
  10.   dup2(fd, 0);
  11.   return (0);
  12. }


 
Mais afin de tester si cela fonctionne, j'ai crée un exécutable qui affiche ce qu'il reçoit en entrée standart:

Code :
  1. int     main()
  2. {
  3.   char  buff[9999];
  4.   read(0, buff, 9999);
  5.   my_putstr(buff);
  6.   return (0);
  7. }


 
Je compile mes deux fonctions, .que je nomme respectivement /dir  & ./test
Je crée ensuite un fichier toto.txt dans lequel j'écris "J'aime la vie"
 
Maintenant, lorsque je veux tester le tout... (r correspond à av[2] qui est censé être l'équivalent de "<" )

Code :
  1. ./dir test r toto.txt


Et rien ne s'affiche.

n°2189437
Profil sup​primé
Posté le 09-05-2013 à 12:36:50  answer
 

Par curiosité, il faudrait dup2(fd, 0) avant de close non ?

n°2189439
Farian
Posté le 09-05-2013 à 13:08:32  profilanswer
 

Bonjour !
 
Cela paraît correct, mais il faudrait que vous nous montriez plus de code, pour voir si le problème ne vient pas d'ailleurs, car dans ce que vous avez posté, je ne vois rien qui puisse poser problème, mais il pourrait être intéressant de voir comment vous mettez en place le mécanisme.
 
Bonne continuation !

n°2189447
maitre2b
La mort vient du Ciel.
Posté le 09-05-2013 à 13:51:09  profilanswer
 

Il n'y a rien de spécail, après avoir vérifier les chaînes de caractères se trouvant dans mon double tableau (char **av), j'envoie à ma fonction ce double tableau où av[2] est la redirection ("r" pour remplacer "<" ) et av[3] le document .txt
 
J'ai déjà réalisé grâce à Farian ">" et je m'attaquais à "<" et donc rien n'a changé mise à part la fonction "redirection_gauche" qui était avant "redirection_droite"
 
Je viens à l'instant de vérifier la valeur de retour de dup2() ... --1
Je ne comprends pas à quoi cela est due.


Message édité par maitre2b le 09-05-2013 à 14:01:10
n°2189456
Farian
Posté le 09-05-2013 à 14:57:07  profilanswer
 

La lecture de vos message a mis le doute dans mes souvenirs et je suis allé faire un tour sur les sites proposés par mon ami ... ( :) )  
 
Comme le suggère djswiti, en effet, la procédure est, a priori, un poil différente  :  
 
 * oldStdin = dup(0); <--- pour sauvegarder
 * close(0);
 * open(fichier, ...); <--- Open prend le premier fd libre, donc 0 dans notre cas.
 * faire le travail
 * close(0);
 * dup(oldStdin); <-- Pour remettre les choses en l'état
 
 
Cela paraît aussi plus logique dans ce sens-là, quand même ... Comme quoi, des souvenirs vieux de 20 ans, cela n'aide pas toujours :)
 
Dites-nous si cela fonctionne mieux ainsi.
 
Bon courage !

mood
Publicité
Posté le 09-05-2013 à 14:57:07  profilanswer
 

n°2191636
maitre2b
La mort vient du Ciel.
Posté le 24-05-2013 à 14:54:54  profilanswer
 

Non ça ne fonctionne toujours pas. :/

n°2191637
zankou75
Posté le 24-05-2013 à 14:59:09  profilanswer
 

Et commen on fait pour faire << svp ???

n°2193517
ptitchep
Posté le 10-06-2013 à 12:53:50  profilanswer
 

zankou75 a écrit :

Et commen on fait pour faire << svp ???


<< ? Si tu penses à >> c'est pareil que pour > sauf que tu ouvres le fichier en mode append (O_APPEND je pense).


---------------
deluser --remove-home ptitchep

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Redirections

 

Sujets relatifs
RedirectionsAménager un shell pour gérer les redirections > et 2>
2 Redirections à partir d'un bouton Java[C++] Problème de redirections des I/O standards
Pb avec les redirections invisibles OVHProbleme de session lors des redirections
Comment faire des redirections avec un menu deroulant ?redirections sous php
Plus de sujets relatifs à : Redirections


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)