|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : juillet 2009 Messages : 89 ![]() |
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 :
Code :
termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN) J’exécute ensuite le shell dans le fils avec un appel a : 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) 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. |
||
|
|
10
|
|
|
#2 | |
|
Membre Expert
![]() |
Wow, alors je n'ai pas tout compris, désolé
mais ça : Citation:
http://c.developpez.com/faq/?page=cl...uches_etendues ? |
|
|
|
10
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : juillet 2009 Messages : 89 ![]() |
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. |
|
|
00
|
|
|
#4 |
|
Futur Membre du Club
![]() Inscription : juillet 2009 Messages : 89 ![]() |
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. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com