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 :
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 :
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 :
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 :
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.
Partager