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

Bibliothèques, systèmes et outils C Discussion :

Programmation d'un démon Unix avec stop/start commandes


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Membre régulier Avatar de dlecteur
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Points : 95
    Points
    95
    Par défaut Programmation d'un démon Unix avec stop/start commandes
    Bonjour a tous,

    je suis entrain de développer un petit démon (Unix/Linux) en C et je voudrais avoir les fonctionnalités suivantes: (a partir d'une console)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lecteur@unix>mondemon start // pour lancer le démon
    lecteur@unix>mondemon stop // pour stopper le démon
    lecteur@unix>mondemon show // Une commande qui permet de lancer un certain traitement.
    Si quelqu'un connait la démarche a suivre pour implementer cette fonctionnalité, Merci de la partager avec moi.

    Cordialement.
    The journey of a 1000 miles always begins with
    the first step...

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonsoir,

    Un truc du style :
    int main(int argc, char *argv[]) {
    if (argv[1] = "start") { do_start(); }
    if (argv[1] = "stop") { do_stop(); }
    if (argv[1] = "restart") { do_restart(); }
    }
    ça n'irait pas ?

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Ce sont deux choses différentes. Si tu veux implémenter start et stop pour le classer avec les autres services des différents runlevels d'Unix, va d'abord faire un tour dans /etc/init.d : tu t'apercevras qu'il s'agit en fait de scripts Shell qui, eux, gèrent les différents mots-clés et appellent les exécutables en conséquence, en leur demandant de « démoniser », mais sans qu'il y ait d'interface standard pour cela.

    Ensuite, pour que le processus devienne réellement « dæmon », il faut en fait s'émanciper. Pour cela, tu commences par forker, de façon à ce que le processus en cours puisse se terminer et rendre la main au Shell. Mais avant qu'il le fasse, le fils doit faire un certain nombre de préparatifs de routines pour gérer son état. Le premier consiste à appeler setsid() de façon à démarrer une nouvelle session distincte du père du il sera le leader. Accessoirement, cela lui permet de se détacher de son terminal, puis la mort de son père rattachera automatiquement le processus à init (no 1).

    Le reste consiste à fermer les fichiers standard, à intercepter les bons signaux et à ignorer les autres, etc.


    http://www.enderunix.org/docs/eng/daemon.php
    http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

  4. #4
    Membre régulier Avatar de dlecteur
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par tamplan Voir le message
    Bonsoir,

    Un truc du style :

    ça n'irait pas ?
    Non ca ne marche pas c'est un daemon (une fois que le main est parti c'est fini )
    The journey of a 1000 miles always begins with
    the first step...

  5. #5
    Membre régulier Avatar de dlecteur
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ce sont deux choses différentes. Si tu veux implémenter start et stop pour le classer avec les autres services des différents runlevels d'Unix, va d'abord faire un tour dans /etc/init.d : tu t'apercevras qu'il s'agit en fait de scripts Shell qui, eux, gèrent les différents mots-clés et appellent les exécutables en conséquence, en leur demandant de « démoniser », mais sans qu'il y ait d'interface standard pour cela.

    Ensuite, pour que le processus devienne réellement « dæmon », il faut en fait s'émanciper. Pour cela, tu commences par forker, de façon à ce que le processus en cours puisse se terminer et rendre la main au Shell. Mais avant qu'il le fasse, le fils doit faire un certain nombre de préparatifs de routines pour gérer son état. Le premier consiste à appeler setsid() de façon à démarrer une nouvelle session distincte du père du il sera le leader. Accessoirement, cela lui permet de se détacher de son terminal, puis la mort de son père rattachera automatiquement le processus à init (no 1).

    Le reste consiste à fermer les fichiers standard, à intercepter les bons signaux et à ignorer les autres, etc.


    http://www.enderunix.org/docs/eng/daemon.php
    http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
    Merci, mais c'est cela que je fais exactement pour créer mon démon. Concernant les runlevels je veux pas le mettre la dedans, c'est juste un démon qu'on lance comme on lance un mysqld ou un httpd. Mais ce que je n'arrive pas a comprendre c'est comment interagir avec mon démon via ligne de commande, j'ai déjà regardé pas mal de docs et c'est pour cela que je suis ici.
    The journey of a 1000 miles always begins with
    the first step...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par dlecteur Voir le message
    Merci, mais c'est cela que je fais exactement pour créer mon démon. Concernant les runlevels je veux pas le mettre la dedans, c'est juste un démon qu'on lance comme on lance un mysqld ou un httpd.
    Justement, httpd et mysqld sont typiquement lancés par ces scripts et c'est bien eux qui gèrent les arguments qui t'intéressent.

    Un détail notable toutefois : apachectl. C'est en fait un client du dæmon déjà en place comme il en existe d'autres, pour wpa_supplicant, par exemple. C'est ce client qui reçoit les commandes et qui communique, généralement via un socket UNIX, avec le dæmon qui par définition n'est rattaché à aucune console.

    Une discussion sur le même sujet : http://www.developpez.net/forums/d10...ert-lutiliser/

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par dlecteur Voir le message
    Bonjour a tous,

    je suis entrain de développer un petit démon (Unix/Linux) en C et je voudrais avoir les fonctionnalités suivantes: (a partir d'une console)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lecteur@unix>mondemon start // pour lancer le démon
    lecteur@unix>mondemon stop // pour stopper le démon
    lecteur@unix>mondemon show // Une commande qui permet de lancer un certain traitement.
    Si quelqu'un connait la démarche a suivre pour implementer cette fonctionnalité, Merci de la partager avec moi.

    Cordialement.
    C'est un problème de communication inter-process : entre votre daemon et le shell dans lequel vous exécutez vos commandes.

    Il y a plus d'une manière de résoudre le problème :
    - pour un simple start/stop ou pour des commandes sans paramètre, on peut utiliser les signaux : SIGTSTP ,SIGCONT, SIGUSR1, SIGUSR2, …
    - pour des commandes plus complexes : on peut utiliser des sockets, des named pipes, un simple fichier, …


    le choix d'une technique ou d'une autre dépendra de ce que votre daemon est censé faire et comment :
    exécuter des commandes de manière synchrone l'une à la suite de l'autre, répondre à des demandes "urgentes" de manière asynchrone, …

  8. #8
    Membre régulier Avatar de dlecteur
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Justement, httpd et mysqld sont typiquement lancés par ces scripts et c'est bien eux qui gèrent les arguments qui t'intéressent.

    Un détail notable toutefois : apachectl. C'est en fait un client du dæmon déjà en place comme il en existe d'autres, pour wpa_supplicant, par exemple. C'est ce client qui reçoit les commandes et qui communique, généralement via un socket UNIX, avec le dæmon qui par définition n'est rattaché à aucune console.

    Une discussion sur le même sujet : http://www.developpez.net/forums/d10...ert-lutiliser/
    Merci, je crois que je vais utiliser soit des scripts, soit des signaux.
    The journey of a 1000 miles always begins with
    the first step...

  9. #9
    Membre régulier Avatar de dlecteur
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 147
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    C'est un problème de communication inter-process : entre votre daemon et le shell dans lequel vous exécutez vos commandes.

    Il y a plus d'une manière de résoudre le problème :
    - pour un simple start/stop ou pour des commandes sans paramètre, on peut utiliser les signaux : SIGTSTP ,SIGCONT, SIGUSR1, SIGUSR2, …
    - pour des commandes plus complexes : on peut utiliser des sockets, des named pipes, un simple fichier, …


    le choix d'une technique ou d'une autre dépendra de ce que votre daemon est censé faire et comment :
    exécuter des commandes de manière synchrone l'une à la suite de l'autre, répondre à des demandes "urgentes" de manière asynchrone, …
    Merci pour la réponse, comme je l'ai dit précédemment, c'est un démon assez leger. L'histoire des signaux me va tres bien et je crois que je vais l'adopter. Merci encore.
    The journey of a 1000 miles always begins with
    the first step...

Discussions similaires

  1. programmation systeme sous unix avec langage C
    Par bramschs dans le forum Unix
    Réponses: 4
    Dernier message: 05/01/2014, 00h35
  2. Lancement programme UNIX avec commandes claviers incluses
    Par cosaque31 dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 11/01/2011, 11h26
  3. Réponses: 3
    Dernier message: 03/11/2008, 20h54
  4. Installation d'un environnement UNIX avec cygwin
    Par jool dans le forum Applications et environnements graphiques
    Réponses: 17
    Dernier message: 25/10/2005, 17h08
  5. Appeler un programme sur le poste client avec <object>
    Par ouioui2000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/08/2005, 14h40

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