ASO EXAMENES RESUELTOS[1]

29
FEBRERO 2005 1.Estado de los procesos. Dibuja el gráfico. Indicando el estado de cada proceso. El/los evento/s que tiene/n que ocurrir para que pase de un estado a otro. Todo sobre el dibujo. Se puede añadir alguno nota. No extenderse.(2 puntos) 1.-Ejecutándose en modo usuario: tiene el control del procesador mientras dura el quanto o no realice una llamada al sistema. 2.-Ejecutándose en modo kernel: Cuando el proceso realiza una llamada a sistema, el proceso cambia de estado y pasa ejecutar

Transcript of ASO EXAMENES RESUELTOS[1]

Page 1: ASO EXAMENES RESUELTOS[1]

FEBRERO 2005

1.Estado de los procesos. Dibuja el gráfico. Indicando el estado de cada proceso. El/los evento/s que tiene/n que ocurrir para que pase de un estado a otro. Todo sobre el dibujo. Se puede añadir alguno nota. No extenderse.(2 puntos)

1.-Ejecutándose en modo usuario: tiene el control del procesador mientras dura el quanto o no realice una llamada al sistema.

2.-Ejecutándose en modo kernel: Cuando el proceso realiza una llamada a sistema, el proceso cambia de estado y pasa ejecutar código de área de kernel. Cuando termina:Termina la tarea interrupción (iret) vuelve a la siguiente instrucción que la llamó.Si termina el quanto se hace un cambio de contexto, pasando el siguiente proceso a modo usuarioSi carece de algún recurso->Estado dormidoSi termina con exit->Estado zombi

Page 2: ASO EXAMENES RESUELTOS[1]

3.-Planificado en memoria: tiene reservado los recursos de sistema que necesita. El proceso no se esta ejecutando, esta en cola de "listo para ejecutarse" esperando a que el planificador de tareas(scheluder) se lo permita.

4.-Dormido en memoria: El proceso esta durmiendo cargado en memoria, ya que esta esperando que se complete una operación (E/S,tiempo de espera(timer)(ejm:sleep 10),espera de recibir un evento o mensaje)Nota: No puede haber un proceso, ejecutándose en modo usuario y kernel a la vez.

5.-Planificado en swap: Esta en memoria secundaria,listo para ejecutarse, pero el intercambiador (proceso 0 ó swapper) debe cargar el proceso en memoria antes de que el planificador(scheluder) pueda ordenar que pase a ejecutarse.

6.-Dormido en swap: El proceso esta durmiendo y el intercambiador ha descargado el proceso hacia una memoria secundaria para dejar espacio en la memoria principal donde poder cargar otros procesos.

7.-El proceso esta volviendo del modo superusuario al modo usuario, pero el planificador se apropia del proceso y hace un cambio de contexto, pasando otro proceso a ejecutarse en modo usuario.

8.-El proceso acaba de ser creado(con fork) y está en un estado de transición; el proceso existe, pero ni está preparado para ejecutarse, ni durmiendo. Este estado es el inicial para todos los procesos, excepto el proceso 0.

9.-El proceso ejecuta la llamada exit y pasa al estado zombi. El proceso libera todos los recursos pero mantiene la entrada en la Tabla de Procesos. No termina de morir, esperando la notificación por parte del padre, de que ha recogido el registro que contiene el código de salida y su estado. Es un estado temporal. En caso de que el proceso padre muera antes de que finalice el hijo, será el proceso init quién asuma su paternidad.

2.Espera por bloqueo. Semáforos (2 puntos)a)Compara con la espera activa. Caso de uso de la espera activa y uso de la espera por bloqueo.

Espera activa: Malgasta tiempo del procesador. Se usa cuando la espera por la sección crítica es corta.Ejm: Un consumidor-productor en un buffer.

Espera por bloqueo: Se implementa para exclusión mutua a largo plazo. Ejm:Acceso a disco. Es un mecanismo que pone en estado bloqueado al proceso que la espera por un evento y desbloquea cuando se produce el evento por el que espera.

b)¿Que es? Operaciones que se pueden realizar y tipos.

Un semáforo es una variable protegida cuyo valor puede ser accesado y alterado tan sólo por las operaciones wait, signal y una operación de inicialización del semáforo initial. Los semáforos binarios (mutex) sólo pueden tomar los valores 0 y 1. Los semáforos contadores pueden tomar valores enteros no negativos.

Page 3: ASO EXAMENES RESUELTOS[1]

c)Funcionamiento interno

En semáforos la sincronización entre procesos se realiza utilizando las siguientes rutinas:

Semáforo: si el semáforo es "s"initial(s,1)wait (s)S.Csignal(s)wait,signal,initial son indivisibles

La operación wait en el semáforo S, escrito wait(S), opera de la siguiente manera:

if (S > 0) { S=S - 1}else (espera en S)

La operación signal en el semáforo S, escrito signal(S), opera de la siguiente manera:

if (uno o más procesos están en espera en S){ (deja proseguir a uno de estos procesos)}

else S:=S+1

La operación initial en el semáforo S, escrito initial(S,5), opera de la siguiente manera:

S=5

d) Ejemplo

program sem01;

var nolineas: integer; mutex: semaphore; (* declaración del semáforo *)begin

nolineas := 0; initial(mutex,1); (* se inicializa el semáforo *)

cobeginuno; dos;

coend;writeln('Total de Líneas = ',nolineas)

end.------------------------------------------------------------------------------------------------------------------------process dos; El process uno es idéntico

var lin: integer;begin

for lin := 1 to 20 do begin wait(mutex); (* Espera por el semáforo *) nolineas := nolineas + 1; (* sección crítica *) signal(mutex); (* libera el semáforo *) end

Page 4: ASO EXAMENES RESUELTOS[1]

end; (* dos *)

3.La estructura de Sistema de Ficheros Unix. Contenido y funcionamiento de cada elemento.(2 puntos)

Bloque boot/MBR: Zona de arranque. No es realmente parte del sistema de ficheros. Ocupa el primer sector del primer disco y tiene el programa de arranque que se encarga de buscar el sistema operativo y cargarlo en memoria para inicializarlo.

Superbloque: Contiene información de un sistema de ficheros como su tamaño, total de ficheros que puede contener, espacio que queda libre, índice del siguiente i-nodo libre, índice del siguiente bloque libre, ...

Lista de i-nodos: Tiene una entrada por cada fichero(o directorio) donde se guarda: propietario, accesos, entradas de direcciones de los bloques, número de enlaces ...

Bloque de datos: Se situa el resto de sistema de ficheros. Esta el contenido de los ficheros a los que hace referencia la lista de i-nodos.

Swap: No es parte del sistema de ficheros. Es la zona reservada para la memoria virtual.

Ficheros especiales:

procfs: El kernel el que crea este supuesto directorio. Se guarda información de los procesos, e información del sistema. Muchas aplicaciones utilizan esta información. Se monta en /proc y es un sistema de ficheros virtual que no ocupa espacio físico.

sysfs: Exporta datos de estructuras internas del kernel (introducido con la versión 2.6) en forma de ficheros. Puede sustituir a procfs en cuanto a información relativa a dispositivos y otros datos manejados por el kernel, pero la relacionada con los procesos sólo sigue en procfs.

tmpfs: Sirve para almacenar archivos y directorios (sin journaling) y en memoria. Se usa en /tmp, el fichero de directorio temporales.

bloqueboot/MBR

bloque ... datoslista ... i-nodossuperbloque

superbloque lista ... i-nodos bloque ... datos

Primer disco o partición

Otros discos/particiones

Swap Sist. Ficheros Especiales:procfs,sysfs,tmpfs,devfs

sistema de ficheros virtualpartición

Page 5: ASO EXAMENES RESUELTOS[1]

devfs: Sistema de ficheros virtual que muestra todos los dispositivos registrados al registrar los controladores.

4.Crea un script de inicio de un servicio

a) Crea tu propio script para arrancar/parar un servicio. El script se llamará “atd”. Si a este script de inicio le paso como parámetro “start” ejecutará la aplicación “/usr/sbin/atd” en modo background, en caso de introducir “stop” parará dicho proceso utilizando el comando “killproc /usr/sbin/atd” y en caso de introducir restart parará y arrancará dicho servicio. En caso de que el usuario introduzca un número de parametros incorrecto o distinto de start , stop o restart mostrar un mensaje de uso y salir devolviendo el valor 1, en caso de que todo vaya correcto devolver un 0. Además se incluirá al sistema Sys V, para que se arranque en el nivel de ejecución gráfico, en el orden 95 de arrancada y 5 en parada en los niveles 3,4 y 5. [1 punto]

gedit atd

echo “start: Ejecutar aplicacion atd”echo “stop: Detener aplicacion atd”echo ”restart: Parar y ejecutar aplicacion atd”read opcioncase $opcion in

start) start /usr/sbin/atd &;;stop) killproc /usr/sbin/atd;;restart) killproc /usr/sbin/atd

start /usr/sbin/atd;;

*) echo “El comando introducido no existe!”Exit(1);;

EsacExit(0);;

sudo chmod u+x atd

b) Muestra los pasos a realizar para incluir dicho script al sistema Sys V. Partiendo de que el script atd lo habeís creado en vuestro /home/alum300/lana y como alum300. [0.5]

