J’essaie actuellement d’écrire un multiplexeur de terminal minimal à l’aide de ncurses. Cependant, lorsque j’essaie d’ execv
un shell, il n’imprime pas dans la fenêtre et démarre à la place un nouveau sous-processus qui prend le contrôle de la fenêtre (en ignorant ncurses).
Comment puis-je empêcher cela et laisser ncurses le contrôler? Y a-t-il un moyen d’obtenir le tty et de le contrôler?
MODIFIER
Grâce à Ross Ridge dans les commentaires, je sais maintenant que je dois créer un pseudo-terminal, que je lirai ensuite dans une fenêtre ncurses. Cependant, je ne vois pas comment obtenir la sortie standard pour imprimer dans une fenêtre ncurses. Existe-t-il une fonction ncurses qui lit les descripteurs de fichier? Ou dois-je utiliser read()
avec printw()
manière ou d’une autre?
Vous devrez faire à peu près ce qui suit:
man pty
aidera. Regardez aussi openpty
fork()
, et dans l’enfant, dup2
l’esclave fd sur le stdin
, stdout
et stderr
Cette réponse , cette réponse et cette réponse pourraient être utiles, mais je recommande en particulier le premier, car il fait référence à la programmation avancée de Stephens dans l’environnement UNIX (je l’ai lié à l’édition la plus moderne), et le code source est téléchargeable. Achetez le livre, car c’est une ressource précieuse, mais si vous regardez dans le répertoire pty
(je ne vais pas copier et coller pour des raisons de droits d’auteur), vous trouverez un bon exemple de forkpty
.
Cela laisse la question de savoir comment vous obtenez des données de sortie du processus que vous exécutez pour ncurses
. Eh bien, vous devez écrire un émulateur de terminal. Choisissez le terminal que vous souhaitez émuler, lisez toutes les séquences de contrôle qu’il utilise et implémentez-les toutes.
Si cela ressemble à du travail ardu (ce qui est le cas), je vous suggère d’utiliser tmux
ou screen
; ce dernier fait exactement ce que vous voulez, y compris un émulateur de terminal VT100 / ANSI complet; le premier est presque aussi complet. tmux
est un tmux
sous licence BSD, ce qui signifie que vous pouvez simplement adapter le source pour tmux
à vos demandes dans le cas improbable où il en est déjà une. screen
est en GPL, donc à moins que votre programme soit également en GPL, c’est uniquement pour vous inspirer.