2010-11-08 9 views
5

Estoy queriendo escribir mi propio psuedo-shell y me gustaría obtener bonitos colores, etc. ¿Cómo hago para engañar a un subproceso y hacerle pensar que está en un TTY? He leído sobre los TTY virtuales pero no he encontrado mucha información práctica sobre cómo crear uno o cómo eso hace que un subproceso piense que isatty(stdout) == 1.Archivo que responde a isatty (3)

Respuesta

8

Lo que estás buscando se llaman pseudoterminales, pseudo-ttys o ptys. Éstos existen en pares maestro/esclavo, que se comportan de manera similar a los pares de socket (la versión bidireccional de las tuberías, lo que se escribe en un extremo se puede leer en el otro). En el proceso de control, utilice posix_openpt para abrir un maestro, entonces ptsname para obtener el nombre del esclavo (probablemente /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); 

Como es habitual, cada función puede fallar, por lo que añadir la comprobación de errores. El slave fd ahora se refiere al dispositivo esclavo. Use dup2(slave, STDOUT_FILENO) en el proceso hijo para establecer la salida estándar al pseudoterminal esclavo; de manera similar para stdin y stderr.

(Tenga en cuenta que some Linux manpages afirman incorrectamente que posix_openpt vuelve char * Además, no se confunden por el openpty familia de funciones; éstos. Representan una interfaz más antigua a la pseudo-ttys que está en desuso.)

+1

Además de ' STDOUT_FILENO', también debe 'dup' pty slave para' STDIN_FILENO' y 'STDERR_FILENO' del niño. – caf

+0

Editado, gracias. –

+0

¡Gran respuesta, gracias! –

Cuestiones relacionadas