Area de Arquitectura y Tecnologia de Computadores Universidad Carlos III de Madrid
SISTEMAS OPERATIVOS Practica 1. Llamadas al sistema operativo
Grado de Ingenieria en Informatica
Curso 2018/2019
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Indice
1. Enunciado de la Practica 2
1.1. Descripcion de la Practica 3
mycat 3 myls 4 mysize 5
1.2. Codigo 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 practicas 7
2.3. Documentacion 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. Bibliografia 13
1
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Enunciado de la Practica
Esta practica permite al alumno familiarizarse con las llamadas al sistema operativo (en concreto, el sistema de ficheros) siguiendo el estandar 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 nucleo 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 posicion de lectura/escritura actual (current file offset). Esta representado por un entero no negativo que mide el numero de bytes desde el comienzo del archivo. Las operaciones de lectura y escritura comienzan normalmente en la posicion actual y provocan un incremento en dicha posicion, igual al numero de bytes leidos o escritos. Por defecto, esta posicion es inicializada a 0 cuando se abre un archivo, a menos que se especifique la opcion O_APPEND. La posicion actual (current_offset) de un archivo abierto puede cambiarse explicitamente 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 nucleo devuelve un descriptor de directorio, sobre el cual se pueden leer las entradas de dicho directorio mediante llamadas a la funcion readdir. La llamada readdir devuelve una entrada de directorio en un puntero a una estructura dirent (struct dirent*). Dicha estructura contendra 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 simbolicos, etc.). Sucesivas llamadas a la funcion readdir iran devolviendo las sucesivas entradas de un directorio abierto.
2
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Descripcion de la Practica
Se pretende implementar tres programas en C que utilicen las llamadas al sistema anteriormente descritas. Dichos programas seran mycat, myls y mysize. Para ello, dispondran de los correspondientes ficheros de codigo mycat.c, myls.c y mysize.c.
mycat
El primer programa, mycat, abrira un fichero especificado como argumento y mostrara el contenido por la salida estandar (la consola) utilizando las llamadas open, read, write y close. Para ello:
Abrira mediante open el fichero pasado como parametro.
Leera los contenidos del fichero utilizando un buffer intermedio de 1024 bytes
(read).
Escribira (write) el contenido del buffer en la salida estandar. Utilice la constante
STDOUT_FILENO como valor del descriptor para escribir en la salida estandar.
Finalmente cerrara el descriptor mediante close.
Uso: ./mycat
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 ningun 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 garantia de tener la maxima nota en el ejercicio. Se trata
solo de una sugerencia para que los alumnos comprueben el funcionamiento general de
su programa. Los alumnos deberan ademas cumplir los otros requisitos del programa, realizar el codigo adecuado, comentarlo, probar casos extremos, y en general cumplir con las demas exigencias descritas en el enunciado de la practica.
3
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
myls
El segundo programa, myls, abrira un directorio especificado como argumento (o el directorio actual si no se especifica ningun directorio como argumento), y mostrara por pantalla el nombre de todas las entradas de dicho directorio, imprimiendo una entrada por linea. Para ello:
Obtendra el directorio a listar, de los argumentos del programa u obtendra el directorio actual mediante la llamada getcwd. Utilice la constante PATH_MAX como tamano maximo que puede llegar a tener la ruta del directorio actual.
Lo abrira mediante opendir.
Luego, leera cada una de las entradas del directorio mediante readdir e imprimira
el nombre de la entrada mediante printf.
Finalmente cerrara el descriptor de directorio mediante closedir.
Uso 1: ./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 linea.
El programa debe listar las entradas del directorio pasado como parametro (uso 1), o del directorio actual si no le han pasado ningun parametro (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 garantia de tener la maxima nota en el ejercicio. Se trata
solo de una sugerencia para que los alumnos comprueben el funcionamiento general de
su programa. Los alumnos deberan ademas cumplir los otros requisitos del programa, realizar el codigo adecuado, comentarlo, probar casos extremos, y en general cumplir con las demas exigencias descritas en el enunciado de la practica.
4
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
mysize
El tercer programa, mysize, obtendra el directorio actual y listara todos los ficheros regulares que contiene asi como su tamano en bytes. Para ello:
Obtendra el directorio actual mediante la llamada getcwd. Utilice la constante PATH_MAX como tamano maximo que puede llegar a tener la ruta del directorio actual.
Lo abrira mediante opendir.
Luego, leera 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)
Abrira el fichero mediante open.
Desplazara el puntero al final del fichero y obtendra su valor
mediante lseek.
Cerrara el fichero mediante close.
Imprimira por ultimo el nombre del fichero (campo d_name de la
estructura dirent), seguido de un caracter tabulador, y el tamano
obtenido mediante lseek, finalizando con un salto de linea.
Este procedimiento se repetira para cada una de las entradas del directorio.
Finalmente cerrara el descriptor de directorio mediante closedir.
Uso: ./mysize Requisitos:
El programa debe mostrar el nombre y tamano 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 linea.
El programa solo mostrara 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 Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Codigo Fuente de Apoyo
Para facilitar la realizacion de esta practica se dispone del fichero p1_llamadas_2019.zip que contiene codigo 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 practica. Dentro de este directorio se habran incluido los siguientes ficheros:
Makefile
Fichero fuente para la herramienta make. NO debe ser modificado. Con el se consigue la recompilacion automatica solo 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 deberan codificar el programa mycat. myls.c
Fichero fuente de C en donde los alumnos deberan codificar el programa myls. mysize.c
Fichero fuente de C en donde los alumnos deberan 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 practica. Verifica el formato de la entrega asi como la funcionalidad basica.
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 practica es el correcto (sigue las especificaciones de nombrado, esta bien comprimido y ejecuta pruebas basicas). El corrector debera ejecutarse en las maquinas Linux de las aulas informaticas del laboratorio del departamento de informatica 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 imprimira mensajes por pantalla indicando los resultados finales (0 mal, 1 bien).
6
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Entrega
Plazo de entrega
La fecha limite de entrega de la practica en AULA GLOBAL sera el Domingo 3 de Marzo de 2019 (hasta las 23:55h).
Procedimiento de entrega de las practicas
La entrega de las practicas ha de realizarse de forma electronica. En AULA GLOBAL se habilitaran unos enlaces a traves de los cuales se podra realizar la entrega de las practicas. En concreto, se habilitara un entregador para el codigo de la practica, y otro de tipo TURNITIN para la memoria de la practica.
Documentacion a Entregar
Se debe entregar un archivo comprimido en formato zip con el nombre ssoo_p1_AAAAAAAAA_BBBBBBBBB_CCCCCCCC.zip donde AA, BB y CC son los NIAs de los integrantes del grupo. En caso de realizar la practica en solitario, el formato sera ssoo_p1_AAAAAAAAA.zip. El archivo zip se entregara en el entregador correspondiente al codigo de la practica. El archivo debe contener:
o Makefile o mycat.c o myls.c
o mysize.c
La memoria se entregara en formato PDF en un fichero llamado ssoo_p1_AAAAAAAAA_BBBBBBBBB_CCCCCCC.pdf. Solo se corregiran y calificaran memorias en formato pdf. Tendra que contener al menos los siguientes apartados:
Descripcion del codigo detallando las principales funciones implementadas. NO incluir codigo fuente de la practica en este apartado. Cualquier codigo sera automaticamente ignorado.
Bateriadepruebasutilizadasyresultadosobtenidos.Sedaramayorpuntuaciona pruebas avanzadas, casos extremos, y en general a aquellas pruebas que garanticen el correcto funcionamiento de la practica en todos los casos. Hay que tener en cuenta:
7
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
o Que un programa compile correctamente y sin advertencias (warnings) no es garantia de que funcione correctamente.
o Evite pruebas duplicadas que evaluan los mismos flujos de programa. La puntuacion de este apartado no se mide en funcion del numero de pruebas, sino del grado de cobertura de las mismas. Es mejor pocas pruebas que evaluan diferentes casos a muchas pruebas que evaluan siempre el mismo caso.
Conclusiones, problemas encontrados, como se han solucionado, y opiniones personales.
Se puntuara tambien los siguientes aspectos relativos a la presentacion de la practica:
Debe contener portada, con los autores de la practica y sus NIAs.
Debe contener indice de contenidos.
La memoria debe tener numeros de pagina en todas las paginas (menos la portada).
El texto de la memoria debe estar justificado.
Plan de pruebas:
Detallar el objetivo de la prueba, el procedimiento de ejecucion, la salida esperada, y
opcionalmente la salida obtenida por la implementacion propia.
Evitar pruebas duplicadas (p.e. mismo tipo de parametros con distinto valor). Tabular la informacion para una mejor presentacion.
Compilar sin errores no es una prueba, y no garantiza cubrir todos los aspectos de la practica. Analizar el codigo en busca de potenciales fuentes de error puede ayudar a construir un buen plan de pruebas.
La memoria tendra un maximo de 8 paginas (incluye portada, indices y apartados).
El archivo pdf se entregara en el entregador correspondiente a la memoria de la practica (entregador TURNITIN).
NOTA: La unica version registrada de su practica es la ultima entregada. La valoracion de esta es la unica valida y definitiva.
8
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Normas
1) Las practicas que no compilen o que no se ajusten a la funcionalidad y requisitos
planteados, obtendran una calificacion de 0.
2) Se prestara especial atencion a detectar funcionalidades copiadas entre dos practicas. En caso de encontrar implementaciones comunes en dos practicas, los alumnos involucrados (copiados y copiadores) perderan las calificaciones obtenidas por evaluacion continua.
3) Los programas deben compilar sin warnings.
4) Los programas deberan funcionar bajo un sistema Linux, no se permite la realizacion de la practica para sistemas Windows. Ademas, para asegurarse del correcto funcionamiento de la practica, debera chequearse su compilacion y ejecucion en los laboratorios de informatica de la universidad o en el servidor guernika.lab.inf.uc3m.es. Si el codigo presentado no compila o no funciona sobre estas plataformas la implementacion no se considerara correcta.
5) Un programa no comentado, obtendra una calificacion de 0.
6) La entrega de la practica se realizara a traves de aula global, tal y como se detalla en el apartado Entrega de este documento. No se permite la entrega a traves de correo electronico sin autorizacion 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, mas alla de lo solicitado explicitamente en cada apartado.
Los programas entregados que no sigan estas normas no se consideraran aprobados.
9
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Anexo (Llamadas al sistema).
Las llamadas al sistema proporcionan la interfaz entre el sistema operativo y un programa en ejecucion. 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 estandar. El formato general de una llamada al sistema es:
status = funcion_estandar (arg1, arg2,..)
En caso de realizar una llamada sin exito, devolveria en la variable status un valor -1. En la variable global errno se coloca el numero de error, con el cual podemos obtener la asociacion 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 funcion de lo especificado por flag. Devuelve un descriptor de fichero que se puede utilizar para la lectura o escritura en el archivo.
Mas 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.
Mas 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 informacion leida a partir de la direccion de memoria buf.
Devuelve el numero de bytes leidos (que puede ser menor o igual a nbyte). Si retorno = 0 Fin de fichero (EOF). Si retorno = -1 Error de lectura.
Mas ayuda en: man 2 read
ssize_t write(int fildes, const void * buf, size_t nbyte)
10
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 1 Llamadas al sistema operativo
Intenta escribir en un archivo (cuyo descriptor de fichero fildes se obtuvo de abrirlo) tantos bytes como indica nbyte, tomandolos de la direccion de memoria indicada buf. Devuelve en n el numero de bytes que realmente se han escrito (que puede ser menor o igual a nbyte). Si retorno = -1 Error de escritura.
Cada write (asi como cada read), actualiza automaticamente la posicion actual del fichero que se usa para determinar la posicion en el archivo del siguiente write o read.
Mas 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 posicion explicita 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 parametro whence puede tomar los siguientes valores: SEEK_SET desde el principio del fichero. SEEK_CUR desde la posicion actual.
SEEK_END desde el final del fichero.
El parametro 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 seria la e. El descriptor del fichero abierto fd es 5.
Mas 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.
Mas 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 Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 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 funcion sobre el mismo descriptor de directorio devuelven las subsiguientes entradas. Cuando no quedan mas entradas por devolver, esta llamada devuelve NULL.
Mas ayuda en: man readdir
int closedir(DIR * dirp)
Cierra un directorio abierto anteriormente. Si retorno = -1 Error al cerrar el directorio.
Mas ayuda en: man closedir Manual (man function).
man es el paginador del manual del sistema, es decir permite buscar informacion sobre un programa, una utilidad o una funcion. Vease el siguiente ejemplo:
man 2 open
Una pagina de manual tiene varias partes. Estas estan etiquetadas como NOMBRE, SINOPSIS, DESCRIPCION, OPCIONES, FICHEROS, VEASE TAMBIEN, BUGS, y AUTOR. En la etiqueta de SINOPSIS se recogen las librerias (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 pagina mostrada, basta con pulsar la tecla q.
Las formas mas comunes de usar man son las siguientes:
man seccion elemento: Presenta la pagina de elemento disponible en la seccion del
manual.
man -a elemento: Presenta, secuencialmente, todas las paginas de elemento disponibles en el manual. Entre pagina y pagina 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 paginas de manual y presenta todas las que casen.
Bibliografia
El lenguaje de programacion C: diseno e implementacion de programas Felix Garcia, Jesus Carretero, Javier Fernandez y Alejandro Calderon. Prentice-Hall, 2002.
12
Departamento de Informatica Grado en Ingenieria Informatica Sistemas Operativos (2018- 2019)
Practica 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 vision aplicada Jesus Carretero, Felix Garcia, Pedro de Miguel y Fernando Perez. McGraw-Hill, 2001.
Programming Utilities and Libraries SUN Microsystems, 1990.
Unix man pages (man function)
13
Reviews
There are no reviews yet.