PDF de programación - Sistemas Operativos II - Prácticas

Imágen de pdf Sistemas Operativos II - Prácticas

Sistemas Operativos II - Prácticasgráfica de visualizaciones

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
  • Links de descarga
http://lwp-l.com/pdf14407

Comentarios de: Sistemas Operativos II - Prácticas (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad