Fichier qui répond à isatty (3)

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.)