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
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. NUL descriptor de archivo (isatty es falso)
- 2. check isatty in bash
- 3. Spring MVC 3 - ¿Responde a la solicitud con un 404?
- 4. Telnet Comando IAC que responde
- 5. Groovy hasProperty/responde a
- 6. Script que no responde: ¿es posible evitarlo?
- 7. UIScrollView no responde a setZoomScale:
- 8. Hoja de documento que no responde a eventos de teclado
- 9. personalizada comprobable Ver que responde al selector
- 10. Responde a applicationWillEnterForeground en un UIView
- 11. servidor web responde a? Q = "/ ruta/a/archivo" con una "barra de ruta" png
- 12. Delgado no responde a SIGINT o SIGTERM
- 13. Cómo engañar a Windows para que piense que su aplicación aún está ocupada, aunque no responde
- 14. Activar un archivo de audio cuando se responde una llamada
- 15. centro de juego no responde a la solicitud authenticateWithCompletionHandler (IOS)
- 16. Determinar a qué comandos de AppleScript responde una aplicación a
- 17. emacsclient no responde a los clics del ratón
- 18. Menú Jquery/CSS desplegable que no responde en iPad/iPhone
- 19. ¿Cómo depurar la página que no responde en Google Chrome?
- 20. tecladoWillShow no responde
- 21. ¿Cómo puedo simular un servidor que no responde?
- 22. ¿Listar todos los métodos que responde un objeto?
- 23. prueba carriles controlador que responde en diferentes formatos
- 24. C# SpeechSynthesizer hace que el servicio no responde
- 25. setOnItemClickListener no responde Custom ListView
- 26. ¿Cómo responde las preguntas en las entrevistas para las que piensa que no tienen sentido?
- 27. Listview onItemClick veces no responde
- 28. ¿Debo esperar a que Django comience a soportar Python 3?
- 29. ¿Cómo es que el teclado suave de Android no responde a EditText?
- 30. Botón en el cuadro de diálogo personalizado que no responde a los eventos de clics
Además de ' STDOUT_FILENO', también debe 'dup' pty slave para' STDIN_FILENO' y 'STDERR_FILENO' del niño. – caf
Editado, gracias. –
¡Gran respuesta, gracias! –