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

Administration système Discussion :

Recoder la commande script


Sujet :

Administration système

  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 Recoder la commande script
    Salut a tous!

    Je suis sur un projet consistant a recoder la commande script Linux sans utiliser les fonctions forkpty et compagnies, ni grantpt, ptsname ou unlockpt.

    J'ai réussi déjà a gérer l'allocation, la recherche et la libération de mes pseudo terminaux a la main.

    Cependant je rencontre deux soucis:

    1) Après le fork, dans le processus fils je configure le file descriptor de mon esclave avec la commande cfmakeraw (apres avoir recupere les attributs dans terminos_p avec tcgetattr) qui fixe les attributs du terminal ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
    |INLCR|IGNCR|ICRNL|IXON);
    termios_p->c_oflag &= ~OPOST;
    termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
    termios_p->c_cflag &= ~(CSIZE|PARENB);
    termios_p->c_cflag |= CS8;
    La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN)
    montre que mon esclave est en mode non canonique (entre autres).
    J’exécute ensuite le shell dans le fils avec un appel a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execl ("/bin/sh", "sh", 0);
    Dans le processus père, je lis sur l’entrée standard et j'envoie les donnes sur son le pty maitre.
    Tout se passe bien, mais:
    - les touches fléchées ne ré-affichent pas les commandes, les tabulations non plus ne marchent pas.
    - Quand j'ouvre un éditeur comme emacs par exemple, il ne s'ouvre pas comme dans un shell normal, lorsque je veux défiler dans le fichier ouvert avec les flèches, c'est le même effet que dans le terminal avec des caractères qui s'affichent chaque fois que j’appuie sur une flèche.

    2)Le deuxième souci est que la commande script du système prend une option -c suivie d'une commande qui permet d’exécuter la commande et quitter le script, la sortie de la commande doit avoir été enregistrée dans le fichier typescript comme c'est le cas lorsque script est lance en mode interactif.
    Je gère cette option en lançant la commande directement avec le shell comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execl ("/bin/sh", "sh", "-c", "commande", 0)
    Chez moi, le shell est bien lance mais je ne vois pas la sortie de la commande sur la sortie standard ni dans le fichier typescript.

    3) Il y a aussi le fait que la fenêtre de mon terminal est redimensionnée (réduite). Un ls par exemple n'affiche pas le répertoire sur la même étendue que dans un shell normal. Je ne sais si ce sont les effets de bord du fork, car je n'utilise pas du tout la structure winsize dans mon programme.

    J'aimerais que vous puissiez m'aider a gérer ces derniers points afin de rendre le fonctionnement de mon programme semblable a celui de script.

    J’espère que vous cerne ma difficulté et que vous pourrez m'accompagner dans la finition de mon projet.

    Merci pour votre collaboration toujours renouvelée.

  2. #2
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Wow, alors je n'ai pas tout compris, désolé

    mais ça :
    - les touches fléchées ne ré-affichent pas les commandes, les tabulations non plus ne marchent pas.
    - Quand j'ouvre un éditeur comme emacs par exemple, il ne s'ouvre pas comme dans un shell normal, lorsque je veux défiler dans le fichier ouvert avec les flèches, c'est le même effet que dans le terminal avec des caractères qui s'affichent chaque fois que j’appuie sur une flèche.
    je pense que c'est juste un problème d'interprétation des touches, tu as regardé ça :
    http://c.developpez.com/faq/?page=cl...uches_etendues
    ?

  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
    Oui!
    En fait j'ai regarde le FAQ mais il ne repond pas a mon probleme.

    je dis que j'ai cree un pseudo terminal pour la gestion de mes entrees sorties. Ensuite je fork mon processus pour faire des traitements specifiques dans le fils et le pere.
    Alors dans le fils le descripteur de fichier du pty esclase(pts) est passe en mode non canonique et j'en fait le terminal de controle du processus, et dans le pere, je lis tous ce qui est entre sur l'entree standard et je l'envoie au terminal esclave via le pty maittre.
    Dans le processus fils je lance aussi mon shell pour l'interpretation des commandes entrees.
    Alors mon probleme est que je recupere toutes les entrees et affiche bien les sorties, sauf que les touches de rappelle de commdande, ni les tabulations ne marchent pas. Le shell n'affiche pas la commande precedente quand j'appui par exemple sur la fleche montante.
    Pareil, quand je suis dans ma session script, et que j'ouvre emacs, il se passe des choses bizzardes et je ne peux pas editer le fichier ouvert.
    C'est un peu ca le soucis, comme si mon programme qui utilise les pseudos terminaux, ne gere pas bien les applications fonctionnant avec les pseudos terminaux telles que emacs et le shell.

    J'aimerais donc pouvoir une fois mon programme lancer, interpreter tout ce qui est entree sur l'entre standard, comme dans un programme normale, a la seule difference que cette fois j'ai un pseudo terminal derriere, et les file descriptor de mon entree/sortie standard, sortie d'erreur sont celui de mon pty esclave (c'est fait via dup ou dup2).

    D'un autre cote quand je lance mon shell dans mon processus fils avec une commande, je ne vois pas l'execution de la commande sur ma sortie satandard, mais le shell est quitte preuve que la commande a ete executee.

    Et le dernier probleme est que dans le shell que je lance, la fenetre de mon terminal est reduite par rapport a celle d'orgine.

    Voila un peu de quoi souffre mon programme. Je sais que ce n'est pas facile a gerer comme post vu le sujet qui n'est pas des plus reguliers dans notre domaine.

    Merci pour votre aide.

  4. #4
    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
    C'est bon j'ai trouve la solution a mon probleme.

    En fait je devais fixer les attributs et flags du terminal dans le fils et le pere (a coups de tcgetattr , tcsetattr, et cfmakeraw).

    Je pense que je dois appliquer les memes regles pour le redimensionnement de la fenetre.

    je gere tout ca et je vous le confirme.

    A bientot.

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

Discussions similaires

  1. Recoder la commande tar
    Par overlolo dans le forum C
    Réponses: 7
    Dernier message: 06/04/2010, 21h49
  2. Explication commande script
    Par vallesm77 dans le forum RedHat / CentOS / Fedora
    Réponses: 0
    Dernier message: 10/02/2009, 15h59
  3. commande script substitution
    Par majong dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 04/04/2008, 14h09
  4. pb avec mysql : commande script/generate scaffold
    Par XavierWRC dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 08/03/2008, 03h27
  5. commande script MS-DOS
    Par le_viet dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 28/07/2006, 10h09

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