sudo update-rc.d /home/alum300/lana/atd start 95 2 . stop 5 3 4 5

c) Muestra los pasos para que la siguiente vez que arranquemos el sistema en cualquiera de los niveles 3,4 y 5 se arranque dicho servicio, usando el método automático y manual. [0.25]

automatico -> sudo update-rc.d /home/alum300/lana/atd start 95 3 4 5 manual -> ln -s /home/alum300/lana/atd /etc/rc3.d/S95atd

mv /etc/rc3.d/K5atd /etc/rc3.d/S95atd y lo mismo para los otros dos niveles

d) Para y arranca el servicio sin tener que reiniciar el ordenador.[0.25]

sudo invoke-rc.d atd stopsudo invoke-rc.d atd start

Page 6: ASO EXAMENES RESUELTOS[1]

FEBRERO 2006

1.-[2 puntos] (Estimado 20 min) Realizar el siguiente script

Me acabo de bajar con el amule los siguientes ficheros Baby.Einstein.Mozart.tar.gz y Baby.Einstein.Bach.tar.bz2. Una vez descomprimidos y desempaquetados me he dado cuenta de que los ficheros que contiene nombres de la siguiente forma:

En la carpeta de Bach:01 - Minuet in G from the Anna Magdalena Notebooks.mp3 02 - Flute Sonata in Eb, 3rd movement, BWV 1031.mp3 ...17 - Brandenburg Concero No. 2, 3rd movement, BWV 1047.mp3Baby Bach portada 2.JPGBaby Bach portada.JPGBaby Bach trasera.JPG

En la carpeta de Mozart:01 - Tune Up And Fanfare.mp3 02 - Piano Sonata In C.mp3 ...15 - Symphony No.41 In C.mp3Baby Mozart delantera 2.jpgBaby Mozart delantera.jpgBaby Mozart trasera.jpg

A la hora de ir a grabar todas las canciones en un CD con el k3b, me he encontrado con el siguiente inconveniente:

01 - Minuet in G from the Anna Magdalena Notebooks.mp3 01 - Tune Up And Fanfare.mp3 ...Las canciones aparecen entremezcladas entre los diferentes autores y yo quiero que primero suene las canciones de Mozart y luego las de Bach.Se pide:a) Descomprimir y desempaquetar (0.5)

b) Realizar un script que renombre los nombres de los archivos.mp3. A este script se le pasarán como argumento el path de la carpeta donde estan los mp3 y una cadena con la que queremos concatenar al principio del nombre de los mp3.

Nota: Para evitar problemas con los blancos que existen entre los nombres, intercambiaremos el caracter blanco por el caracter “-”.Se recomienda utilizar el comando tr:

Page 7: ASO EXAMENES RESUELTOS[1]

Solución1:

#$1 carpeta donde estan los ficheros#$2 string para concatenar por delantecd $1for a in `ls -1 *.mp3| tr " " "@"`do

b=`echo $a |tr "@" "\ "`c=$2-`echo $a|tr "@" "-"`mv "$b" $c

done

Solución 2:

for i in *.mp3; do

mv "$i" `echo $2$i | tr ' ' '-'`; done

2.-Explica los siguientes trozos de código: (1 punto)

a)trap 'echo inactivo;exit' 2 3 5while true

do echo 'activo' done

kill -2 nºPID'

En caso de que se le envíe las señales 2, 3 ó 5 saca un mensaje de inactivo y sale del proceso. También con la señal de SIGKILL y SIGTERM terminaría ya que estas señales están preparadas para que cualquier proceso que no las trate, las escuche y finalice el proceso inmediatamente o esperando un tiempo a que termine de forma natural.

b) Ejecuta el siguiente programa, y muestra las posibles salidas que podría mostrar y explica él por qué de cada una de ellas.(1 punto)

#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>int main(int argc,char * argv[]){int rc=0,estado=0,ret=0;if (argc!=1) { printf("uso: %s\n",argv[0]); rc=1;

Page 8: ASO EXAMENES RESUELTOS[1]

}else { ret=fork(); if (ret==-1) {printf("Error");rc=-1;} else if (ret){ printf("x yo soy %8d \n ",getpid() ); printf("x mi padre es: %8d\n", getppid()); } else {sleep(10); /* 10 sg */

printf("z yo soy %8d \n ",getpid() ); printf("z mi padre es: %8d\n", getppid()); } }exit(rc);}

chmod u + x pruebac.exe ejecuta el programa[kepalocalhost ~]$ ./pruebac.exe se ejecuta el padre ya que el hijo tiene un sleep de 10 sg x yo soy 4127 x mi padre es: 2560 termina de ejecutarse el padre, y como no tiene wait, no le

