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

Linux Discussion :

Envoi de commande à un démon via echo


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Par défaut Envoi de commande à un démon via echo
    Bonjour à tous,

    je développe depuis peu sous linux (en C) et j'ai besoin d'un peu d'aide...

    Voilà, j'ai besoin de coder un démon qui attendrait des commandes de divers scripts et éventuellement de l'utilisateur.
    Pour cela, je pensais utiliser un socket unix, qui me créerait une entrée dans le répertoire /tmp, ce qui permettrait aux scripts d'utiliser des commandes comme "echo 'start' > /tmp/customdaemon

    Le problème, c'est que je n'arrive pas à coder cela. J'ai créé la socket, fait un bind sur une structure sockaddr_un contenant le path (jusque là, ça fonctionne), mais je n'arrive pas à recevoir quoique ce soit.
    lorsque l'utilisateur tape "echo 'start' > /tmp/customdaemon, il reçoit l'erreur "No such device or address", alors que le 'fichier' /tmp/customdaemon est bien créé (j'ai mis les droits en écriture pour tous).

    Pouvez vous m'aiguiller svp?

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    je te conseillerais l'utilisation de signaux...

    comme ça tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kill -SIGUSR1 `cat /var/run/mondemon.pid`

    et le tour est joué...

    si tu as aussi besoin de transmettre des informations, utilises des pipes (uniquement cette machine) ou des sockets (tout le réseau)
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Par défaut
    Merci pour la réponse.

    J'ai besoin de passer des commandes dont plusieurs avec des paramètres, je ne vais donc pas utiliser de signaux.
    Par contre, pour les pipes, comment fait-on pour lui passer des commandes? Je croyais que les pipes n'étaient possibles que lorsque l'on créait le démon en même temp...

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par g_d_u_m
    J'ai besoin de passer des commandes dont plusieurs avec des paramètres, je ne vais donc pas utiliser de signaux.
    Par contre, pour les pipes, comment fait-on pour lui passer des commandes? Je croyais que les pipes n'étaient possibles que lorsque l'on créait le démon en même temp...

    en fait le pipe ouvre aussi des descripteurs de fichiers... il suffit donc de les stocker dans un certain fichier pour pouvoir ensuite y accéder quand tu lanceras son script


    nb: perso, je l'ai jamais fait en shell, mais en C, on peut passer les descripteurs de fichiers en ligne de commande, et ça marche bien
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Par défaut
    ok merci,

    j'ai commencé à regarder d'un peu plus près les pipes, je crois que je vais m'en sortir.
    Je poste ici ce que j'ai compris, ça sera peut-être utile à quelqu'un d'autre:

    il faut créer le pipe avec la foncton int mkfifo(const char *pathname, mode_t mode) (avec pathname="/tmp/essai" par exemple)

    Ensuite on peut ouvrir le descripteur avec la fonction classique int open(const char *pathname, int flags) (en précisant O_RDONLY)

    Puis on attend les messages en utilisant la fonction ssize_t read(int fd, void *buf, size_t count)

    Un script peut alors envoyer des messages au programme en redirigeant simplement la sortie standard vers le descripteur en faisant par exemple echo "Message à transmettre" > /tmp/essai


    Attention cependant, tant que l'autre bout du pipe n'est pas ouvert, on est bloqué:
    - le programme bloque sur la fonction open jusqu'à ce qu'un script écrive vers /tmp/essai
    - le script écrivant vers /tmp/essai bloque si le programme a quitté sans détruire le descripteur /tmp/essai

    Bon codage à tous.

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Comment tu gères les accès concurrents dans ce cas là ? Si tu as 2 utilisateurs ou scripts qui écrivent dans le pipe, il se passe quoi ? Sinon, tu as la solution simple qui consiste à lire les fichiers qui se trouvent dans un certain répertoire. Comme ça, si tu as plusieurs scripts qui veulent utiliser ton daemon, ils écrivent chacun dans leur propre fichier.

  7. #7
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par _Mac_
    Comment tu gères les accès concurrents dans ce cas là ? Si tu as 2 utilisateurs ou scripts qui écrivent dans le pipe, il se passe quoi ? Sinon, tu as la solution simple qui consiste à lire les fichiers qui se trouvent dans un certain répertoire. Comme ça, si tu as plusieurs scripts qui veulent utiliser ton daemon, ils écrivent chacun dans leur propre fichier.

    rcs sur le fichier où l'on veut écrire
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Par défaut
    tu peu tout a fait ouvrir le pipe en mode "non-bloquant (flag A_SYNC)", ainsi ton daemon vie sa vie sans attendre bloqué sur la lecture.
    Ce flag t'impose une gestion des signaux afin d'appeller ta fonction de traitement lors d'un evenement "a lire"

  9. #9
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Citation Envoyé par gorgonite
    rcs sur le fichier où l'on veut écrire
    rcs, c'est quoi donc ?

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par _Mac_
    rcs, c'est quoi donc ?

    fr : http://perso.limsi.fr/zabeth/unix/rcs.php

    en : http://www.gnu.org/software/rcs/rcs.html
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

Discussions similaires

  1. envoie de commande via GPIB
    Par rebele dans le forum C
    Réponses: 2
    Dernier message: 14/10/2008, 14h31
  2. Réponses: 0
    Dernier message: 08/02/2008, 10h10
  3. Envoi de fichier en attachement via la commande mail
    Par insupien dans le forum Linux
    Réponses: 3
    Dernier message: 21/08/2006, 20h36
  4. [Comm] envoi des commandes via interface RS232
    Par bob75018 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 16/01/2006, 17h22
  5. [MFC] Envoi de commandes clavier
    Par Kevgeii dans le forum MFC
    Réponses: 2
    Dernier message: 07/01/2004, 15h36

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