Sie sind auf Seite 1von 22

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 usuario
Si carece de algún recurso->Estado dormido
Si termina con exit->Estado zombi
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.

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.C
signal(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 *)
cobegin
uno; 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

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

Primer disco o partición

bloque
superbloque lista ... i-nodos bloque ... datos
boot/MBR

Otros discos/particiones

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

partición sistema de ficheros virtual


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

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.

 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 opcion
case $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);;
Esac
Exit(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 stop


sudo invoke-rc.d atd start
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.mp3
Baby Bach portada 2.JPG
Baby Bach portada.JPG
Baby 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.mp3
Baby Mozart delantera 2.jpg
Baby Mozart delantera.jpg
Baby 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:
Solución1:

#$1 carpeta donde estan los ficheros


#$2 string para concatenar por delante
cd $1
for 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 5


while 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;
}
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.
/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:xxx
c)expresión a reemplazar. Ejm:yyy
Se recomienda utilizar el comando tr:
man tr
tr - `tr' copies standard input to standard output, performing a translate characters replaces
SET1 with SET2
SYNOPSIS
tr SET1 SET2
Ejm: 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
do
cp $n `echo $n | tr -c '[$2]' $3` //se hace una copia del archivo cambiando la expresión
rm –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/sh
echo "Capturando signals..."
trap "echo SIGHUP recibida" 1
trap "echo SIGINT recibida " 2
trap "echo SIGQUIT recibida " 3
trap "echo SIGFPE recibida " 8
trap "echo SIGALARM recibida " 14
trap "echo SIGTERM recibida " 15
while true
do
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
$./prog1
2)
$./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
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_list
cdrom:x:24:haldaemon,kepa,tristan
floppy:x:25:haldaemon,kepa,tristan
tape:x:26:tristan
sudo:x:27:
audio:x:29:kepa,tristan
dip:x:30:kepa,tristan
kepa:x:1000:kepa
admin:x:80:kepa
....

Realiza un script que se llamará “gruposde” que muestre únicamente los distintos
grupos a los que pertenece un usuario en concreto.
Ejemplo de uso:
$./gruposde kepa
Los grupos de kepa son:
cdrom
floppy
audio
dip
kepa
admin
$./gruposde tristan

Los grupos de tristan son:


cdrom
floppy
tape
audio
dip

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 gruposde
echo “Los grupos de $1 son:\n”
less /etc/group|grep $1|cut -d: -f1

Solución 2

vi gruposde
echo "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;
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 mutua Hay peligro que otro proceso coja el control, cambio de
No
contexto, y entren más de dos procesos en la sección crítica.
Progreso Si el segundo proceso no quiere entrar no afecta en el primero
Sí 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 Puede ocurrir que uno de los procesos tenga un aplazamiento
indefinido debido a que siempre P1 podría estar siempre cogiendo
No 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.
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) then


if test -e $1 then
tar -czvf $1
else
echo “El fichero no existe”
fi
echo “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>
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 hijo
print(“x yo soy %8d \n”,getpid());
wait(&estado);
printf("x mi padre es: %d8 \n”,getppid());
}
else { //este es el proceso padre
printf("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.
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 groupadd
NAME
groupadd - Create a new group
SYNOPSIS
groupadd group_name
DESCRIPTION
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 useradd
NAME
useradd - Create a new user or update default new user information
SYNOPSIS
useradd [options] LOGIN
OPTIONS
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 passwd
NAME
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.
....
group add curso$1
cont=1
while test $cont –le $2
do
if test $cont –le 9
then
useradd –g curso$1 alum$10$cont
./autopasswd alum$10$cont ‘echo $3’
else
useradd –g curso$1 alum$1$cont
./autopasswd alum$1$cont ‘echo $3’
fi
done

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.

− 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.sh
Se ejecuta en el intérprete de comandos primario.
c)source alumno.sh

d)./alumno.sh

e)alumno.sh
Se ejecutará en un intérprete secundario y no se modifica el primario.
f)bash alumno.sh
Hace 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/profile
b)$HOME/.bash_profile
c)$HOME/.bashrc
d)$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
encuentran las variables de entorno del sistema y programas de inicio y las
podrí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
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ás
b) Que los archivos que se quieren concatenar existen. En caso contrario muestras un error y
sales inmediatamente.

if test $# -le 2 //mira que el num de parametros no sea menos que 2


then exit(-1)
else for n=$ (seq 2 $#) // un for desde 2 hasta el numero de parametros totales
do
if test –e $n //si el fichero existe, lo concatenamos al final del fichero “resultado”
then cat $n >> $1
else
then exit(-2)
fi
done
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 prog
Ejecutamos:
$ ./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 15801


Deberí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ñal
b)kill -SIGSTOP 15801
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ñal
c)kill -SIGUSR1 15801
No se trata esta señal en el programa
d)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

Das könnte Ihnen auch gefallen