Shell dans la fenêtre ncurses?

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:

  • Créer un pty (pseudoterminal). Vous ne mentionnez pas le système d’exploitation que vous utilisez, mais s’il est basé sur POSIX, man pty aidera. Regardez aussi openpty
  • L’extrémité esclave du terminal doit être connectée à tout ce que vous utilisez (par exemple le shell), tandis que l’extrémité maître doit être connectée à votre émulateur de terminal.
  • Vous aurez donc à fork() , et dans l’enfant, dup2 l’esclave fd sur le stdin , stdout et stderr
  • Ensuite, vous devez connecter le maître fd du parent à votre environnement ncurses (pour la sortie) et à la gestion du clavier (pour la saisie).

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.