Grupo - C#14 - A03.Practica - SistemasOperativos
Grupo - C#14 - A03.Practica - SistemasOperativos
Grupo - C#14 - A03.Practica - SistemasOperativos
TEMA
MINISHEL(POSIX)
INFORME PARA LA
ACTIVIDAD OPCIONAL
UNIDAD 2: PROCESOS E HILOS
GRUPO C 14
KATHERINE ALCIVAR
DIANA MACIAS
LILIANA PILLAJO
FRANKLIN ONTANEDA
18 DE NOVIEMBREDE 2023
INTÉRPRETE DE COMANDOS EN C
1. INTRODUCCIÓN
En el marco de este proyecto, se ha desarrollado un MiniShell en lenguaje C, el cual consiste en un
intérprete de comandos básicos del sistema operativo. El MiniShell brinda a los usuarios una interfaz
interactiva para ejecutar comandos comunes, como listar archivos, cambiar de directorio, crear y
eliminar directorios, y manipular archivos.
Para llevar a cabo el desarrollo del MiniShell, se utilizó la metodología de programación estructurada
en el lenguaje C. Se emplearon diversas instrucciones y técnicas de programación, incluyendo llamadas
del sistema, manejo de cadenas de caracteres y gestión de procesos.
Entre las herramientas utilizadas, se destacan Replit como el entorno de desarrollo en línea que
permitió escribir, compilar y ejecutar el código de manera eficiente y colaborativa. Además. También
se utilizó GeSHi (Generic Syntax Highlighter) para resaltar la sintaxis del código fuente en la
presentación final del trabajo.
1
2. ANÁLISIS TEÓRICO
Instrucciones para llamadas del sistema:
Las llamadas al sistema son instrucciones que permiten a un programa interactuar con el sistema
operativo y acceder a sus servicios. En el MiniShell, se empleó la función execvp() para ejecutar
comandos en el sistema operativo. Según Benítez en su informe (Documentación práctica en shell, s. f.)
la función execvp() es una llamada al sistema que reemplaza la imagen del proceso actual con una
nueva imagen de programa. Esta función permite ejecutar comandos y argumentos de forma eficiente
dentro del MiniShell.
Durante el desarrollo del MiniShell, se utilizaron diversas librerías estándar de C para acceder a las
funciones necesarias. Algunas de las librerías utilizadas incluyen <stdio.h> para operaciones de
entrada/salida estándar, <stdlib.h> para funciones de utilidad como malloc() y free(), <string.h> para
operaciones de manipulación de cadenas de caracteres, <unistd.h> para llamadas al sistema y
<sys/types.h> y <sys/wait.h> para la gestión de procesos. Estas librerías proporcionan una amplia gama
de funciones y macros necesarias para implementar un MiniShell funcional.
2
3. DESARROLLO
El Shell o intérprete de mandatos es la interfaz de usuario
fundamental de los sistemas operativos. Este proyecto
consiste en desarrollar un intérprete de comandos sencillo
– myshell – con las siguientes propiedades:
parámetros).
Indicaciones finales:
Código fuente:
3
15. char* palabra;
16. int i = 0;
17.
18. // Utiliza la función strtok para dividir la cadena
en argumentos
19. palabra = strtok(input, " \t\n\r");
20. while (palabra != NULL) {
21. argumentos[i++] = palabra;
22. palabra = strtok(NULL, " \t\n\r");
23. }
24.
25. // Establece el último elemento del arreglo de
argumentos como NULL
26. argumentos[i] = NULL;
27.
28. return argumentos;
29. }
30.
31. // Función para ejecutar el comando "cd"
32. void changeDirectory(char** args) {
33. if (args[1] == NULL) {
34. fprintf(stderr, "Se debe especificar un
directorio\n");
35. } else {
36. if (chdir(args[1]) != 0) {
37. perror("Error al cambiar de directorio");
38. }
39. }
40. }
41.
42. // Función para ejecutar el comando "pwd"
43. void printWorkingDirectory() {
44. char cwd[tamaño];
45. if (getcwd(cwd, sizeof(cwd)) != NULL) {
46. printf("Directorio actual: %s\n", cwd);
47. } else {
48. perror("Error al obtener el directorio actual");
49. }
50. }
51.
52. // Función para ejecutar un comando
53. void executeCommand(char** args) {
54. pid_t pid = fork();
55. if (pid == 0) {
56. // Proceso hijo
57. if (execvp(args[0], args) == -1) {
58. perror("No se pudo ejecutar el comando");
59. }
60. exit(EXIT_FAILURE);
61. } else if (pid > 0) {
62. // Proceso padre
63. waitpid(pid, NULL, 0);
64. } else {
65. perror("Error al crear un nuevo proceso");
66. }
67. }
4
68.
69. int main() {
70. char input[tamaño];
71. char** args;
72.
73. // Bucle principal del MiniShell
74. while (1) {
75. printf("#UTMso> ");
76. fgets(input, tamaño, stdin);
77. input[strcspn(input, "\n")] = '\0';
78.
79. args = splitInput(input);
80.
81. if (args[0] == NULL) {
82. continue;
83. }
84.
85. // Comprobación de comandos
86. if (strcmp(args[0], "so") == 0) {
87. // Salir del MiniShell si se introduce el
comando "so"
88. break;
89. } else if (strcmp(args[0], "help") == 0) {
90. // Mostrar la ayuda si se introduce el
comando "help"
91. printf("Comandos disponibles:\n"
92. " - ls: Listar archivos y directorios
en el directorio actual.\n"
93. " - cd [directorio]: Cambiar al
directorio especificado.\n"
94. " - pwd: Mostrar el directorio
actual.\n"
95. " - mkdir [directorio]: Crear un
directorio con el nombre especificado.\n"
96. " - rm [archivo]: Eliminar el archivo
especificado.\n"
97. " - mv [origen] [destino]: Mover o
renombrar un archivo o directorio.\n"
98. " - cp [origen] [destino]: Copiar un
archivo o directorio.\n"
99. " - help: Mostrar esta ayuda.\n"
100. " - so: Salir del MiniShell.\n");
101. } else if (strcmp(args[0], "readme") == 0) {
102. // Leer el contenido del archivo readme.txt
103. FILE* readmeFile = fopen("readme.txt", "r");
104. if (readmeFile != NULL) {
105. printf("\nContenido del archivo
readme.txt:\n\n");
106. char ch;
107. while ((ch = fgetc(readmeFile)) != EOF) {
108. printf("%c", ch);
109. }
110. fclose(readmeFile);
111. } else {
112. printf("\nNo se pudo abrir el archivo
readme.txt.\n");
5
113. }
114. } else if (strcmp(args[0], "cd") == 0) {
115. // Cambiar de directorio si se introduce el
comando "cd"
116. changeDirectory(args);
117. } else if (strcmp(args[0], "pwd") == 0) {
118. // Mostrar el directorio actual si se
introduce el comando "pwd"
119. printWorkingDirectory();
120. } else {
121. // Ejecutar el comando ingresado
122. executeCommand(args);
123. }
124.
125. free(args);
126. }
127.
128. printf("MiniShell ha terminado.\n");
129. return 0;
130. }
Mostrar archivos: El comando ls nos ayuda a visualizar el contenido del directorio actual.
En este caso, ingresar el comando ls nos muestra diferentes tipos de archivos del directorio principal
del proyecto en replit.
Como se observa en la captura, cambiamos del directorio “principal” al directorio “ejemplo” con el
comando cd
6
Mostrar directorio: El comando pwd imprime en pantalla el directorio en el que nos encontremos
trabajando.
En este ejemplo, ingresar el comando pwd nos muestra en pantalla que nuestro directorio actual es el
principal.
Crear directorios: El comando mkdir nos permite crear directorios en el programa dentro del directorio
de trabajo en el que nos encontremos o en una ruta específica.
En el ejemplo se observa el uso del comando mkdir creando el directorio “ejemplo” sin problema
alguno.
Mover archivos: El comando mv nos ayuda a mover un fichero o directorio de la ruta de origen a la
ruta de destino.
En ésta ocasión, haciendo uso del comando mv el archivo “ejemplo2.txt” se movió del directorio
principal al directorio “ejemplo”.
7
Copiar archivos: Con el comando cp podemos copiar ficheros o directorios en una ruta en específico.
En el ejemplo observamos que haciendo uso del comando cp se copió el archivo “ejemplo2.txt” del
directorio “ejemplo” al directorio principal y con el comando ls mostramos que efectivamente el
archivo se copió con éxito al directorio principal.
Eliminar un archivo: Para eliminar un archivo podemos usar el comando rm y seguido escribimos el
fichero que deseamos eliminar.
Como se puede observar, al ingresar el comando help obtenemos la descripción de los comandos que
podemos utilizar, desde el comando ls hasta el comando so que nos permite finalizar el programa.
8
También podemos hacer uso de un comando personalizado como readme.
Al ingresar el comando readme obtenemos un manual de las capacidades del programa en replit, es
parecido al comando help pero muestra una información más extensa del uso de comandos
En resumen, cuando el usuario ingresa un comando, el MiniShell lo analiza y determina la acción
correspondiente. Hay varios comandos disponibles, como "ls" para listar archivos y directorios, "cd"
para cambiar de directorio, "pwd" para mostrar el directorio actual, "mkdir" para crear un directorio,
"rm" para eliminar un archivo, "mv" para mover archivos, "cp" para copiar archivos, "help" para
mostrar la ayuda y "so" para salir del MiniShell.
En el caso del comando "readme", se mostrará el contenido del archivo readme.txt si existe. Caso
contrario, se mostrará un mensaje indicando que no se pudo abrir el archivo.
El MiniShell continuará ejecutando comandos hasta que se ingrese el comando "so" para salir del
programa. Una vez que se sale del MiniShell, se muestra un mensaje indicando que el MiniShell ha
terminado.
El resultado de la ejecución del programa dependerá de los comandos ingresados por el usuario y las
acciones realizadas por el MiniShell en respuesta a esos comandos. El usuario podrá interactuar con el
MiniShell, realizar diversas operaciones en el sistema de archivos y obtener los resultados
correspondientes en la consola.
9
4. MANUAL DE USUARIO
El MiniShell es un intérprete de comandos básico del sistema operativo que permite ejecutar
diferentes comandos. A continuación, se muestra cómo usarlo
1. Ejecución de comandos:
- Puedes ejecutar comandos básicos del sistema operativo, como ls, cd, pwd, mkdir, rm, mv, cp, entre
otros.
- Por ejemplo, para listar los archivos y directorios en el directorio actual, escribe "ls" y presiona
Enter.
2. Cambio de directorio:
- Utiliza el comando "cd" seguido del nombre del directorio al que deseas cambiar.
- Por ejemplo, para cambiar al directorio "documents", escribe "cd documents" y presiona Enter.
- Utiliza el comando "mkdir" seguido del nombre del directorio que deseas crear.
- Por ejemplo, para crear un directorio llamado "images", escribe "mkdir images" y presiona Enter.
- Por ejemplo, para eliminar el archivo "archivo.txt", escribe "rm archivo.txt" y presiona Enter.
- Utiliza el comando "mv" seguido del nombre del archivo o directorio de origen y el nombre de
destino.
- Por ejemplo, para mover el archivo "archivo.txt" al directorio "documents", escribe "mv archivo.txt
documents" y presiona Enter.
- Por ejemplo, para copiar el archivo "archivo.txt" al directorio "documents", escribe "cp archivo.txt
documents" y presiona Enter.
8. Ayuda:
10
- Simplemente escribe "help" y presiona Enter.
4. BIBLIOGRAFÍA
https://www.jabenitez.com/personal/UNI/docu/shell.pdf
https://www.jabenitez.com/personal/UNI/src/JAShell.c
11