IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

descripteur stdin stdout


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 193
    Points : 66
    Points
    66
    Par défaut descripteur stdin stdout
    comment restaure les entree clavier et sortie ecran en c sous unix apres les avoir fermee avec close(0); et close(1); ????

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    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

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il y a un moyen tout simple : dup() et dup2()

    Ces deux fontions crées une copie d'un descripteur de fichier.

    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 */
    + d'info ici:
    http://www.developpez.net/forums/viewtopic.php?t=45287

    a++

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 89
    Points : 69
    Points
    69
    Par défaut
    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()

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    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

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    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

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2002
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 89
    Points : 69
    Points
    69
    Par défaut Reponse à Fatalis
    Fatalis a dit
    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
    quand tu tape à l'invite de shell
    tu liste les fichier de ton répertoire et la sortie par défaut est STDOUT(écran)
    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
    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

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Fatalis
    Citation Envoyé par moi meme
    dup et dup2 sont assez suffisante
    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.

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Mars 2002
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    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.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 24
    Points : 25
    Points
    25
    Par défaut ...
    je confirme normalement avec dup() ca marchera...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. descripteur de stdin != 0 ?
    Par neuro6 dans le forum Linux
    Réponses: 9
    Dernier message: 01/11/2007, 11h50
  2. pipe stdin stdout
    Par onaipadesmickey dans le forum Linux
    Réponses: 1
    Dernier message: 22/08/2007, 17h20
  3. Redirection stdin / stdout
    Par Neitsa dans le forum Linux
    Réponses: 3
    Dernier message: 17/02/2007, 16h57
  4. Code Win32 vers Linux (stdin/stdout)
    Par MonsieurAk dans le forum Linux
    Réponses: 2
    Dernier message: 26/04/2006, 18h27
  5. flux stdin/stdout [2 questions]
    Par MonsieurAk dans le forum C
    Réponses: 3
    Dernier message: 20/12/2005, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo