Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Grupo - C#14 - A03.Practica - SistemasOperativos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 12

SISTEMAS OPERATIVOS

ING. VÍCTOR MARTÍNEZ FALCONES, MG.

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.

El propósito de esta actividad es proporcionar una experiencia práctica de aprendizaje en la


programación shell, mejorar las habilidades de programación y profundizar en la comprensión y
ejecución de comandos. Desarrollar una MiniShell implica escribir código en un lenguaje de
programación como C, lo que ayuda a reforzar las habilidades de programación.

La implementación del MiniShell se realizó en lenguaje C, aprovechando las funcionalidades y


bibliotecas estándar disponibles en dicho lenguaje. Se utilizaron bibliotecas como stdio.h, stdlib.h,
string.h, unistd.h, sys/types.h y sys/wait.h para acceder a las funciones necesarias del sistema
operativo.

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.

Instrucciones para el manejo de cadenas de caracteres:

El manejo de cadenas de caracteres es esencial en un shell, ya que implica analizar y manipular la


entrada del usuario y los argumentos de los comandos. En el desarrollo del MiniShell, se utilizaron
instrucciones como strtok() y strcmp() para realizar operaciones con cadenas de caracteres. Según
Asekas en su proyecto (minishell-en-c, s. f.), la función strtok() se utilizó para dividir la entrada del
usuario en comandos y argumentos, utilizando un delimitador especificado. Por otro lado, la función
strcmp() se empleó para comparar cadenas y determinar si dos cadenas son iguales. Estas instrucciones
se encuentran en la librería <string.h> y son ampliamente utilizadas en la programación de un MiniShell.

Instrucciones para la gestión de procesos:

La gestión de procesos es fundamental en un shell, ya que implica la creación, control y finalización de


procesos. Durante el desarrollo del MiniShell, se utilizaron instrucciones como fork() y waitpid() para
llevar a cabo la gestión de procesos. Según el proyecto minishell en github (minishell, 2017) de
Waegeneire, la función fork() se utilizó para crear un nuevo proceso hijo a partir del proceso actual,
generando así una división en la ejecución del programa. Por otro lado, la función waitpid() se empleó
para esperar a que el proceso hijo finalice su ejecución antes de que el proceso padre continúe. Estas
instrucciones se encuentran en las librerías <sys/types.h> y <sys/wait.h>, y son ampliamente utilizadas
en el desarrollo de un MiniShell para asegurar un control adecuado de los procesos.
Librerías utilizadas:

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:

a) El intérprete de comandos será sencillo y deberá

ejecutar al menos tres tipos de comandos (sin

parámetros).

b) La función básica de este interprete de comandos

será pedir un comando o programa, ejecutarlo y

volver a pedir otro comando. El programa terminará

cuando se teclee el comando so.

El diagrama de flujo propuesto se muestra en la ilustración de la izquierda.

Indicaciones finales:

1. Si el comando o proceso no se ejecuta correctamente se visualizará el mensaje de error.

2. El intérprete de comandos quedará bloqueado hasta que termine el programa.

3. El intérprete de comandos tendrá el siguiente prompt: #UTMso>

Código fuente:

1. // Grupo GActDocencia_23 | 20 de Junio del 2023


2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <string.h>
5. #include <unistd.h>
6. #include <sys/types.h>
7. #include <sys/wait.h>
8.
9. // El número 1024 representa el tamaño del búfer en bytes
10. #define tamaño 1024
11.
12. // Función para dividir la entrada del usuario en
comandos y argumentos
13. char** splitInput(char* input) {
14. char** argumentos = malloc(tamaño * sizeof(char*));

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. }

Capturas del proyecto en replit:

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.

Cambiar directorio: Con el comando cd podemos cambiar de directorio a uno en específico. La


estructura para el cambio sería cd [directorio].

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.

En este caso se ha eliminado el archivo “ejemplo2.txt” que copiamos anteriormente al directorio


principal.
Mostrar ayuda de comandos: El comando help nos permite visualizar la ayuda disponible referente a
los comandos disponibles en el programa.

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.

Si el comando ingresado es reconocido por el MiniShell, se ejecuta la acción correspondiente y se


muestra el resultado en la consola. Por ejemplo, si se ingresa el comando "ls", se mostrará una lista de
archivos y directorios en el directorio actual.

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.

- Simplemente escribe el nombre del comando y presiona Enter para ejecutarlo.

- 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.

3. Mostrar directorio actual:

- Utiliza el comando "pwd" para mostrar el directorio actual.

- Simplemente escribe "pwd" y presiona Enter.


4. Crear directorios:

- 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.

5. Eliminar archivos o directorios:


- Utiliza el comando "rm" seguido del nombre del archivo o directorio que deseas eliminar.

- Por ejemplo, para eliminar el archivo "archivo.txt", escribe "rm archivo.txt" y presiona Enter.

6. Mover o renombrar archivos o directorios:

- 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.

7. Copiar archivos o directorios:


- Utiliza el comando "cp" seguido del nombre del archivo o directorio de origen y el nombre de
destino.

- Por ejemplo, para copiar el archivo "archivo.txt" al directorio "documents", escribe "cp archivo.txt
documents" y presiona Enter.

8. Ayuda:

- Utiliza el comando "help" para mostrar la lista de comandos disponibles y su funcionamiento.

10
- Simplemente escribe "help" y presiona Enter.

9. Salir del MiniShell:


- Utiliza el comando "so" para salir del MiniShell.

- Simplemente escribe "so" y presiona Enter.

4. BIBLIOGRAFÍA

(Documentación práctica en shell, s. f.) Recuperado 16 de junio de 2023, de

https://www.jabenitez.com/personal/UNI/docu/shell.pdf

Waegeneire, B. (2017). Minishell [C]. https://github.com/bricewge/minishell

(Jabenitez, S. f.). Recuperado 16 de junio de 2023, de

https://www.jabenitez.com/personal/UNI/src/JAShell.c

11

También podría gustarte