comment restaure les entree clavier et sortie ecran en c sous unix apres les avoir fermee avec close(0); et close(1); ????
comment restaure les entree clavier et sortie ecran en c sous unix apres les avoir fermee avec close(0); et close(1); ????
les filedescriptor 0 et 1 n'ont pas besoin d'etre ouvert, il est par consequent inutile de les fermer...
j'avoue ne pas savoir ce quil se produit si on les fermes, mais je sais que j'ai deja write sur 1 et read sur 0 sans open ni close et je n'ai jamais eu de probleme
fermer les entrées stdin et stdout permet de les rediriger (en mettant un autre fichier à la place)
ainsi, on redirige, par exemple, tout ce qui est écrit sur stderr dans un fichier à part, ou tout ce qui saisi dans stdout dans un socket.
pour les rétablir, tu peux peut-être essayer de copier le fichier avant de le supprimer.
stdin doit être un FILE *, essaie peut-être de faire
FILE tmpStdin = & stdin; mais bon chuis pas sur du tout que ça marchera
Salut,
Il y a un moyen tout simple : dup() et dup2()
Ces deux fontions crées une copie d'un descripteur de fichier.
+ d'info ici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int old_stdin, old_stdout; old_stdin = dup (0); /* On copie le descripteur de stdin */ old_stdout = dup (1); /* On copie le descripteur de stdout */
http://www.developpez.net/forums/viewtopic.php?t=45287
a++
si ça marche mais avant de fermer les descripteurs de fichier STDIN :0,STDOUT : 1 et STDERR : 2 il faut les duplique avec la fonction dup() qui prend en argument le descripteur et renvoie un autre descripteur donc apres tu peut fermet le descripteur 0 ou 1 ou 2 les rediriger vers les tes propres fichiers aprés tu les restore en utilisant les descripteurs que tu as reçu avec dup()
je persiste a ne pas voir l'utiliter de fermer les 3 fd standard, dup et dup2 sont assez suffisante pour ne pas avoir a le faire
close (STDOUT_FILENO);
dup (SocketDescriptor);
printf ("ça marche");
désormais, le texte de printf est envoyé dans la socket.
dans un cas comme celui là, l'interet peut-être limite (pourquoi pas faire un write ?)
mais ça permet d'utiliser d'autres programmes independants dans le sien. en redirigeant stdin et stdout, comment ferais-tu autrement ?
OuiOui
Fatalis a dit
quand tu tape à l'invite de shellje persiste a ne pas voir l'utiliter de fermer les 3 fd standard, dup et dup2 sont assez suffisante pour ne pas avoir a le faire
tu liste les fichier de ton répertoire et la sortie par défaut est STDOUT(écran)
Code : Sélectionner tout - Visualiser dans une fenêtre à part ls
mais si tu veux écrire le résultat de ls dans un FICHIER à toi tu redirige sa sortie dans celui si ce qui veux dire que il y a férmeture de STDOUT et rédirection de celui-ci
écriit dans ton fichier FICHIER ce qui aurait écrit sur l'écran
Code : Sélectionner tout - Visualiser dans une fenêtre à part ls > FICHIER
quant au programme en C imagine que tu veux créer un programme(1) qui va lancer un autre programme(2) et que le 2 ecrit des messages d'erreur sur l'écran tu peux vouloir que ses messages soient rédiriger vers un fichier que le programme 1 à créé pour être utilisé après .
voila l'utilité de fermer les descripteur standard 0,1,2 mon cher Fatalis
l'interet est par exemple pour faire communiquer deux appli par pipe. Il faut bien ferme les entrees/sorties avant d'attacher le pipe aux entrees/sortie, c'est alors que le pipe devient la nouvelle entree/sortie standard du programme. Maintenant il est tout a fait possible de ne pas les fermer et d'utiliser les fonction fprintf, fscanf, etc. avec le pipe comme argument.Envoyé par Fatalis
Je diraits avec la fonction : char *ttyname ( int desc );
qui te retourne le nom du tty quue tu conserves avant de fermer 0-2. Apres il suffit de re ouvrir le nom du tty precedent.
je confirme normalement avec dup() ca marchera...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager