2011-11-17 22 views
7

Quiero crear un mini shell para UNIX solo para conocer los pormenores de todo. Estoy teniendo algunas confusiones comprendiendo cosas que solía dar por sentado. Esta es una pregunta un tanto filosófica. Cuando creo un "shell", supongo que tengo un UNIX sin shell, así que ¿cuál sería el std in y std out en este caso? las funciones doesnt como system() y exec() usan el shell para ejecutar programas, por lo que si estoy creando un shell en primer lugar. ¿Cómo funcionan estas funciones?Crear un shell UNIX

Respuesta

3

Hay varias funciones en la familia exec: execve(2), execl(3), execle(3), execlp(3), execv(3), execvp(3). El primero, execve(2), lo proporciona el kernel del sistema operativo como una llamada al sistema. (Bueno, está bien, la función que llaman los programas la proporciona la biblioteca C del sistema, pero es es un envoltorio simple alrededor de la llamada al sistema). Las otras funciones proporcionan semánticas ligeramente diferentes y se implementan en términos de la función execve(2).

Los proyectiles podrían utilizar execvp(3) o execlp(3) para proporcionar la búsqueda PATH para ejecutables, pero al menos bash(1)hashes la ruta completa de ejecutables para proporcionar una mejora en el rendimiento. (Consulte bash(1) incorporado en hash para obtener más información.)

system(3) se implementa a través de /bin/sh -c, como supondrá.

La entrada y salida estándar se configura por cualquier programa que genere el shell. Si un usuario inicia sesión en la consola directamente, será manejado por agetty(8) o mgetty(8) o cualquiera que sea el programa getty -al igual que maneja inicios de sesión directos. Si un usuario inicia sesión a través de sshd(8), entonces sshd(8) se encarga de crear el pty y delegar el esclavo de la terminal al shell. Si un usuario crea sus shells a través de xterm(1) u otros emuladores de terminal, entonces esos procesos serán responsables de conectar la entrada, salida y error estándar para el shell.

3

system(3) de hecho utiliza (posiblemente directa o indirectamente a través de exec) un shell para hacer su trabajo. exec(3) y sus amigos, sin embargo, no usan un shell, sino que ejecutan la imagen del programa especificada directamente. Puede ver esto simplemente leyendo sus respectivas páginas man.

Una diferencia es que con system(), verá que se expanden comodines como azúcar, mientras que si pasa * como argumento para su programa usando exec(), su programa verá el asterisco literal (y probablemente no sepa qué hacer).

Un shell se puede implementar utilizando exec(), entre otras cosas. Obtiene su stdin y stdout de algo llamado TTY (teletipo, o terminal de la vieja escuela) o PTY (pseudo-terminal, como en los sistemas modernos). Ver posix_openpt(2).

+0

oh gracias mucho – Keeto

Cuestiones relacionadas