代写 C python stata Área de Arquitectura y Tecnología de Computadores Universidad Carlos III de Madrid

Área de Arquitectura y Tecnología de Computadores Universidad Carlos III de Madrid
SISTEMAS OPERATIVOS Práctica 1. Llamadas al sistema operativo
Grado de Ingeniería en Informática
Curso 2018/2019

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Índice
1. Enunciado de la Práctica 2
1.1. Descripción de la Práctica 3
mycat 3 myls 4 mysize 5
1.2. Código Fuente de Apoyo 6
1.3. Corrector proporcionado 6
2. Entrega 7
2.1. Plazo de entrega 7
2.2. Procedimiento de entrega de las prácticas 7
2.3. Documentación a Entregar 7
3. Normas 9 4. Anexo (Llamadas al sistema). 10
4.1. Llamadas al sistema relacionadas con archivos 10
4.2. Llamadas al sistema relacionadas con directorios 11
4.3. Manual (man function). 12
5. Bibliografía 13
1

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Enunciado de la Práctica
Esta práctica permite al alumno familiarizarse con las llamadas al sistema operativo (en concreto, el sistema de ficheros) siguiendo el estándar POSIX. Unix permite efectuar llamadas al sistema directamente desde un programa realizado en un lenguaje de alto nivel, en particular en lenguaje C.
La mayor parte de las entradas/salidas (E/S) sobre ficheros en Unix pueden realizarse utilizando solamente cinco llamadas: open, read, write, lseek y close.
Para el kernel del sistema operativo, todos los archivos abiertos son identificados por medio de descriptores de archivo. Un descriptor de archivo es un entero no negativo. Cuando abrimos, open, un archivo que ya existe, el núcleo devuelve un descriptor de archivo al proceso. Cuando queremos leer o escribir de/en un archivo, identificamos el archivo con el descriptor de archivo que fue devuelto por la llamada anteriormente descrita.
Cada archivo abierto tiene una posición de lectura/escritura actual (“current file offset”). Está representado por un entero no negativo que mide el número de bytes desde el comienzo del archivo. Las operaciones de lectura y escritura comienzan normalmente en la posición actual y provocan un incremento en dicha posición, igual al número de bytes leídos o escritos. Por defecto, esta posición es inicializada a 0 cuando se abre un archivo, a menos que se especifique la opción O_APPEND. La posición actual (current_offset) de un archivo abierto puede cambiarse explícitamente utilizando la llamada al sistema lseek.
Para manipular directorios, se pueden utilizar las llamadas al sistema opendir, readdir y closedir. Un directorio abierto se identifica con un descriptor de directorio, que es un puntero a un tipo DIR (DIR*). Cuando abrimos un directorio con opendir, el núcleo devuelve un descriptor de directorio, sobre el cual se pueden leer las entradas de dicho directorio mediante llamadas a la función readdir. La llamada readdir devuelve una entrada de directorio en un puntero a una estructura dirent (struct dirent*). Dicha estructura contendrá los campos correspondientes a esa entrada como el nombre de la entrada, o el tipo (si es un fichero normal, si es otro directorio, enlaces simbólicos, etc.). Sucesivas llamadas a la función readdir irán devolviendo las sucesivas entradas de un directorio abierto.
2

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Descripción de la Práctica
Se pretende implementar tres programas en C que utilicen las llamadas al sistema anteriormente descritas. Dichos programas serán mycat, myls y mysize. Para ello, dispondrán de los correspondientes ficheros de código mycat.c, myls.c y mysize.c.
mycat
El primer programa, mycat, abrirá un fichero especificado como argumento y mostrará el contenido por la salida estándar (la consola) utilizando las llamadas open, read, write y close. Para ello:
● Abrirá mediante open el fichero pasado como parámetro.
● Leerá los contenidos del fichero utilizando un buffer intermedio de 1024 bytes
(read).
● Escribirá (write) el contenido del buffer en la salida estándar. Utilice la constante
STDOUT_FILENO como valor del descriptor para escribir en la salida estándar.
● Finalmente cerrará el descriptor mediante close.
Uso: ./mycat Requisitos:
● El programa debe mostrar todo el contenido del fichero.
● El programa debe mostrar exactamente el mismo resultado del comando cat.
● El programa debe devolver -1 si no se le ha pasado ningún argumento de entrada.
● El programa debe devolver -1 si hubo un error al abrir el fichero (e.g. el fichero no
existe).
Sugerencia de prueba1: Constatar que la salida del programa sobre un fichero coincide con la del mandato cat (sin argumentos) sobre ese mismo fichero.
./mycat p1_pruebas/f1.txt
Nombre1 Nombre2 Nombre3
V 32 M 35 V 53
09834320
32478973
98435834
24500
27456
45000
1 Cumplir esta prueba no es garantía de tener la máxima nota en el ejercicio. Se trata
solo de una sugerencia para que los alumnos comprueben el funcionamiento general de
su programa. Los alumnos deberán además cumplir los otros requisitos del programa, realizar el código adecuado, comentarlo, probar casos extremos, y en general cumplir con las demás exigencias descritas en el enunciado de la práctica.
3

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
myls
El segundo programa, myls, abrirá un directorio especificado como argumento (o el directorio actual si no se especifica ningún directorio como argumento), y mostrará por pantalla el nombre de todas las entradas de dicho directorio, imprimiendo una entrada por línea. Para ello:
● Obtendrá el directorio a listar, de los argumentos del programa u obtendrá el directorio actual mediante la llamada getcwd. Utilice la constante PATH_MAX como tamaño máximo que puede llegar a tener la ruta del directorio actual.
● Lo abrirá mediante opendir.
● Luego, leerá cada una de las entradas del directorio mediante readdir e imprimirá
el nombre de la entrada mediante printf.
● Finalmente cerrará el descriptor de directorio mediante closedir.
Uso 1: ./myls Uso 2: ./myls
Requisitos:
● El programa debe listar todas las entradas del directorio, en el orden en que las vaya devolviendo la llamada readdir, y mostrando cada entrada en una línea.
● El programa debe listar las entradas del directorio pasado como parámetro (uso 1), o del directorio actual si no le han pasado ningún parámetro (uso 2).
● El programa debe mostrar exactamente el mismo resultado que el comando ls.
● El programa debe devolver -1 si hubo un error al abrir el directorio (e.g. el
directorio no existe).
Sugerencia de prueba2: Constatar que la salida del programa sobre un directorio coincide con la del mandato ls –f –1 sobre ese mismo directorio: ls -f -1

.
./myls p1_pruebas/ dirC
f1.txt
dirA
f2.txt
. ..
2 Cumplir esta prueba no es garantía de tener la máxima nota en el ejercicio. Se trata
solo de una sugerencia para que los alumnos comprueben el funcionamiento general de
su programa. Los alumnos deberán además cumplir los otros requisitos del programa, realizar el código adecuado, comentarlo, probar casos extremos, y en general cumplir con las demás exigencias descritas en el enunciado de la práctica.
4

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
mysize
El tercer programa, mysize, obtendrá el directorio actual y listará todos los ficheros regulares que contiene así como su tamaño en bytes. Para ello:
● Obtendrá el directorio actual mediante la llamada getcwd. Utilice la constante PATH_MAX como tamaño máximo que puede llegar a tener la ruta del directorio actual.
● Lo abrirá mediante opendir.
● Luego, leerá las entradas del directorio sucesivamente mediante readdir.
o Si la entrada es un fichero regular (campo d_type de la estructura dirent igual a la constante DT_REG)
▪ Abrirá el fichero mediante open.
▪ Desplazará el puntero al final del fichero y obtendrá su valor
mediante lseek.
▪ Cerrará el fichero mediante close.
▪ Imprimirá por último el nombre del fichero (campo d_name de la
estructura dirent), seguido de un carácter tabulador, y el tamaño
obtenido mediante lseek, finalizando con un salto de línea.
● Este procedimiento se repetirá para cada una de las entradas del directorio.
● Finalmente cerrará el descriptor de directorio mediante closedir.
Uso: ./mysize Requisitos:
● El programa debe mostrar el nombre y tamaño de todos los ficheros regulares del directorio, en el orden en que los vaya devolviendo la llamada readdir, y mostrando los datos de cada fichero en una línea.
● El programa solo mostrará datos de ficheros regulares.
● El programa mostrara los datos en el siguiente formato:
.
● El programa debe devolver -1 si hubo un error al abrir el directorio.
cd p1_pruebas/
../mysize f1.txt 87 f2.txt 87
5

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Código Fuente de Apoyo
Para facilitar la realización de esta práctica se dispone del fichero p1_llamadas_2019.zip que contiene código fuente de apoyo. Para extraer su contenido ejecutar lo siguiente:
unzip p1_llamadas_2019.zip
Al extraer su contenido, se crea el directorio p1_llamadas/, donde se debe desarrollar la práctica. Dentro de este directorio se habrán incluido los siguientes ficheros:
Makefile
Fichero fuente para la herramienta make. NO debe ser modificado. Con él se consigue la recompilación automática sólo de los ficheros fuente que se modifiquen. Utilice $ make para compilar los programas, y $ make clean para eliminar los archivos compilados.
mycat.c
Fichero fuente de C en donde los alumnos deberán codificar el programa mycat. myls.c
Fichero fuente de C en donde los alumnos deberán codificar el programa myls. mysize.c
Fichero fuente de C en donde los alumnos deberán codificar el programa mysize. p1_tests/
Este directorio contiene ficheros y directorios de ejemplo, para poder ejecutar y probar los programas.
corrector_ssoo_p1_2019.py
Corrector de la práctica. Verifica el formato de la entrega así como la funcionalidad básica.
Corrector proporcionado
Se proporciona a los alumnos el script en python corrector_ssoo_p1_2019.py que verifica que el formato del entregable de la práctica es el correcto (sigue las especificaciones de nombrado, está bien comprimido y ejecuta pruebas básicas). El corrector deberá ejecutarse en las máquinas Linux de las aulas informáticas del laboratorio del departamento de informática o en el servidor guernika.lab.inf.uc3m.es.
El comando para ejecutar el corrector es el siguiente:
python corrector_ssoo_p1_2019.py
Siendo entregable.zip el fichero que se va a entregar por aula global (ver siguiente
apartado). Ejemplo:
$ python corrector_ssoo_p1.py ssoo_p1_100254896_100047014.zip
El corrector imprimirá mensajes por pantalla indicando los resultados finales (0 mal, 1 bien).
6

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Entrega
Plazo de entrega
La fecha límite de entrega de la práctica en AULA GLOBAL será el Domingo 3 de Marzo de 2019 (hasta las 23:55h).
Procedimiento de entrega de las prácticas
La entrega de las prácticas ha de realizarse de forma electrónica. En AULA GLOBAL se habilitarán unos enlaces a través de los cuales se podrá realizar la entrega de las prácticas. En concreto, se habilitará un entregador para el código de la práctica, y otro de tipo TURNITIN para la memoria de la práctica.
Documentación a Entregar
Se debe entregar un archivo comprimido en formato zip con el nombre ssoo_p1_AAAAAAAAA_BBBBBBBBB_CCCCCCCC.zip donde A…A, B…B y C…C son los NIAs de los integrantes del grupo. En caso de realizar la práctica en solitario, el formato será ssoo_p1_AAAAAAAAA.zip. El archivo zip se entregará en el entregador correspondiente al código de la práctica. El archivo debe contener:
o Makefile o mycat.c o myls.c
o mysize.c
La memoria se entregará en formato PDF en un fichero llamado ssoo_p1_AAAAAAAAA_BBBBBBBBB_CCCCCCC.pdf. Solo se corregirán y calificarán memorias en formato pdf. Tendrá que contener al menos los siguientes apartados:
● Descripción del código detallando las principales funciones implementadas. NO incluir código fuente de la práctica en este apartado. Cualquier código será automáticamente ignorado.
● Bateríadepruebasutilizadasyresultadosobtenidos.Sedarámayorpuntuacióna pruebas avanzadas, casos extremos, y en general a aquellas pruebas que garanticen el correcto funcionamiento de la práctica en todos los casos. Hay que tener en cuenta:
7

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
o Que un programa compile correctamente y sin advertencias (warnings) no es garantía de que funcione correctamente.
o Evite pruebas duplicadas que evalúan los mismos flujos de programa. La puntuación de este apartado no se mide en función del número de pruebas, sino del grado de cobertura de las mismas. Es mejor pocas pruebas que evalúan diferentes casos a muchas pruebas que evalúan siempre el mismo caso.
● Conclusiones, problemas encontrados, cómo se han solucionado, y opiniones personales.
Se puntuará también los siguientes aspectos relativos a la presentación de la práctica:
● Debe contener portada, con los autores de la práctica y sus NIAs.
● Debe contener índice de contenidos.
● La memoria debe tener números de página en todas las páginas (menos la portada).
● El texto de la memoria debe estar justificado.
● Plan de pruebas:
– Detallar el objetivo de la prueba, el procedimiento de ejecución, la salida esperada, y
opcionalmente la salida obtenida por la implementación propia.
– Evitar pruebas duplicadas (p.e. mismo tipo de parámetros con distinto valor). – Tabular la información para una mejor presentación.
– Compilar sin errores no es una prueba, y no garantiza cubrir todos los aspectos de la práctica. Analizar el código en busca de potenciales fuentes de error puede ayudar a construir un buen plan de pruebas.
● La memoria tendrá un máximo de 8 páginas (incluye portada, índices y apartados).
El archivo pdf se entregará en el entregador correspondiente a la memoria de la práctica (entregador TURNITIN).
NOTA: La única versión registrada de su práctica es la última entregada. La valoración de ésta es la única válida y definitiva.
8

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Normas
1) Las prácticas que no compilen o que no se ajusten a la funcionalidad y requisitos
planteados, obtendrán una calificación de 0.
2) Se prestará especial atención a detectar funcionalidades copiadas entre dos prácticas. En caso de encontrar implementaciones comunes en dos prácticas, los alumnos involucrados (copiados y copiadores) perderán las calificaciones obtenidas por evaluación continua.
3) Los programas deben compilar sin warnings.
4) Los programas deberán funcionar bajo un sistema Linux, no se permite la realización de la práctica para sistemas Windows. Además, para asegurarse del correcto funcionamiento de la práctica, deberá chequearse su compilación y ejecución en los laboratorios de informática de la universidad o en el servidor guernika.lab.inf.uc3m.es. Si el código presentado no compila o no funciona sobre estas plataformas la implementación no se considerará correcta.
5) Un programa no comentado, obtendrá una calificación de 0.
6) La entrega de la práctica se realizará a través de aula global, tal y como se detalla en el apartado Entrega de este documento. No se permite la entrega a través de correo electrónico sin autorización previa.
7) Se debe respetar en todo momento el formato de la entrada y salida que se indica en cada programa a implementar.
8) Se debe realizar un control de errores en cada uno de los programas, más allá de lo solicitado explícitamente en cada apartado.
Los programas entregados que no sigan estas normas no se considerarán aprobados.
9

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Anexo (Llamadas al sistema).
Las llamadas al sistema proporcionan la interfaz entre el sistema operativo y un programa en ejecución. UNIX permite efectuar llamadas al sistema directamente desde un programa realizado en un lenguaje de alto nivel, en particular en lenguaje C, en cuyo caso las llamadas se asemejan a llamadas a funciones, tal y como si estuvieran definidas en una biblioteca estándar. El formato general de una llamada al sistema es:
status = funcion_estandar (arg1, arg2,…..)
En caso de realizar una llamada sin éxito, devolvería en la variable status un valor -1. En la variable global errno se coloca el número de error, con el cual podemos obtener la asociación del error con lo que realmente ha ocurrido en el fichero errno.h, (contenido en la ruta: /usr/src. En linux : /usr/src/linux/include/asm/errno.h).
Llamadas al sistema relacionadas con archivos
int open(const char * path, int flag, …)
Abre o crea un fichero especificado por path. El fichero abierto puede utilizarse para lectura, escritura, o ambas, en función de lo especificado por flag. Devuelve un descriptor de fichero que se puede utilizar para la lectura o escritura en el archivo.
Más ayuda en: man 2 open
int close(int fildes)
Cierra un archivo abierto anteriormente asociado al descriptor fildes. Si n = -1→ Error al cerrar el fichero.
Más ayuda en: man 2 close
ssize_t read(int fildes, void * buf, size_t nbyte)
Intenta leer de un archivo (cuyo descriptor de fichero fildes se obtuvo de abrirlo) tantos bytes como indica nbyte, colocando la información leída a partir de la dirección de memoria buf.
Devuelve el número de bytes leídos (que puede ser menor o igual a nbyte). Si retorno = 0 → Fin de fichero (EOF). Si retorno = -1 → Error de lectura.
Más ayuda en: man 2 read
ssize_t write(int fildes, const void * buf, size_t nbyte)
10

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
Intenta escribir en un archivo (cuyo descriptor de fichero fildes se obtuvo de abrirlo) tantos bytes como indica nbyte, tomándolos de la dirección de memoria indicada buf. Devuelve en n el número de bytes que realmente se han escrito (que puede ser menor o igual a nbyte). Si retorno = -1 → Error de escritura.
Cada write (así como cada read), actualiza automáticamente la posición actual del fichero que se usa para determinar la posición en el archivo del siguiente write o read.
Más ayuda en: man 2 write
off_t lseek(int fildes, off_t offset, int whence)
Modifica el valor del apuntador del descriptor fildes en el archivo, a la posición explícita en desplazamiento a partir de la referencia impuesta en origen, de forma que las llamadas read o write pueden iniciarse en cualquier parte del archivo.
Si retorno = -1 → Error de posicionamiento.
El parámetro whence puede tomar los siguientes valores: • SEEK_SET → desde el principio del fichero. • SEEK_CUR → desde la posición actual.
• SEEK_END → desde el final del fichero.
El parámetro offset se expresa en bytes, y toma un valor positivo o negativo. Ejemplo:
a b c d efghi
lseek(5,4,SEEK_SET) → Al avanzar 4 bytes, la siguiente lectura sería la “e”. El descriptor del fichero abierto ‘fd’ es 5.
Más ayuda en: man 2 lseek
Llamadas al sistema relacionadas con directorios
DIR * opendir(const char * dirname)
Abre un directorio existente especificado por dirname. Devuelve un descriptor de directorio que se puede utilizar para la lectura de las entradas de dicho directorio. Si retorno = NULL → Error al abrir el directorio.
Más ayuda en: man opendir
struct dirent * readdir(DIR * dirp)
Lee de un directorio (cuyo descriptor de directorio dirp se obtuvo al abrirlo) la 11

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
siguiente entrada del directorio. La estructura dirent contiene un campo d_name (char * d_name) con el nombre de la entrada y un campo d_type (unsigned char d_type) con el tipo de la entrada (fichero, otro directorio, etc.).
Siguientes llamadas a esta función sobre el mismo descriptor de directorio devuelven las subsiguientes entradas. Cuando no quedan más entradas por devolver, esta llamada devuelve NULL.
Más ayuda en: man readdir
int closedir(DIR * dirp)
Cierra un directorio abierto anteriormente. Si retorno = -1→ Error al cerrar el directorio.
Más ayuda en: man closedir Manual (man function).
man es el paginador del manual del sistema, es decir permite buscar información sobre un programa, una utilidad o una función. Véase el siguiente ejemplo:
man 2 open
Una página de manual tiene varias partes. Éstas están etiquetadas como NOMBRE, SINOPSIS, DESCRIPCIÓN, OPCIONES, FICHEROS, VÉASE TAMBIÉN, BUGS, y AUTOR. En la etiqueta de SINOPSIS se recogen las librerías (identificadas por la directiva #include) que se deben incluir en el programa en C del usuario para poder hacer uso de las funciones correspondientes. Para salir de la página mostrada, basta con pulsar la tecla ‘q’.
Las formas más comunes de usar man son las siguientes:
● man sección elemento: Presenta la página de elemento disponible en la sección del
manual.
● man -a elemento: Presenta, secuencialmente, todas las páginas de elemento disponibles en el manual. Entre página y página se puede decidir saltar a la siguiente o salir del paginador completamente.
● man -k palabra-clave: Busca la palabra-clave entre las descripciones breves y las páginas de manual y presenta todas las que casen.
Bibliografía
– El lenguaje de programación C: diseño e implementación de programas Félix García, Jesús Carretero, Javier Fernández y Alejandro Calderón. Prentice-Hall, 2002.
12

Departamento de Informática Grado en Ingeniería Informática Sistemas Operativos (2018- 2019)
Práctica 1 – Llamadas al sistema operativo
– The UNIX System S.R. Bourne Addison-Wesley, 1983.
– Advanced UNIX Programming M.J. Rochkind Prentice-Hall, 1985.
– Sistemas Operativos: Una visión aplicada Jesús Carretero, Félix García, Pedro de Miguel y Fernando Pérez. McGraw-Hill, 2001.
– Programming Utilities and Libraries SUN Microsystems, 1990.
– Unix man pages (man function)
13