utilisation de dup2

utilisation de dup2 - C - Programmation

Marsh Posté le 02-11-2007 à 14:34:59    

voila bjr a ts,
je doi finir en tp en L3 info mais je galere on m demande de faire un mini shell et de faire les redirection dc avec une fnction redirection.....
 
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 g desc2 qui prend la valeur -1 donc une erreur et donc g essaye de creer le fichier avec  creat.... mais ca marche toujours pas car dup2 ne change pas la valeur de desc2... voila merci a tout ceuxx qui vont lire


Message édité par hutch13015 le 02-11-2007 à 15:13:55
Reply

Marsh Posté le 02-11-2007 à 14:34:59   

Reply

Marsh Posté le 02-11-2007 à 14:38:35    

Pour le retour à -1 de open() :

RETURN VALUES
     Upon successful completion, the open()  function  opens  the
     file  and  return  a  non-negative  integer representing the
     lowest numbered unused file  descriptor.  Otherwise,  -1  is
     returned,  errno  is set to indicate the error, and no files
     are created or modified.

 

Utilise donc la variable globale errno pour savoir ce qui ne va pas (avec la fonction perror() par ex.), lorsque open() retourne -1, pour mieux voir ce qu'il se passe.
C'est sans doute un problème de droits, ou de *out mal initialisé.


Message édité par Elmoricq le 02-11-2007 à 14:39:15
Reply

Marsh Posté le 02-11-2007 à 14:50:15    

errno vaut 0 apres le desc2 et apres le dup2 snif  

Reply

Marsh Posté le 02-11-2007 à 15:08:56    

déjà que ton code est pas compilable, j'ai des doutes sur le fait que tu testes bien le retour de tes open

Reply

Marsh Posté le 02-11-2007 à 15:11:56    

pas compilable normal g juste recopier le principal qui ne marche pas que j ai teste avec le debugger ddd. le debugger me donne com valeur de desc1=6,desc2=-1,dup2=-1..........dc oui je connai les retour de mes open

Reply

Marsh Posté le 02-11-2007 à 15:18:48    

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

Reply

Marsh Posté le 02-11-2007 à 15:20:08    

On s'en moque de argv[], cet argument n'est pas utilisé dans la fonction.

Reply

Marsh Posté le 02-11-2007 à 15:21:23    

si car j'ai pas tout mis dans le sujet car si argv[1][0]=='<' je fais une redirection differente que si c '>'
donc ya juste une condition de if que j'ai pas mi pour pas surcharger


Message édité par hutch13015 le 02-11-2007 à 15:21:49
Reply

Marsh Posté le 02-11-2007 à 15:30:50    

Et argv, c'est celui du main() ?
Si oui, alors argv[0] ce n'est pas le fichier d'entrée, sauf si tu veux lire ton propre binaire...

Reply

Marsh Posté le 02-11-2007 à 15:33:31    

non argv [0] ce n'est pas celui du main lol.... je c que ds le main argv[0]c l executable quand j 'appelle la fonction redirection c'est:
redirection (tab,in,out) oùin est le pointeur sur le fichier d 'entre et out sur le fichier de sortie et ou tab est du type char*tab[] et contien la lgne de commande que je renre dans mon mini--shell

Reply

Marsh Posté le 02-11-2007 à 15:33:31   

Reply

Marsh Posté le 03-11-2007 à 09:25:40    

snif pas d'aie possible?????????

Reply

Marsh Posté le 03-11-2007 à 10:55:56    

voila ou j'en suis d'apres quelques aides....
si quelqu'un pouvait encore m'aider..... je sens que j'y suis presque
 
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 votre aide.. j'y suis presque


Message édité par hutch13015 le 03-11-2007 à 11:18:02
Reply

Sujets relatifs:

Leave a Replay

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