Je veux écrire mon propre pseudo-shell et souhaiter obtenir de jolies couleurs, etc. Comment puis-je inciter un sous-processus à penser qu’il se trouve dans un ATS? J’ai lu des articles sur les TTY virtuels, mais je n’ai pas trouvé beaucoup d’informations pratiques sur la façon de créer un sous-processus ou sur la manière dont un sous-processus pense qu’il est isatty(stdout) == 1
.
Ce que vous recherchez est appelé pseudoterminaux, pseudo-ttys ou ptys. Celles-ci existent en paires maître / esclave, qui se comportent de la même manière que les paires de sockets (la version bidirectionnelle des canaux; ce qui est écrit à une extrémité peut être lu sur l’autre). Dans le processus de contrôle, utilisez posix_openpt
pour ouvrir un maître, puis ptsname
pour obtenir le nom de l’esclave (probablement /dev/pts/X
):
int master = posix_openpt(O_RDWR | O_NOCTTY); grantpt(master); /* change ownership and permissions */ unlockpt(master); /* must be called before obtaining slave */ int slave = open(ptsname(master), O_RDWR | O_NOCTTY);
Comme d’habitude, chaque fonction peut échouer, alors ajoutez une vérification d’erreur. L’ slave
fd fait maintenant référence à l’appareil esclave. Utilisez dup2(slave, STDOUT_FILENO)
dans le processus fils pour définir la sortie standard sur le pseudoterminal esclave; de même pour stdin et stderr.
(Notez que certaines pages de manuel de Linux indiquent à tort que posix_openpt
retourne char *
. Aussi, ne soyez pas dérouté par la famille de fonctions openpty
; elles représentent une interface plus ancienne avec pseudo-ttys qui est obsolète.)