espera al hijo, que este último zombi[kepalocalhost ~]$ z yo soy 4128 cuando el proceso hijo despierte mostrará su mensajes en la

terminal, y se ve como el proceso init coge su paternidad. z mi padre es: 1

3.[1 punto](15 minutos)¿Que contiene el fichero inittab?¿cuando y que proceso lo ejecuta?

Inittab describe que procesos se inician al cargar el sistema. Inittab es llamado por init justo después de la carga del kernel.

/etc/inittab -> id:5:initdefault:Ejecuta el script /etc/rc.d/rc.sysinit:

- Se comprueban y montan los sistemas de ficheros- Se ajusta el reloj según la CMOS- Se habilita el intercambio de espacios- Se ajusta el nombre del host- Se establece la ruta a otros programa

mount -a está en el archivo /etc/rc.d/rc.sysinit, que se ejecuta al inicializarse el sistema que opera según el contenido.

Page 9: ASO EXAMENES RESUELTOS[1]

/etc/fstab donde se indican las siguientes opciones de montaje: #sistema de archivo:punto de montaje:tipo del sistema de #archivos:opciones:volcado:orden de chequeo

En función del nivel de ejecución especificado se ejecutan los ficheros /etc/rc

FEBRERO 2007

1.- [1 punto] Responde a las siguientes preguntas.

a)¿Qué debes hacer para que tu “/home/alum300/bin/miscript” se ejecute sin incluir el camino absoluto en todas las terminales de esa sesión?

cp /home/alum300/bin/miscript /usr/local/bin/

b)Queremos que el PATH tenga efecto cada vez que arranquemos la máquina. Y sólo para el usuario alum300. ¿qué debemos hacer?

Para que sea accesible solo para alum300 debe ponerlo en su ~/.bash_profile

c)Queremos que el PATH tenga efecto cada vez que arranquemos la máquina. Para todos los usuarios. ¿qué debemos hacer?.

Para que sea para todos los usuarios debe estar en /etc/profile

d)¿Qué diferencia hay entre ejecutar “prog.sh” ó “source prog.sh”?

Para ejecutar prog.sh sería necesario insertar el PATH completo de la ubicación del programa mientras que con source prog.sh no haría falta

