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 :

programmer un mini shell!


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut programmer un mini shell!
    Salut tout le monde.

    je suis pas un as de la programmation, et en ce moment je suis sur un projet consistant a realiser un mini shell;

    J'ai code mon mini shell, les commandes fonctionne parfaitement, et maintenennt je suis a la phase des builtins et signaux. Pour les builtins, je pense pouvoir les recoder, mais pour les signaux, je suis un peu bloque la.

    En fait le man de signal ne m'aide pas beaucoup, je dois gerer les signaux comme dans le shell par defaut du system(je suis sous linux). j'aimerais donc que vous me donniez des astuces pour programmer la gestion des signaux, je ne suis pas autorise a utiliser des fonctions comme fflush(stdout), juste la commande signal dans mon code.

    Je peux arriver a coder mes fonctions pour les signaux si vous m'edifiez un avec des astuces pratiques.

    merci infiniment pour votre precieuse aide.

    A bientot.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Tu veux faire quoi exactement avec les signaux ? Un shell ne fait rien de particulier avec les signaux. A part si tu essaies de coder le built-in "trap" ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Salut!

    Je m'exprime peut etre mal.

    En fait je veux que les signaux soient gerer dans mon shelle comme dans le shell par defaut. Si par exemple j'entre Ctrl+C au clavier, mon invite de commande doit se rafficher et non celle du shell par defaut Si j'appuie la touche de rappel d'une commande(fleches montantes et descendante du clavier) je dois revoir les commandes comme dans mon tcsh et dans mon bash. Des trucs des ce genre

    je veux juste gerer un peu les signaux afin d'optimiser mon mini shell. L'idee que j'ai est par exemple de definir une fonction qui recupere le signal(handle_signal par exemple), et qui sera rappeler dans elle meme. Je ne sais pas si elle me pemettra de bien controler les signaux, et si oui , je voudrais un bout de code a titre d'exemple et un peu explique, qui me permettra de commencer, car j'arrive pas a bien scerner l'utilisation des signaux et je suis dans les delais pour rendre mon projet
    Voila, maintenant si j'ai utilise peut etre les termes a tort, j'espere que ma problematique est plus precise
    Merci de me donner une petite piste..

    merci pour votre attention

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 450
    Par défaut
    Comment lances-tu ton shell actuellement ? Si tu le fais depuis un autre shell, il y a des chances pour que ce soit celui-ci qui intercepte les caractères spéciaux en premier.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sympaval Voir le message
    En fait le man de signal ne m'aide pas beaucoup, je dois gerer les signaux comme dans le shell par defaut du system(je suis sous linux).
    Salut

    Le principe d'un signal/kill est le suivant
    Tu codes une fonction destinée à être exécutée à réception d'un signal. Cette fonction peut faire ce que tu veux mais tu n'as pas le droit de la mettre autre chose que void et avec un paramètre de type int. Ce paramètre recevra le signal reçu
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void myFunc(int sig)
    {
        ... blablabla...
    }

    Ensuite, tu dois armer ton code pour qu'il soit redirigé sur la fonction dès qu'il reçoit un signal x. Ca se fait une seule fois par la fonction signal. Mais rien ne t'empêche de relier ta fonction à plusieurs signaux
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    signal(10, myFunc);
    signal(11, myFunc);
    signal(12, myFunc);

    Ainsi, si ton programme reçoit un signal 10, 11 ou 12 (envoyé depuis l'extérieur via kill) il sera automatiquement redirigé sur myFunc puis, une fois myFunc terminée, reprendra son travail normal.

    Ensuite ben c'est tout à l'exception d'un tout petit détail: sur un Unix de base, quand la fonction est appelée à réception d'un signal X, la procédure est alors désarmée. Et ensuite si le pgm reçoit de nouveau un signal X, il se comporte alors par défaut.
    Pour palier à ce pb, on a l'habitude, dans la fonction, de programmer un réarmement automatique
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void myFunc(int sig)
    {
        signal(sig, myFunc);
        ... blablabla...
    }
    Ainsi quand le pgm reçoit un signal X il est redirigé sur myFunc pendant que le mécanisme de détournement est désarmé. Puis la fonction commence son exécution et réarme alors elle-même le mécanisme.

    Ce comportement de désarmement automatique n'est pas présent sous Linux. Si une fonction est armée, elle reste armée jusqu'à ce qu'on la désarme manuellement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Par défaut
    salut
    c'est trés interessant comme sujet et je vous conseille aussi d'inclure une connexion à votre shell c'est à dire le modéle client/serveur en utilisant les sokets

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2009
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 218
    Par défaut
    Merci infiniment pour ta reponse.

    Pour la question sur la facon de lancer mon shell, je lance pour le moment comme un programme a partir de mon shell par defaut.

    j'ai bien note tes orientations, juste une question. comment je peut assigner la variable "int sig" pour eviter le "warning : unsused parrameter sig) lors de la compilation?

    je peut lui donner juste n'importe quelle valeur et ca n'aura pas d'influence sur le comportement de ma fonction "myFunc"?

    merci encore.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sympaval Voir le message
    j'ai bien note tes orientations, juste une question. comment je peut assigner la variable "int sig" pour eviter le "warning : unsused parrameter sig) lors de la compilation?

    je peut lui donner juste n'importe quelle valeur et ca n'aura pas d'influence sur le comportement de ma fonction "myFunc"?
    Amusant. Effectivement, la variable "int sig" est impérative car elle sert à stocker le signal reçu. Mais si tu ne l'utilises pas, alors elle devient inutile et perçue comme telle par le compilo.

    A mon avis, la meilleure chose à faire est de mettre la ligne de réarmement "signal(sig, myFunc)" en début de code de myFunc(). Même si ça ne sert pas sous Linux, ça rend ton programme portable sur Unix où elle est nécessaire et ça a l'avantage d'utiliser la variable donc plus de warning à la compilation...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    Bonsoir

    Regardes la fonction ioctl. Elle permet de parametrer certaines options de ton terminal. Entre autres tu peux désactiver les signaux et récuperer les l'entrée sans que celle-ci soit bufferisée (ICANON), tres pratique pour gérer les touches fléchées.

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

Discussions similaires

  1. Programmation Système Pipe : Faire un mini shell en Python
    Par Mass062 dans le forum Général Python
    Réponses: 2
    Dernier message: 28/04/2014, 08h56
  2. Ecrire mini Shell
    Par lia20 dans le forum Linux
    Réponses: 1
    Dernier message: 14/05/2007, 10h06
  3. Mini shell !!!!!
    Par asoka13 dans le forum C++
    Réponses: 6
    Dernier message: 28/12/2005, 11h24
  4. programme C++ avec shell
    Par I_believe_I_can_fly dans le forum C++
    Réponses: 11
    Dernier message: 24/10/2005, 17h08

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