Examen de Prácticas de Sistemas Operativos. Primera Convocatoria 2006/2007. Tercero Ingeniería Técnica Informática C2 C3 NOTA ¨ Gestión ¨ Sistemas 01 de Febrero de 2007 Nombre: Apellidos: [Cuestión 1.] C1 Resuelva con una línea de comandos UNIX las siguientes tareas: Apartado a.- Cambie los permisos al fichero “examen.txt”, para que el propietario pueda realizar cualquier acción sobre él, el grupo sólo pueda ver su contenido y el resto de usuarios no puedan hacer nada sobre él. chmod 740 examen.txt Apartado b.- Compruebe si existe en el directorio “/usr” (a cualquier nivel) un subdirectorio llamado “man”. ls -lR /usr | grep "^d" | grep "man$" Apartado c.- Suponiendo que su directorio de trabajo actual es “/home/practicas/ssoo”, copie todo el contenido del directorio “boletin1” que se encuentra en “/export/usuarios”, al directorio “unix” de su directorio “home”. cp –r /export/usuarios/boletin1 $HOME/unix Apartado d.- Devuelva cuántos usuarios del sistema (es decir, los presentes en el fichero /etc/passwd) tienen por defecto la misma shell que usted. grep `echo $SHELL` /etc/passwd|wc -l Puntuación: 2 ptos. Tiempo estimado: 10 min. NOTA: − Además de los comandos vistos en clase, le puede ser de utilidad el comando wc. Éste cuenta el número de líneas, palabras o letras de un archivo, y su sintaxis la siguiente: wc [opción...] [archivo...] Si se omite el argumento archivo, wc tomará los datos (naturalmente) de la entrada estándar. La lista de opciones más importantes es la siguiente: -c Cuenta el número de bytes. -l Cuenta el número de líneas. -w Cuenta el número de palabras. [Cuestión 2.] Realice un programa en C que en ejecución resulte en dos procesos con relación filial. Concretamente, el proceso hijo deberá ejecutar la orden 'ls -la', el resultado de dicha ejecución no será mostrado por pantalla, sino que será empleado por el proceso padre que mostrará el número de bytes que ha recibido del proceso hijo. Padre: Ejecutando 'ls -la'... Hijo: 4617 bytes recibidos NOTAS: − Emplee un mecanismo de comunicación unidireccional entre procesos. − No puede usar la orden 'wc' para mostrar el número de bytes generado por el proceso hijo. − No deje procesos huérfanos. Puntuación: 4 ptos. Tiempo estimado: 30 min. 1 #include #include #include #include <stdio.h> <stdlib.h> <unistd.h> <errno.h> int main(void) { int ret, fds[2], count = 0; char buf[1024]; if (pipe(fds) == -1) { perror("pipe"); exit(EXIT_FAILURE); } ret = fork(); if (ret == -1) { perror("fork"); exit(EXIT_FAILURE); } else if (ret > 0) { printf("Padre: Ejecutando ls -la...\n"); close(fds[0]); dup2(fds[1], STDOUT_FILENO); close(fds[1]); execlp("ls", "-la", NULL); perror("execlp"); exit(EXIT_FAILURE); } else if (ret == 0) { close(fds[1]); while ((ret = read(fds[0], buf, sizeof(buf))) > 0) count += ret; if (ret == -1) { perror("read"); exit(EXIT_FAILURE); } close(fds[0]); printf("Hijo: bytes recibidos: %d\n", count); while(wait(NULL) > 0); } } 2 Examen de Prácticas de Sistemas Operativos. Primera Convocatoria 2006/2007. Tercero Ingeniería Técnica Informática C1 C2 C3 NOTA ¨ Gestión ¨ Sistemas 01 de Febrero de 2007 Nombre: Apellidos: [Cuestión 3.] Un comedor universitario cuenta con un mostrador en el que se pueden colocar un máximo de N platos. Cuando un universitario llega al comedor toma un plato del mostrador, a menos que no haya ninguno en ese momento. En caso de que el mostrador quede vacío, el universitario avisa al cocinero jefe para que proceda a colocar otros N platos en el mostrador. Una vez que el universitario toma su plato, éste se retira a comer. Utilizando la biblioteca de semáforos implementada en clase, escriba el código de dos programas en C para simular el comportamiento de los universitarios y el cocinero. Se suponen definidas dos funciones para simular las acciones de retirar/colocar un plato del mostrador: void colocar_plato(void); void retirar_plato(void); NOTAS: − Inicialmente el mostrador estará lleno, esto es, se han colocado sobre el mismo N platos. − La ejecución de los procesos finalizará cuando estos reciban la señal SIGINT, momento en el cual habrán de destruirse los grupos de semáforos empleados. Puntuación: 4 ptos. // Semáforos: Semaph excmut; Semaph comer; Semaph cocinar; Tiempo estimado: 35 min. /* Exclusión mutua para consultar el semáforo */ /* Indica cuántos platos hay en el mostrador */ /* Avisa al cocinero de que tiene que colocar más platos */ // iniciador.c void iniciador(void) { excmut = Semaph_Create("excmut", 1); comer = Semaph_Create("comer", N); cocinar = Semaph_Create("cocinar", 0); if (excmut == -1 || comer == -1 || cocinar == -1) { fprintf(stderr, "Error al crear los semáforos\n"); exit(EXIT_FAILURE); } } void terminador(int sig) { printf("Destruyendo semáforos...\n"); Semaph_Destroy("excmut",excmut); Semaph_Destroy("comer",comer); Semaph_Destroy("cocinar",cocinar); exit(0); } 3 // universitario.c int main(void) { iniciador(); // Manejador para la señal SIGINT if (signal (SIGINT, terminador) == SIG_ERR) { perror("Error en signal"); exit(EXIT_FAILURE); } while (1) { Semaph_Down(comer); Semaph_Down(excmut); if (Semaph_Get(comer)==0) semaph_up(cocinar); Semaph_Up(excmut); retirar_plato(); } } // cocinero.c int main(void) { int i; iniciador(); // Manejador para la señal SIGINT if (signal (SIGINT, terminador) == SIG_ERR) { perror("Error en signal"); exit(EXIT_FAILURE); } while (1) { Semaph_Down(cocinar); Semaph_Down(excmut); for (i=0;i<N; i++) colocar_plato(); Semaph_Set(comer,N); Semaph_Up(excmut); } return 0; } 4