Publicado el 4 de Diciembre del 2018
518 visualizaciones desde el 4 de Diciembre del 2018
303,6 KB
51 paginas
Creado hace 15a (19/09/2008)
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Ingeniería Técnica en Informática de
Gestión
Sistemas Operativos II
Prácticas
Área de Arquitectura y Tecnología de Computadores
Escuela Universitaria Politécnica de Teruel
Luis C. Aparicio Cardiel
1
Sistemas Operativos II
Indice:
Ejercicios básicos de Sistemas Operativos I.
Práctica 0: Variables de entorno.
Práctica 1: Control de procesos.
Práctica 2: Medición sobre procesos.
Práctica 3: Comunicación elemental entre procesos:
- Tuberías
- Fifos
Práctica 4: Señales.
Práctica 5: Sincronización: semáforos.
Práctica 6: IPC: Sockets
Práctica 7: IPC: RPC
2
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Ejercicios básicos de Sistemas Operativos I.
Problema 1
Proceso 1
Proceso
Creador
Escribe un programa en C utilizando llamadas al sistema que genere una lista de
procesos en la que como máximo haya 2 procesos a la vez en el sistema. Cada uno de
ellos debe indicar el número de orden que ocupa en la lista.
Proceso N - 1
Proceso 2
Proceso N
Los mensajes de una posible ejecución podrían ser:
$ listaP ↵
Soy el proceso creador 5031
Soy el nuevo proceso: 5032 mi padre es 5031
Mi numero de orden es 1
Mi padre ha finalizado, ahora soy el proceso maestro
Soy el nuevo proceso: 5033 mi padre es 5032
Mi numero de orden es 2
Mi padre ha finalizado, ahora soy el proceso maestro
Soy el nuevo proceso: 5034 mi padre es 5033
Mi numero de orden es 3
Mi padre ha finalizado, ahora soy el proceso maestro
La lista de procesos ha sido creada satisfactoriamente
3
Problema 2:
1º.- Comenta en detalle el siguiente programa. Utiliza la numeración de las
líneas que aparece en el código para ir describiendo el programa. Haz un dibujo que
muestre su funcionamiento.
2º.- ¿Cuántos procesos se crean? ¿Qué parentesco tienen entre ellos? Indica un
orden de finalización de los procesos. ¿Podrías asegurar que el orden de finalización que
has indicado se producirá siempre?. Razona las respuestas.
3º.- Muestra la traza de ejecución de las siguientes llamadas al programa:
Anillo 1 10
Anillo 3 10
Anillo 4 10
¿Qué hace le programa en realidad?
4º .- Modifica el programa para que ninguno de los procesos quede en estado
zombie o huérfano. Cuando finalice un proceso hijo, se debe mostrar su identificador
de proceso y su estado de finalización.
5º .- Supongamos que añadimos nuevo código a la función Realiza_Operacion.
El tiempo de ejecución del nuevo código no es exacto y puede variar entre 3 y 5 seg.
El programa padre necesita obtener una solución antes de 10 seg. para que el
resultado sea válido.
Modifica el programa de tal forma que si no se cumple el plazo de ejecución, el
proceso padre finalice todos los procesos hijos pendientes y de por finalizado el
programa con un mensaje de error que aparezca por la salida de error.
Nota: El proceso padre sólo debe finalizar los procesos hijos que todavía están
activos en el sistema.
4
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
*** anillo.c ***
/*
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
*/
int Realiza_Operacion(int num_1, int num_2);
int main(int argc, char *argv[])
{
pid_t pidaux, pidwait, hijo1, hijo2, hijo3;
int numero, alarma, nuevo_numero, nbytes;
int buf = 0, status = 0, cont_hijos_fin = 0;
int fpipe[3][2];
pipe(fpipe[0]);
pipe(fpipe[1]);
pipe(fpipe[2]);
numero = atoi(argv[1]);
alarma = atoi(argv[2]);
printf("\n Paso 1 del testigo: %d", numero);
printf("\n Tiempo máximo permitido para la ejecución %d seg.\n", alarma);
fflush(stdout);
if ((hijo1 = fork()) == 0)
{
close(fpipe[0][1]);
close(fpipe[1][0]);
close(fpipe[2][0]);
close(fpipe[2][1]);
read(fpipe[0][0], &buf, 4);
nuevo_numero = Realiza_Operacion(numero, buf);
printf("\n Paso 2 del testigo: %d", nuevo_numero); fflush(stdout);
write(fpipe[1][1], &nuevo_numero, 4);
exit(1);
}
if ((hijo2 = fork()) == 0)
{
close(fpipe[0][0]);
close(fpipe[0][1]);
close(fpipe[1][1]);
close(fpipe[2][0]);
read(fpipe[1][0], &buf, 4);
5
10
20
30
40
50
60
70
80
90
100
110
120
130
140
150
160
170
180
190
200
210
220
230
240
250
260
270
280
290
300
nuevo_numero = Realiza_Operacion(numero, buf);
printf("\n Paso 3 del testigo: %d", nuevo_numero); fflush(stdout);
write(fpipe[2][1], &nuevo_numero, 4);
exit(2);
}
if ((hijo3 = fork()) == 0)
{
close(fpipe[0][0]);
close(fpipe[1][0]);
close(fpipe[1][1]);
close(fpipe[2][1]);
read(fpipe[2][0], &buf, 4);
nuevo_numero = Realiza_Operacion(numero, buf);
printf("\n Paso 4 del testigo: %d", nuevo_numero); fflush(stdout);
write(fpipe[0][1], &nuevo_numero, 4);
exit(3);
}
sleep(1); // Todos los procesos hijos deben estar en ejecución.
write(fpipe[0][1], &numero, 4);
close(fpipe[0][1]);
nbytes = read(fpipe[0][0], &buf, 4);
if (nbytes == 4)
printf("\n El resultado de la ejecución del anillo es: %d\n", buf);
else
printf("\n La ejecución del anillo ha sido INCORRECTA. \n");
exit(0);
}
int Realiza_Operacion(int num_1, int num_2)
{
int num_opera;
/* */
// Nuevo código de la función;
/* */
num_opera = num_1 * num_2;
return(num_opera);
}
310
320
330
340
350
360
370
380
390
400
410
420
430
440
450
460
470
480
490
500
510
520
530
6
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Problema 3
Utilización de las llamadas al sistema exit() y wait() en procesos recursivos.
DIMEPAR.C
Dado el siguiente programa en C: DIMEPAR.C; se trata de descomponerlo en
Se escribirá un programa par.c que funcionará de forma equivalente a la función
Se escribirá un programa impar.c que funcionará de forma equivalente a la
tres programas diferentes de manera que el funcionamiento sea equivalente.
Se escribirá un programa dimepar.c que será el programa que realice la llamada
al ejecutable par o al ejecutable impar. Además informará por pantalla si el numero es
par o impar.
par
función impar.
//
//
//
#include <stdio.h>
#include <stdlib.h>
int par(int numpar);
int impar(int numimpar);
int main(int argc, char * argv[])
{
numero = atoi(argv[1]);
result = par(numero);
if (result == 1) printf("\n El numero %d: es PAR", numero);
else printf("\n El numero %d: es IMPAR", numero);
}
int numero, result;
return(0);
int presult;
if(numpar == 0) return (1);
numpar = numpar - 1;
presult = impar(numpar);
return(presult);
int presult;
if(numimpar == 0) return (0);
numimpar = numimpar - 1;
presult = par(numimpar);
return(presult);
int par(int numpar)
{
else
{
}
}
int impar(int numimpar)
{
else
{
}
}
7
8
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Problema 4
halla finalizado el hijo.
halla finalizado el padre.
Comenta brevemente el programa que aparece en la página siguiente.
Modifica el programa de forma que el padre escriba su mensaje después de que
Modifica el programa de forma que el hijo escriba su mensaje después de que
¿Cuándo se genera la señal SIGPIPE?. ¿Qué procesos reciben esta señal?. ¿Cuál
es el comportamiento por defecto de los procesos que reciben esta señal?.
Escribe un programa en el que se pueda observar claramente la generación de
Problema 5
esta señal y su captura.
Problema 6
Utilizando llamadas al sistema UNIX, escribe un programa en C, comentado con
todo detalle, que ejecute la siguiente orden:
sort < old.txt | wc >> new.txt
¿Cuál será el contenido del fichero new.txt después de ejecutar esta orden?
10
#include <sys/types.h>
#include <stdio.h>
void charatatime(char *str);
int main()
{
pid_t pid;
if ((pid = fork()) < 0) perror("fork error");
else if (pid == 0) charatatime("salida del hijo \n");
else charatatime("salida del padre \n");
exit(0);
}
void charatatime(char *str)
{
char *ptr;
int c;
setbuf(stdout, NULL);
ptr = str;
do
{
c = *ptr;
putc(c, stdout);
} while (*ptr++ != '\0');
}
9
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Área de Arquitectura y Tecnología de Computadores
EUPT: Sistemas Operativos II
Objetivo:
Práctica 0: Variables de entorno
conocer las variables de entorno.
0. Fundamentos de UNIX
La siguiente práctica tiene como objetivo repasar los fundamentos de UNIX y
Unix está en vías de contar con una norma común, aunque todavía existen
variaciones de un fabricante a otro, en asuntos como formatos para documentación en
línea, opciones de compilación de programas y localización de bibliotecas
Comentarios de: Sistemas Operativos II - Prácticas (0)
No hay comentarios