Redirections

Redirections - C - Programmation

Marsh Posté le 04-05-2013 à 01:50:55    

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.

Reply

Marsh Posté le 04-05-2013 à 01:50:55   

Reply

Marsh Posté le 04-05-2013 à 01:59:03    

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 !

Reply

Marsh Posté le 04-05-2013 à 02:04:17    

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

Reply

Marsh Posté le 09-05-2013 à 02:34:18    

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() ?.
 

Reply

Marsh Posté le 09-05-2013 à 05:38:53    

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 :)

Reply

Marsh Posté le 09-05-2013 à 12:01:44    

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.

Reply

Marsh Posté le 09-05-2013 à 12:36:50    

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

Reply

Marsh Posté le 09-05-2013 à 13:08:32    

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 !

Reply

Marsh Posté le 09-05-2013 à 13:51:09    

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
Reply

Marsh Posté le 09-05-2013 à 14:57:07    

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 !

Reply

Marsh Posté le 09-05-2013 à 14:57:07   

Reply

Marsh Posté le 24-05-2013 à 14:54:54    

Non ça ne fonctionne toujours pas. :/

Reply

Marsh Posté le 24-05-2013 à 14:59:09    

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

Reply

Marsh Posté le 10-06-2013 à 12:53:50    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed