1. #1
    Membre à l'essai
    Homme Profil pro
    etudiant info
    Inscrit en
    mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : etudiant info

    Informations forums :
    Inscription : mars 2016
    Messages : 20
    Points : 20
    Points
    20

    Par défaut Cause erreur de fgets(stdin).

    Bonjour, j'ai récemment récupéré un code C assez conséquent. A l’exécution, un appel à fgets sur stdin renvoie NULL et ferror(stdin) renvoie true ; toutefois je ne trouve pas de piste pour interpréter cette erreur ! Merci d'avance.

  2. #2
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 123
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 123
    Points : 3 282
    Points
    3 282

    Par défaut

    man fgets

    Si ton système est compatible POSIX errno est mis à jour, donc strerror ou perror te donneront les détails.

  3. #3
    Membre à l'essai
    Homme Profil pro
    etudiant info
    Inscrit en
    mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : etudiant info

    Informations forums :
    Inscription : mars 2016
    Messages : 20
    Points : 20
    Points
    20

    Par défaut

    Citation Envoyé par Matt_Houston Voir le message
    man fgets

    Si ton système est compatible POSIX errno est mis à jour, donc strerror ou perror te donneront les détails.
    Ok j'étais pas sûr, mon man ne me parle pas de errno pour fgets. Il m'indique interrupted system call. Il est possible que mon processus reçoive un SIGCHLD pendant le fgets, est-ce que cela pourrait être la cause de l'erreur ?

  4. #4
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 123
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 123
    Points : 3 282
    Points
    3 282

    Par défaut

    Ah, j'imagine que oui ; installe un handler et tu seras fixé.

  5. #5
    Membre à l'essai
    Homme Profil pro
    etudiant info
    Inscrit en
    mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : etudiant info

    Informations forums :
    Inscription : mars 2016
    Messages : 20
    Points : 20
    Points
    20

    Par défaut

    Citation Envoyé par Matt_Houston Voir le message
    Ah, j'imagine que oui ; installe un handler et tu seras fixé.
    Oui je pense que c'est justement le handler qui fait planter le fgets. Mais comment puis-je régler ce problème si j'ai à la fois besoin de mon fgets et de mon handler ?

  6. #6
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 123
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 123
    Points : 3 282
    Points
    3 282

    Par défaut

    Si tu contrôles le handler, tu sais si c'est le signal qui a produit l'erreur. Tu peux donc lever un drapeau et rappeler fgets dans la foulée une fois que la séquence principale a récupéré la main.

  7. #7
    Membre à l'essai
    Homme Profil pro
    etudiant info
    Inscrit en
    mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : etudiant info

    Informations forums :
    Inscription : mars 2016
    Messages : 20
    Points : 20
    Points
    20

    Par défaut

    Citation Envoyé par Matt_Houston Voir le message
    Si tu contrôles le handler, tu sais si c'est le signal qui a produit l'erreur. Tu peux donc lever un drapeau et rappeler fgets dans la foulée une fois que la séquence principale a récupéré la main.
    Ok je vois peut-être l'idée (activer un booléen avant le fgets et le désactiver à la fin) même si je ne vois pas comment on peut être sûr à 100%.
    De plus, en constatant le fonctionnement de mon shell, je constate que le fgets semble bloquer le handler SIGCHLD qui est pris en compte à la fin du fgets, le fgets est donc prioritaire et je me demande comment cela est implémenté.

  8. #8
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 609
    Points : 3 094
    Points
    3 094

    Par défaut

    Bonjour,

    Si on veut un Handler de signal qui ne provoque aucun arrêt dans l'application, le plus "simple" c'est :
    * créer un thread qui ne fait rien for(;;) { wait(); }.
    * masquer tous les signaux pour tous les threads, sauf pour celui là.
    * Quand le signal va arriver, c'est forcément le "wait()" qui sera celui interrompu (sinon c'est une fonction quelconque d'un quelconque thread qui exécute une commande "cancellable" telle que que l'est fgets()).
    * Les handlers de signaux font normalement leur boulot (ils seront toujours sur le thread qui ne fait rien.)

Discussions similaires

  1. Cause erreur d'exécution
    Par cluster26 dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/03/2011, 13h52
  2. cause erreur iostream.h
    Par bassemb dans le forum C++
    Réponses: 2
    Dernier message: 10/12/2008, 14h44
  3. recherche cause erreur EAccessViolation
    Par oiapoque dans le forum Delphi
    Réponses: 12
    Dernier message: 20/06/2006, 11h07
  4. [Dates] fgets(STDIN) timeout ?
    Par FFF dans le forum Fonctions
    Réponses: 1
    Dernier message: 04/10/2005, 11h58
  5. [ASP]resultSet = "" cause erreur???
    Par DEC dans le forum ASP
    Réponses: 2
    Dernier message: 19/07/2004, 18h56

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