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

Raspberry Pi Discussion :

Probleme de fopen() et de kill


Sujet :

Raspberry Pi

  1. #1
    Membre actif

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : février 2012
    Messages : 53
    Points : 219
    Points
    219
    Par défaut Probleme de fopen() et de kill
    Bonjour à tous,

    Je viens vers le forum car mes recherches ne m'ont pas apportées de grand résultats.

    J'ai développé une application console en C sous Raspberry 3B+ (Raspbian)
    Cette application lit des donnée en I2C, compile les données, et les écrit dans un fichier .txt sur un SSD.

    Jusque là, tout va bien.

    Comme cette application devrait tourner en continu, afin de parer au coupure de courant, plantage et autres aléas
    informatique, j'ai installer l'application au démarrage de rasbian.

    Donc à chaque démarrage, l'application démarre et tourne en tâche de fond (elle n'est pas visible dans une console.
    (je sais pas encore comment faire..... mais je cherche..........)

    Si je modifie l'application (avec Geany), je la compile et pour la tester, j’arrête le processus qui tourne
    (en connaisant son PID avec pidof xxx puis kill xxx)

    Puis je relance l'application dans une console avec ./Oled (nom de l'application)

    Seulement, lorsque l'application tente d'ouvrir le fichier texte, la fonction fopen() retourne un NULL .

    Si j’empêche le démarrage en tâche de fond, que je lance l'application directement depuis une console,
    je peux l’arrêter (ctrl-c) et la redémarrer sans problème.
    Je n'ai jamais ce problème de fichier.

    Mes recherche me disent que "kill xxx" sans spécifier de signal, envoi le signal SIGTERM qui demande au processus de terminer
    toutes les fonction proprement (donc de nettoyer les mémoire et de fermer les FILE* ???)..
    Mais cela ne fonctionne pas (bien ??).

    Pour info ,
    un redémarrage de rasbian est necessaire pour solutionner le problème..(Heureusement
    le disque est monter comme suit :
    /dev/sda2 on /home/pi/ssdkesu type ext3 (rw,relatime)


    Faut-il intégrer une gestion des signaux dans l'application ?
    Faut-il envoyer un autre signal avec KILL ?
    Comment arreter une application qui tourne en tache de fond autrement que par KILL?

    Si quelqu'un avait une suggestion

    Merci d'avance

    Michel

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    24 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 24 516
    Points : 180 668
    Points
    180 668
    Billets dans le blog
    50
    Par défaut
    Bonjour,

    Votre programme agit comme un service (ou daemon dans le monde Linux), du coup, vous devriez l'intégrer comme tel (et ainsi, permettre une extinction avec une commande telle que service monProgramme stop).
    Et pour la réponse à votre problème, c'est lié au fait qu'il ne ferme pas proprement le fichier (je ne vois pas pourquoi il y arriverait, vu comment il est tuer). Du coup, il faudrait intégrer une gestion des signaux dans votre programme pour mieux gérer ce cas.
    Finalement, pour les tests, ne lancez pas l'application automatiquement au démarrage du RPi, mais manuellement dans un terminal. Ainsi, vous aurez la sortie. Une fois les tests finis, vous pourrez faire un démarrage automatique .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éprouvé

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    novembre 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : novembre 2006
    Messages : 341
    Points : 1 038
    Points
    1 038
    Par défaut
    Salut Michel,

    Citation Envoyé par michel.semal Voir le message
    ...
    Comme cette application devrait tourner en continu, afin de parer au coupure de courant, plantage et autres aléas
    informatique, j'ai installer l'application au démarrage de rasbian.

    Donc à chaque démarrage, l'application démarre et tourne en tâche de fond
    ....
    Seulement, lorsque l'application tente d'ouvrir le fichier texte, la fonction fopen() retourne un NULL .
    ....

    Mes recherche me disent que "kill xxx" sans spécifier de signal, envoi le signal SIGTERM qui demande au processus de terminer
    ....
    Tu ne donnes pas beaucoup de détails ....

    Je stoppe très souvent mon application qui est lancée au démarrage du Pi afin de tester une nouvelle version.
    C'est une application Java avec plusieurs threads (Web, Python, bash) et utilisations de ressources comme des fichiers.

    Je cherche son pid de base avec la commande ps -eax suivi d'un kill -9 avec le numéro du pid.
    Je n'ai jamais eu de soucis.
    Je teste ma nouvelle version, la corrige et termine par un sudo reboot.

    Par contre je n'utilise pas de service, mais je dépose un script bash de démarrage dans /etc/rc.local.
    Le script de démarrage se trouve dans un de mes répertoires, avec mes classes Java, mes scripts Python et mes fichiers de configuration:un cd est donc nécessaire dans le script démarré.
    En lançant une application ainsi, il y a le risque que tout le système ne soit pas initialisé, comme le WiFi.
    Il suffit de faire une pause dans le script de lancement ou dans l'application au début.

    Un service peut-être configuré pour redémarrer automatiquement. Donc .....
    Il faudrait aussi vérifier ce qui se passe si tu lances par erreur deux fois ton application.

    Pour le fichier qui retourne un NULL, ce n'est pas clair.
    Es-tu dans le bon répertoire? Est-il réécrit à chaque fois? As-tu des flush() ou fflush()? Fermes-tu ton fichier? Utilises-tu un append()?
    Est-ce un fichier .txt que tu pourrais consulter avec un cat, avant ou après le kill -9.

    Cordialement

  4. #4
    Membre actif

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : février 2012
    Messages : 53
    Points : 219
    Points
    219
    Par défaut La suite
    Bonjour,

    Merci de vos réponses,

    Pour littleWhite,
    Je soupçonnait un phénomène du genre, cependant mes recherches m'avaient amenées à croire que KILL pid envoyait un signal vers le processus et lui demandait de terminer proprement.
    Si dans une console j'utilise "ctrl-x" le programme en question s'arrète comme il faut (en fermant les connections ) . Donc si je relance l'application depuis cete console, il n'y a pas de problèmes.

    Je vais donc voir pour intégrer une gestion des signaux à mon programme.

    Pour boijea,
    Le démarrage de mon application est assuré par un bash (/home/pi/bin/name.sh) ce batch est lancé par le fichier /etc/rc.local

    Un second démarrage de mon logiciel entraine des erreurs d’exécution due au contrôle du fonctionnement l'I2C et de la gestion des fichier.
    Comme le logiciel se synchronise sur l'horloge du RPI, les lectures du bus i2c sont pertubée et le logiciel s’arrête car le retour des fonction de lecture n'est pas correct( code d'erreur généré par mon logiciel sir i2c ne répond pas correctement ou pas assez vite) . Je n'arrive pas à créer une erreur de lecture de fichier lorsque le test de deux ou trois occurrence du logiciel sont lancées. C'est toujours la lectures de l'i2c qui bloque(en premier, ce qui est logique, car dans la boucle je lit d'abord l'i2c puis j’écris dans le fichier).

    Pour info, la séquence du logiciel est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    initialisation du systeme
    synchro sur l'horloge, 
    Boucle infinie
        Toutes les 10s:
                 lecture sur l'i2c des paramètres (4x)
                 Calcul de la moyenne 
        toutes les minutes
                Ouverture du fichier en mode append
                Ecriture de la date et des valeur moyennes
                Fermeture du fichier
        retour à la boucle
    fin
    Pour info j'ai deja essaye de faire a commande KILL pid en dehors du moment ou le syteme ecrit sur le disque (par exe, h:m:20) mais le problème persiste.


    Je vais donc voir pour intégrer une gestion des signaux dans mon programme ainsi d’ailleurs que de vérifier si une autre instance de ce logiciel tourne avant de démarrer la séquence de lecture

    Merci , je continue mes recherches.......

  5. #5
    Membre actif

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : février 2012
    Messages : 53
    Points : 219
    Points
    219
    Par défaut Résolu, la solution
    Bonjour aux lecteurs

    Concernant ce problème de fopen(), la solution etait evidente, mais je decouvre les arcanes de linux et je reflexe
    (si si le verbe reflexer existe puisque je viens de l'inventer) encore en windows.

    Si une application est lancée depuis /etc/rc.local, sans précaution, elle est démarrée en mode root!!!!!
    Donc les fichier créer par cette apllication son de type :
    -rw-r--r-- 1 root root.......................

    Donc lorsque je suis connecté en tant que "pi", ben j'ai pas accès à ce fichier.......

    si je démarre mon application avec
    je plante. (en ouverture du fichier
    par contre :
    fonctionne très bien.......

    voila voila voila...........

    Je devrais poser mes post à moi -même cela m'éviterai de dire trop de bêtises en public.....

    Un grand merci à LittleWhite et boijea,


    Michel

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

Discussions similaires

  1. [OpenGL ES]Probleme avec fopen
    Par crischprolch dans le forum OpenGL
    Réponses: 6
    Dernier message: 09/04/2008, 14h10
  2. probleme avec fopen !
    Par arnaud036 dans le forum Débuter
    Réponses: 12
    Dernier message: 27/02/2008, 15h05
  3. Probleme avec fopen()
    Par Panaméen dans le forum Bibliothèque standard
    Réponses: 4
    Dernier message: 12/12/2007, 21h25
  4. Probleme avec fopen sous linux
    Par rivieremathieu dans le forum C
    Réponses: 2
    Dernier message: 16/06/2006, 12h04
  5. Probleme fopen et password
    Par Hesiode dans le forum Langage
    Réponses: 1
    Dernier message: 07/03/2006, 11h16

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