Exercice système

Exercice système - C - Programmation

Marsh Posté le 18-08-2011 à 20:24:53    

bonjour a tous,
 
 
 
est il possible  de rétablir l'état des descripteurs STDIN_FILENO  apres avoir dupliquer son descripteur ?
 
je ne sais pas si fermé le descripteur dupliquer suffit !
 
voila, merci a tous ceux qui pourront m'aider ou m'eclairer un peu :)


Message édité par mdj le 20-08-2011 à 20:26:33
Reply

Marsh Posté le 18-08-2011 à 20:24:53   

Reply

Marsh Posté le 18-08-2011 à 20:28:29    

Oui mais non. Ici, on t'aidera sûrement, mais faire ton boulot à ta place ? Certainement pas.


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 18-08-2011 à 20:38:57    

bonsoir,
je n'ai jamais demandé qu'on fasse le boulot a ma place , mais des fois il n'ya pas 36 solutions ! ce n'est pas un devoir que je dois rendre, je le fais pour moi, donc j'ai interet a comprendre et non a avoir une solution !
 
je souhaite juste qu'on m'eclaire un peu !

Reply

Marsh Posté le 19-08-2011 à 10:29:18    

1) la fonction bidule tente de lire sur le descripteur de fichier STDIN_FILENO L octets dans buf.  
 
Si la lecture a réussi à lire au moins un octet, elle écrit l'ensemble des octets lu dans les 2 descripteurs de fichier STDOUT_FILENO et STDERR_FILENO.
 
 
Et ceci en boucle jusqu'à ce que la fonction read n'arrive plus à lire d'octets.
 
 
STDIN_FILENO , STDOUT_FILENO et STDERR_FILENO sont des constantes definies et ayant pour valeurs 0 , 1 et 2 ( entree standard, sortie standard, sortie d'erreur ). http://www.linux-france.org/articl [...] din-3.html
 
Cela signifie donc que ta fonction lit sur l'entrée standard , et écrit le résultat lu sur la sortie standard et sur la sortir d'erreur également.
 
2) Pour se servir d'un tel code pour recopier le contenu d'un fichier dans un autre et sur la sortie standard, je te conseille de regarder du coté des fonctions close, et dup / dup2 . http://www.linux-kheops.com/doc/ma [...] up2.2.html    http://www.linux-kheops.com/doc/ma [...] ose.2.html . Avec la combinaison de ces 2 fonctions, tu devrais pouvoir effectuer ce qui est demandé.
 

Reply

Marsh Posté le 19-08-2011 à 15:56:25    


ce que j'ai fait:
j'ouvre avec open  les fichiers f1 et f2 ;
ensuite avec dub2 , je fais dub2(STDIN_FILENO , f1),  donc je duplique l'entrée . de meme pour f2 et la sortie d'erreur.
 
par contre avec la fonction   close() ? c'est pour fermer SDIN_FILENO  et STDERR_FILENO une fois dupliquer  ? il se passerai quoi sinon surtout dans le cas de STDIN parceque je dois lire dessus!  
 
 
je te remercie   beaucoup xilebo, c'est vraiment très clair

Reply

Marsh Posté le 19-08-2011 à 16:14:05    

regarde la page d'aide sur dup/dup2 que je t'ai donnée, soit tu fais un dup précédé d'un close, soit tu fais dup2 qui fait implicitement le close.
 
Quelques exemples : http://stackoverflow.com/questions [...] up-or-dup2
 
 
 

Reply

Marsh Posté le 19-08-2011 à 17:01:53    

parfait !
 
pour retablir l'etat les descripteurs STDIN STDOUT et STDERR,  
il suffit pas de refaire  les duplications dans le sens inverse !?
par exemple :
close(f1); ou close(0) // f1 etait associer  a STDIN_FILENO
dup(STDIN_FILENO);
 
 
ou il suffit juste d'un close(f1);


Message édité par mdj le 19-08-2011 à 17:14:08
Reply

Marsh Posté le 22-08-2011 à 14:15:28    

enfin trouvé !
 
pour ceux que ca peux aider , si vous fermer une entree ou sortie satandard: ex : close(0),  pour STDIN_FILENO il n'est pas possible de la reouvrir comme un fichier, elle est ouverte au demarrage du systeme.
 
pour la conserver , il suffit de la dupliquer avant de la fermer !
ex:  
dup(STDIN_FILENO);
close(0); // et surtout pas close(STDIN_FILENO) car vous fermeriez   tous les descriteurs vers STDIN_FILENO !
 
et pour la recuperer une fois le desc 0 utilisé
 
il suffit de fermer a nouveau le desc 0 et dupliquer STDIN_FILENO
ex:
close(0);
dup(STDIN_FILENO);
 
voila et merci encore a xilebo !


Message édité par mdj le 22-08-2011 à 14:17:41
Reply

Sujets relatifs:

Leave a Replay

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