Solución del examen. 1ª Convocatoria 2006/2007.

Anuncio
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
Descargar