To get acquainted with the C programming language we’ll start to code a shell
Un shell con un set de comandos para interactuar con tu sistema operativo. Última versión (entrega) de la práctica para la asignatura de Sistemas Operativos.
Note
Para ver un resumen de como funciona esta shell entra a la Wiki.
Warning
"¿Estoy en la primera entrega tengo que hacer todo esto?" Puedes descargar cada entrega más abajo.
Important
Este shell fue desarrollado para sistemas unix. Recomendamos encarecidamente compilarlo y ejecutarlo en Linux.
Es posible compilarlo para Mac, pero debe cambiar las librerías debido a las diferencias entre ambos sistemas.
Caution
No trates de compilar y ejecutar la práctica directamente desde el CLion u otro editor que use CMakeLists.txt.
Este archivo está presente en el repositorio para permitir el correcto procesado del archivo por el IDE.
Usa el Makefile como flujo de compilación.
-
Primero clona este repositorio
git clone https://github.com/TeenBiscuits/Practicas-SO.git
-
Entra a la carpeta
cd Practicas-SO -
Compila el programa usando las flags requeridas (es la opción por defecto del Makefile)
make
Todas las opciones del Makefile
make allomake(por defecto): Compila el programa con las flags requeridas (-Wall)make debug: Compila el programa añadiendo las flags de debug y optimización (-g -O0)make run: Compila el programa (como en la opción por defecto) y lo ejecuta acto seguido. Tratará de ejecutarlo usandorlwrap(1), de no estar instalado lo ejecutará de forma normal.make leaks: Compila el programa (con las flags dedebug) y trata de ejecutarlo con Valgrind.make tests: Compila y ejecuta el programa como enleakse introduce automáticamente por la entrada estandar los contenidos del archivotests.txt.
(1) Al ejecutarlo con
rlwrappodrás usar las flechas←/→para moverte por el texto escrito o las otras flechas↑/↓para volver a escribir el texto anteriormente introducido. -
Ejecuta el programa
./shell
Otros parámetros
Si ejecutas el script con el parámetro
-pasí:./shell -p
Importarás automaticamente el path a la lista de busqueda. Como si ejecutaras
search -pathnada más empezar. -
Tras esto el prompt de tu terminal debería haber cambiado a uno con el mismo formato que Ubuntu pero con usuario y el hostname de la máquina en morado. Ejemplo:
user@hostname:~/Practicas-SO$ -
Para salir ejecuta el comando
exito mata el proceso con Ctrl + C
Note
Esta breve lista fue usada para llevar un registro de los comandos que fueron implementados durante el desarrollo y sus diferentes parámetros.
Para ver en detalle que hace cada comando y las notas sobre ellos consulta la Wiki (Comandos).
Mostrar lista de comandos
- authors [-l|-n]
- pid
- ppid
- cd [dir]
- date [-t|-d]
- historic [N|-N] (1)
- open [file] mode (cr,ap,ex,ro,rw,wo,tr)
- close [df]
- dup [df]
- infosys
- help [cmd]
- quit, exit, bye
(1) Hypothetically, there’s a scenario where trying to repeat a historic command could yield an infinite loop or a stack overflow (depending on how it is coded), so students may choose to not store calls to historic N itself in the historic list if they want so (See the NOTES ON LIST IMPLEMENTATIONS at the end of this document)
Mostrar lista de comandos
- makefile [name]
- makedir [name]
- listfile [-long][-link][-acc] name1 name2 n3 ... lista ficheros; (2)
- cwd
- listdir [-hid][-long][-link][-acc] n1 n2 ... lista contenidos de directorios (3)
- reclist [-hid][-long][-link][-acc] n1 n2 ... lista recursivamente contenidos de directorios (subdirs después) ( 3)
- revlist [-hid][-long][-link][-acc] n1 n2 ... lista recursivamente contenidos de directorios (subdirs antes)
- erase [name1 name2 ..]
- delrec [name1 name2 ..]
(2) -long: listado largo | -acc: acesstime | -link: si es enlace simbolico, el path contenido
(3) -long: listado largo | -hid: incluye los ficheros ocultos | -acc: acesstime | -link: si es enlace simbolico, el path contenido
Mostrar lista de comandos
- allocate [-malloc|-mmap|-createshared|-shared]
- deallocate [-malloc|-mmap|-shared|-delkey]
- memfill [addr] [ch cont|cont]
- memdump [addr] [cont]
- memory [-funcs|-vars|-blocks|-all|-pmap]
- readfile [file] [addr] [cont]
- writefile [file] [addr] [cont]
- read [df] [addr] [cont]
- write [df] [addr] [cont]
- recurse [n]
Mostrar lista de comandos
- getuid
- setuid [-l] id
- showvar v1 v2 ..
- changevar [-a|-e|-p] var val
- subsvar [-a|-e] v1 v2 val
- environ [-environ|-addr]
- fork
- search [-add dir|-del dir|-clear|-path]
- exec [VAR1 VAR2 VAR3 ...] executablefile [arg1 arg2 ...]
- execpri prio [VAR1 VAR2 VAR3 ...] executablefile [arg1 arg2 ...]
- fg [VAR1 VAR2 VAR3 ...] executablefile [arg1 arg2 ...]
- fgpri prio [VAR1 VAR2 VAR3 ...] executablefile [arg1 arg2 ...]
- back [VAR1 VAR2 VAR3 ...] executablefile [arg1 arg2 ...]
- backpri prio [VAR1 VAR2 VAR3 ...] executablefile [arg1 arg2 ...]
- listjobs
- deljobs -term|-sig
- *****
En la carpeta de documentación puedes consultar los PDFs y los archivos auxiliares que seguimos para realizar las 4 entregas de la prácitca.
En la Wiki de este repositorio puedes leer más sobre como funciona el código de este shell. Esperamos que esto te ayude a entender como implementar la práctica.
El repositorio fue reformado para su publicación, si cambia a la rama old-repo puedes ver como era antes del cambio.
El código que aquí se muestra es de después de la última entrega, corrigiendo todos los errores de todas las entregas. Puedes descargar cada una de las entregas en la sección de releases.
Licenciado bajo Apache License 2.0 por Pablo Portas López y Pablo Míguez Muiño.