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

C Discussion :

Erreur ENOTTY avec fgets


Sujet :

C

  1. #1
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut Erreur ENOTTY avec fgets
    Bonjour,

    J'ai un problème avec fgets(..., stdin) qui échoue lorsque mon programme ne créé pas de terminal. Plus exactement fgets fonctionne si je lance le programme depuis l'EDI ou le terminal, mais pas depuis l'explorateur de fichier.

    En vérifiant errno j'obtiens le code 25 (ENOTTY : Inappropriate I/O control operation). Cela semblerait donc lié au fait qu'il n'y a pas de terminal, mais je ne sais pas comment vérifier que je peux utiliser stdin.

    J'ai tenté la méthode bourrin en affichant toutes les valeurs des membres de la structure FILE, mais je n'ai rien remarqué.

    Sur un site j'ai vu ce test utilisé : (fcntl(fileno(stdin), F_GETFL) != -1 || errno != EBADF) mais ça ne m'a pas permis de détecter le problème.

    Voici le code utilisé :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            char buffer[BUFSIZ] = {0};
     
    //      if (fcntl(fileno(stdin), F_GETFL) != -1 || errno != EBADF) {
    //          syslog(LOG_ERR, "file descriptor seems valid");
    //      } else {
    //          syslog(LOG_ERR, "detected invalid file descriptor");
    //          
    //      }
     
            if (!fgets(buffer, BUFSIZ, stdin)) {
                syslog(LOG_ERR, "Errno: %d", errno);
                //throw std::runtime_error("fgets() failure");
            }

    Merci,
    Ceylo

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Spootnik Voir le message
    En vérifiant errno j'obtiens le code 25 (ENOTTY : Inappropriate I/O control operation). Cela semblerait donc lié au fait qu'il n'y a pas de terminal, mais je ne sais pas comment vérifier que je peux utiliser stdin.
    En posix, tu peux essayer isatty sur fileno(stdin).
    Sous windows, tu peux essayer la fonction GetStdHandle.

  3. #3
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    Merci ça fonctionne ! (sous Mac OS X, pas encore testé sous Windows)

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

Discussions similaires

  1. Erreur de segmentation avec fgets
    Par momoski dans le forum Débuter
    Réponses: 29
    Dernier message: 02/11/2013, 11h41
  2. Erreur EACCESSVIOLATION avec des compsts créés dynamiquement
    Par tsikpemoise dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/02/2004, 19h05
  3. Erreur fréquente avec ASP et IIS
    Par Community Management dans le forum ASP
    Réponses: 2
    Dernier message: 11/02/2004, 22h20
  4. Problème avec fgets et tube...
    Par tchingoo dans le forum POSIX
    Réponses: 5
    Dernier message: 22/08/2003, 17h03
  5. Erreurs IIS avec Multiples Frames avec xmlrad
    Par powerlog dans le forum XMLRAD
    Réponses: 4
    Dernier message: 01/07/2003, 13h15

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