Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/02/2011, 04h09   #1
Futur Membre du Club
 
Inscription : juillet 2009
Messages : 89
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 89
Points : 15
Points : 15
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 :
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 :
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 :
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 :
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.
sympaval est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/02/2011, 12h19   #2
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Wow, alors je n'ai pas tout compris, désolé

mais ça :
Citation:
- 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
?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/02/2011, 14h02   #3
Futur Membre du Club
 
Inscription : juillet 2009
Messages : 89
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 89
Points : 15
Points : 15
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.
sympaval est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 17h58   #4
Futur Membre du Club
 
Inscription : juillet 2009
Messages : 89
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 89
Points : 15
Points : 15
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.
sympaval est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h50.


 
 
 
 
Partenaires

Hébergement Web