2.-[1 punto]Tengo una serie de ficheros en un directorio con la misma extensión(01.xxx, 02.xxx, ...) y quiero renombrarlos a (01.yyy, 02.yyy, ...).Es por ello que he decidido hacer un script. Al script que se llamará “renombrar” le pasaré 3 argumentos:a)criterio de búsqueda dentro de la carpeta actual. Ejm:*.xxx(todos los ficheros cuya extensión es xxx)b)expresión a sustituir. Ejm:xxxc)expresión a reemplazar. Ejm:yyy Se recomienda utilizar el comando tr:man trtr - `tr' copies standard input to standard output, performing a translate characters replaces SET1 with SET2SYNOPSIS tr SET1 SET2Ejm: tr "- " "@" (Sustituye el carácter “-” de la cadena que le pasamos por la entrada estándar por “@” mostrando el resultado por la salida entandar) Ejemplo de llamada: renombrar *.xxx xxx yyy

for n in `grep $1` //for para todos lo ficheros acabados en “*.xxx” y lo deja en la variable n

Page 10: ASO EXAMENES RESUELTOS[1]

docp $n `echo $n | tr -c '[$2]' $3` //se hace una copia del archivo cambiando la expresiónrm –f $n

done

3.-[2 puntos]

3A) Explica lo que hacen los siguientes programas (1 punto)

vi prog1.c#include <sys/types.h>#include <signal.h>#include <unistd.h>

int main(int argc, char *argv[]){ pid_t pid; int sig;

if(argc==3) { pid=(pid_t)atoi(argv[1]); sig=atoi(argv[2]); kill(pid, sig); } else { printf("%s: %s pid signal\n", argv[0], argv[0]); return -1; }

return 0;}

El tipo pid_t es un tipo heredado de UNIX, que en Linux en concreto corresponde con un entero. El anterior código de ejemplo realiza la misma función que el comando “kill” cuyo cometido es mandar señales a los procesos en Linux.

He compilado el programa:gcc prog1.c -o prog1

vi prog2.sh#!/bin/shecho "Capturando signals..."trap "echo SIGHUP recibida" 1trap "echo SIGINT recibida " 2trap "echo SIGQUIT recibida " 3trap "echo SIGFPE recibida " 8trap "echo SIGALARM recibida " 14trap "echo SIGTERM recibida " 15while truedo

Page 11: ASO EXAMENES RESUELTOS[1]

done

Simplemente saca un mensaje por pantalla cuando recibe la señal en concreto y permanece en un bucle infinito sin hacer nada.

3B) ¿Qué ocurrirá si ejecuto las siguientes instrucciones?(Nota:la señal 15 es SIGTERM ,la señal 30 es SIGUSR1, la señal 9 es SIGKILL)(1 punto)1)$./prog2.sh &[1]2222$./prog12)$./prog2.sh &[1]2222$./prog1 2222 15 3)$./prog2.sh &[1]2222$./prog1 2222 30 4)./prog2.sh &[1]2222./prog1 2222 9

4.-[2 puntos] Define de los siguientes términos y añade un ejemplo para los que puedas: X-Window, X-org, gestor de vistas, escritorio, gestor de ventanas.

X-Window (X11): Responsable de virtualmente todas las operaciones gráficas básicas. En particular, de dibujar los iconos, los fondos, y las ventanas en las que se ejecutan las aplicaciones.

X-org: Implementación del estándar X11 que posibilita la ejecución de interfaces gráficos de usuario.

Gestor de vistas: Genera la interfaz gráfica inicial (conexión, desconexión, usuario, clave, ...) que dará paso al Escritorio. Puede ser: xdm, gdm y kdm

Escritorio: Conjunto formado por un gestor gráfico de ficheros, un panel para lanzar las aplicaciones y un conjunto de aplicaciones y utilidades.

Gestor de ventanas: Se encarga de poner bordes y botones alrededor de las ventanas, lo que permite al usuario moverlas, cerrarlas, ocultarlas o cambiar su tamaño.

Pregunta del Trabajo opcional:(1 punto)6.-[1 punto](10 minutos). Pasos para crear un DSL Linux en tu PenDrive.

Esto será de otro año porque no hemos visto nada de DSL Linux

Page 12: ASO EXAMENES RESUELTOS[1]

FEBRERO 2008

1.- [1 punto] Explica cuando se ejecutan los siguientes ficheros,un ejemplo de uso, a cuantos usuarios afecta:/etc/profile, $HOME/.bash_profile, $HOME/.bashrc, $HOME/.bash_logout

/etc/profile- Al inicio de sesión- Para todos los usuarios- Exportar una variable o aplicar una máscara a todos los usuarios por igual. Ejm: umask 0002

$HOME/.bash_profile- Al inicio de sesión- Para el usuario en concreto- Exportar una variable o aplicar una máscara a el usuario. Ejm: umask 0002

$HOME/.bashrc- Al inicio de sesión, si lo ejecuta .bash_profile y sino cada vez que se abre un bash interactivo de no conexión.- Para el usuario en concreto- Alias ó exportar variables

$HOME/.bash_logout- Al salir de la sesión- Para el usuario en concreto- Copia de seguridad, despedida, ...

2.-[1 punto] Sabemos que el formato y contenido del fichero /etc/group es:

#group_name:passwd:GID:user_listcdrom:x:24:haldaemon,kepa,tristanfloppy:x:25:haldaemon,kepa,tristantape:x:26:tristansudo:x:27:audio:x:29:kepa,tristandip:x:30:kepa,tristankepa:x:1000:kepaadmin:x:80:kepa....

Realiza un script que se llamará “gruposde” que muestre únicamente los distintos grupos a los que pertenece un usuario en concreto.

Page 13: ASO EXAMENES RESUELTOS[1]

Ejemplo de uso:$./gruposde kepaLos grupos de kepa son:cdromfloppyaudiodipkepaadmin$./gruposde tristan

Los grupos de tristan son:cdromfloppytapeaudiodip

Por ejemplo para mostrar el contenido del cuarto campo, cuando los campos están separados por “:” sería: cut -f4 -d":"

Solución 1

vi gruposdeecho “Los grupos de $1 son:\n”less /etc/group|grep $1|cut -d: -f1

Solución 2

vi gruposdeecho "Los grupos de $1 son:"

for linea in `cat /etc/group|grep $1` do grupo=`echo $linea | cut -f1 -d":"` echo "$grupo" done

exit 0

Programa en C.(2 puntos)

Dado un programa principal que ejecuta 2 procesos concurrentes (P1 y P2) que comparten la sección crítica. Si las variables c1 y c2 se inicializan a 1. Se pide: Indicar si se cumplen los 3 requisitos necesarios junto con el interbloqueo, para resolver el problema de la sección crítica utilizando variables compartidas.

Nota: Se debe indicar en qué consiste cada uno de los requisitos, si cumple o no y el por qué de la respuesta.

P1 ejecuta:while (TRUE){while (c1==0) NOP;

Page 14: ASO EXAMENES RESUELTOS[1]

c2=0;critical_section();c2=1;}P2 ejecuta:while (TRUE){while (c2==0) NOP;c1=0;critical_section();c1=1;}

REQUISITO CUMPLE? POR QUÉ?

Exclusión mutuaNo

Hay peligro que otro proceso coja el control, cambio de contexto, y entren más de dos procesos en la sección crítica.

ProgresoSí

Si el segundo proceso no quiere entrar no afecta en el primero ya que al salir ha puesto su variable a 1, no afectando a la entrada del primero. Ya que cada uno usa variable independientes.

Espera Acotada

No

Puede ocurrir que uno de los procesos tenga un aplazamiento indefinido debido a que siempre P1 podría estar siempre cogiendo la sección crítica en caso de que cambio de contexto se haga cuando el primero haya marcado a 1 su variable para entrar en la sección crítica.

Interbloqueo Sí Como preguntan y luego marcan no habrá interbloqueo.

Teoría

Exclusión mutua: Si un proceso está ejecutando código de la sección crítica, ningún otro proceso lo podrá hacer.

Progreso: Si ningún proceso está ejecutando dentro de la sección crítica, la decisión de qué proceso entra en la sección se hará sobre los procesos que desean entrar. Los procesos que no quieren entrar no pueden formar parte de esta decisión. Además esta decisión se debe tomar en tiempo finito.

Espera Acotada: Que ningún proceso tenga que esperar un intervalo de tiempo arbitrariamente grande para entrar en su sección crítica.

Interbloqueo puede darse cuando varios procesos compiten por recursos, pero ninguno de ellos puede proseguir ya que que los recursos que necesitaría para ello los tiene otros procesos que a su vez están retenidos.

Page 15: ASO EXAMENES RESUELTOS[1]

JUNIO 2006

1.-[2 puntos] (Estimado 20 min) Realizar el siguiente script: Realizar un script que se llama linuxunzip que pasándole como parámetro el nombre del archivo a descomprimir lo desempaqueta en la carpeta actual. El script utilizará opciones del tar en función del final del nombre del archivo (nombre.tar.bz2 o nombre.tar)Comprobar que:

-Sólo se introduce un parámetro.-El fichero que se le pasa como parámetro ya existe.

a)Crea el script.b)¿Qué pasos debes realizar para ejecutarlo?.Añade un ejemplo.Nota: Para resolver el problema utiliza el comando cut. (Se adjunta la ayuda de cut).

gedit linuxunzip

if ($# -eq 1) thenif test -e $1 then

tar -czvf $1else

echo “El fichero no existe”fiecho “Se debe introducir un solo parametro”

fi

chmod u+x linuxunzip

2.-Explica:[2puntos]a) Incluye en el sistema SysV el script sshd de forma manual, suponiendo que:(0.5)-el script ya está en su sitio /etc/init.d/sshd-el orden de arranque es:55-el orden de parada es:25-para los niveles de arranque 5

ln -s /etc/init.d/sshd /etc/rc5.d/S55ssh mv /etc/rc5.d/K25sshd /etc/rc5.d/S55sshd

b) Arranca el servicio de forma manual ó automática(0.5)

sudo /etc/init.d/sshd startósudo invoke-rc.d sshd start

c) Ejecuta mentalmente el siguiente programa, y contesta a las siguientes preguntas.(1 punto)#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>

Page 16: ASO EXAMENES RESUELTOS[1]

int main(int argc,char **argv){int rc=0,estado;if (argc!=1) {

printf("uso: %s\n",argv[0]); rc=1;

}else {

ret=fork();if (ret==-1){

printf(“Error”);rc=-1;

}else {

if (ret==0){ //este es el proceso hijoprint(“x yo soy %8d \n”,getpid());wait(&estado);printf("x mi padre es: %d8 \n”,getppid());}else { //este es el proceso padreprintf("z yo soy %8d \n”,getpid());printf(“z mi padre es: %8d\n”,getppid());}

} }exit(rc);}1) Explica qué ocurre cuando se llama al fork

Es la única forma de crear un proceso en el sistema UNIX. El proceso que invoca se le llama proceso padre y el proceso creado es el hijo.

Se crea un proceso exactamente igual al padre, salgo que la llamada del fork devuelve un 0 al hijo y el pid del hijo al padre (en caso de error devuelve -1).

2) Muestra todas las posibles salidas, explica el por qué de cada una de ellas.

Si el fork devuelve un -1 (guardado en la variable ret) se muestra un mensaje de error porque no ha podido crearse y se acaba el programa devolviendo un -1.

Si ret es diferente de -1, entrará en el else y ahí se dividirá en la parte del hijo y del padre. Aquí las salidas dependerán de cómo la máquina reparta el tiempo de ejecución, pero una vez que el proceso hijo lleva a cabo la primera instrucción, se quedará en wait, mientras tanto el padre ejecutará el código completo y saldrá dejando en estado zombi al hijo.

Las salidas no son previsibles y podría escribir antes el PID del padre o del hijo.

3) ¿Se puede quedar el hijo zombi?si/no.¿Por qué?

Sí, porque el wait lo tiene el hijo cuando lo debería tener el padre. De esta manera cuando el padre termine su ejecución saldrá sin esperar a que termine el hijo y éste quedará zombi.

Page 17: ASO EXAMENES RESUELTOS[1]

JUNIO 2007

1.- [2 puntos] Crear un script que pasándole el nº de curso, el nº de alumnos por curso y el password común para todos ellos, cree cuentas para cada alumno. Con el siguiente formato: Si nº de curso es: 3 el grupo al que pertenecerán será curso3 y los alumnos serán alum3[01-50].Utilizar los comandos groupadd, useradd y passwd. Controlar el número de parámetros a pasar.Nota:man groupaddNAME groupadd - Create a new groupSYNOPSIS groupadd group_nameDESCRIPTION The groupadd command creates a new group account using the values specified on the command line and the default values from the system. The new group will be entered into the system files as needed.

man useraddNAME useradd - Create a new user or update default new user informationSYNOPSIS useradd [options] LOGINOPTIONS The options which apply to the useradd command are: -g, --gid GROUP The group name or number of the user’s initial login group. The group name must exist. A group number must refer to an already existing group. The default group number is 1 or whatever is specified in /etc/default/useradd.....

man passwdNAME passwd - update a user’s authentication tokens(s)

SYNOPSIS passwd [-k] [-l] [-u [-f]] [-d] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

DESCRIPTION Passwd is used to update a user’s authentication token(s).OPTIONS --stdin This option is used to indicate that passwd should read the new password from standard input, which can be a pipe. ....

Page 18: ASO EXAMENES RESUELTOS[1]

group add curso$1cont=1while test $cont –le $2do

if test $cont –le 9then

useradd –g curso$1 alum$10$cont./autopasswd alum$10$cont ‘echo $3’

elseuseradd –g curso$1 alum$1$cont./autopasswd alum$1$cont ‘echo $3’

fidone

SEPTIEMBRE 2005

1. Inicio de Linux. Booting. Servicios. Contesta a las siguientes preguntas.[2 puntos]

a) ¿Que es un servicio?

Es una función específica que realiza la máquina, tanto para sí misma (syslog), como para otras (apache2).

b) ¿Que es un demonio?

Es un programa que se ejecuta en una máquina Linux, que no contiene acceso a consola y que realiza tareas del sistema.

c) Familia de servicios Sys V. Explica en que consiste standalone y xinetd.

Xinetd: El superservidor de internet (xinetd) escucha todos los puertos de los servicios que administra y cada vez que llega una petición de un cliente, arranca el servicio correspondiente.

Standalone: El daemon ftp abre el puerto 21 espera conexiones entrantes desde que se arranca el servidor. Si llega una petición crea un proceso hijo que acepta la conexión, mientra que el padre sigue escuchando dicho puerto.

d) Diferencias entre standalone y xinetd.

Page 19: ASO EXAMENES RESUELTOS[1]

Xinetd: Sólo carga en memoria el servicio cuando llega la petición del cliente, por lo que consume menos recursos (menos memoria) pero el tiempo de respuesta es mayor.

Standalone: Servicio que está cargado desde que se arranca la máquina, por lo que atiende más rápido las peticiones del cliente.

2.Gestión de Procesos: Planificador de Procesos: Unix, tradicional. Algoritmo Round-Robin Multinivel con Prioridades dinámicas [2 puntos]

El planificador se encarga de decidir a quién dará parte (slice o quanto) del tiempo. En unix se utiliza este algoritmo. Diferentes colas FIFO, cada una para procesos de la misma prioridad. La prioridad

tiene un componente estático y otro dinámico. Funcionamiento:

Por cada segundo de tiempo se recalculan las prioridades y se reajustan las colas. Se coge el proceso más antiguo de la cola de mayor prioridad. Sólo si la cola de mayor prioridad es´ta vacía pasamos a la siguiente.

Ventaja: es justo Desventaja: El tiempo recalculando las prioridades dinámicas

4. ¿Qué diferencia hay entre ejecutar el script “alumno.sh” de las siguientes maneras? [1 punto]a)exec alumno.sh Se ejecuta en el mismo proceso que le llama, es decir, no se llama a fork para que lo ejecute.b).alumno.shSe ejecuta en el intérprete de comandos primario.c)source alumno.sh

d)./alumno.sh

e)alumno.shSe ejecutará en un intérprete secundario y no se modifica el primario.f)bash alumno.shHace lo contrario a exec, invoca al bash como interprete secundario y el primario se queda como está.

5.¿Cuando se ejecutan los siguientes scripts?¿A qué usuarios afecta?¿Para que se utilizan?[1 punto]a)/etc/profileb)$HOME/.bash_profilec)$HOME/.bashrcd)$HOME/.bash_logout

a: Se ejecuta siempre que enciendas la máquina y afecta a todos los usuarios (se lee cuando se ejecuta un intérprete interactivo de conexión). Aquí se en-cuentran las variables de entorno del sistema y programas de inicio y las po-dría cambiar el usuario

b: Sólo se ejecuta en el inicio de sesión para el usuario que la ha iniciado (se lee cuando se ejecuta un intérprete interactivo de conexión). Las variables de entorno personales y

Page 20: ASO EXAMENES RESUELTOS[1]

programas de inicio deberían estar aquí, se podrían modificar igual que en /etc/profile

c: Cada vez que abrimos el interprete de comandos bash se abre, exceptuando el inicio de sesión y afecta al usuario que lo abre (se lee cuando se ejecuta un intérprete interactivo de NO conexión). Los alias personales y funciones deberían estar aquí, también se puede cambiar a gusto del usuario

d: Se ejecuta cuando salimos de la sesión, se puede utiliza para dar mensajes de despedida o para ejecutar lo que queramos al salir

6.-Ejecuta el siguiente programa, y muestra las posibles salidas que podría mostrar y explica él por qué de cada una de ellas.[2 puntos]#include <stdio.h>int main(argc,argv)int argc;char * argv[];{int rc=0,estado=0;if (argc!=1)

{printf("uso: %s\n",argv[0]);rc=1;}else if (fork()) {

printf("PADRE pid=%8d ppid=%8d id-grupo=%8d ur=%8d ue=%8d\n", getpid(), getppid(), getpgrp(), getuid(), geteuid());printf("El código de retorno del hijo es: %d\n", estado);}else

printf("HIJO pid=%8d ppid=%8d id-grupo=%8d ur=%8d ue=%8d \n", getpid(), getppid(),getpgrp(), getuid(),geteuid());exit(rc);}

SEPTIEMBRE 2008

1.-[2 puntos] Realiza un script que concatena todos los ficheros que se le pasan como parámetros, excepto el primer parámetro que será el nombre del archivo que contendrá la concatenación del resto. Ten en cuenta las siguientes circunstancias: Ejm: script.sh resultado concatena1 concatena2 ...a) El número de parámetros es 3 ó másb) Que los archivos que se quieren concatenar existen. En caso contrario muestras un error y sales inmediatamente.

Page 21: ASO EXAMENES RESUELTOS[1]

if test $# -le 2 //mira que el num de parametros no sea menos que 2then exit(-1)

else for n=$ (seq 2 $#) // un for desde 2 hasta el numero de parametros totalesdoif test –e $n //si el fichero existe, lo concatenamos al final del fichero “resultado”

then cat $n >> $1else

then exit(-2)fidone

exit(0)fi

//no estoy seguro de que funcione, pero es lo mejor que se me ocurre

2.-[2 puntos] Dado el siguiente programa de C que se llama “prog.c”.#include <signal.h>#include <unistd.h>void trapper(int);int main(int argc, char *argv[]){

printf("Identificativo del proceso: %d\n", getpid() );signal(19, trapper); /*SIGSTOP*/signal(9, trapper); /*SIGKILL*/signal(12, trapper); /*SIGUSR2*/

for(;;){pause(); }return 0;

}void trapper(int sig){

printf("Recibida la señal: %d\n", sig);}Compilamos:$ gcc prog.c -o progEjecutamos:$ ./prog &Identificativo de proceso: 15801

A) Explica brevemente qué realiza el programa.

Imprime el PID y luego se queda en un bucle infinito esperando la entrada de una señal. Una vez que recibe una de las esperadas señales la trata como se dice en la función “trapper”, el problema es que las señales 9 y 19 (kill y stop) no se pueden capturar ni ignorar por el programa

B) ¿Qué ocurre en cada uno de los casos siguientes?

a)kill -SIGKILL 15801Debería escribir por pantalla que señal ha recibido, pero al ser SIGKILL se terminará el

proceso ya que no se puede tratar esa señalb)kill -SIGSTOP 15801

Page 22: ASO EXAMENES RESUELTOS[1]

Debería escribir por pantalla que señal ha recibido, pero al ser SIGSTOP se parará el proceso ya que no se puede tratar esa señalc)kill -SIGUSR1 15801

No se trata esta señal en el programad)kill -SIGUSR2 15801

Escribe por pantalla “Recibida la señal 12”

C) ¿Qué ocurre si otro usuario manda la señal kill -SIGKILL 15801?

No me suena de haber visto esto en clase y no se que pasaría, pero supongo que se cierra el programa