Sei sulla pagina 1di 7

Laboratorio de Sistemas Operativos Página: 1

UNIVERSIDAD CATÓLICA DE SANTA MARÍA


ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS

SESIÓN 08:

Señales

I
OBJETIVOS

 Conocer y aplicar el concepto de señales para la comunicación entre procesos sobre


Procesos en LINUX
 Realizar ejercicios.

II
TEMAS A TRATAR
 Señales
 Captura
 Envio
 Alarmas
 Ejercicios

III
MARCO TEORICO

Las señales
Cada proceso en Unix puede reaccionar a las señales que se le envían. Existen 31 señales
diferentes. Para cada una de estas señales el proceso puede redefinir el comportamiento
predeterminado, excepto para dos de ellas: la señal número 9 (KILL), y la señal número
19 (STOP).

La señal 9 mata un proceso, sin darle tiempo de terminar correctamente. Esta es la señal
que deberá enviar a un proceso cuando este está trabado o exhibe otros problemas. Está
disponible una lista completa de las señales usando el comando kill -l.

Num. Nombre Comentarios


1 SIGHUP Colgar. Generada al desconectar el Terminal.
2 SIGINT Interrupción. Generada por teclado-

Karim Guevara Puente de la Vega, Eveling Castro Gutierrez Sesión 08


Laboratorio de Sistemas Operativos Página: 2

3 SIGQUIT1 Salir. Generada por teclado.


4 SIGILL1 Instrucción ilegal. No se puede capturar.
5 SIGTRAP1 Trazado. No se puede recapturar.
6 SIGABRT1 Abortar proceso.
8 SIGFPE1 Excepción aritmética de coma flotante o división por cero.
9 SIGKILL1 Matar proceso. No puede capturarse ni ignorarse.
10 SIGBUS1 Error del bus.
11 SIGSEGV1 Violación de segmentación.
12 SIGSYS1 Argumento erróneo en llamada al sistema.
13 SIGPIPE Escritura en una tubería que otro proceso no lee.
14 SIGALRM Alarma de reloj.
15 SIGTERM Terminación del programa.
16 SIGURG2 Urgencia de canal de E/S.
17 SIGSTOP3 Parada de proceso. No puede capturarse ni ignorarse.
18 SIGTSTP3 Parada interactiva. Generada por teclado.
19 SIGCONT4 Continuación. Generada por el teclado.
20 SIGCHLD2 Parada o salida de proceso hijo.
21 SIGTTIN3 Un proceso en 2do plano intenta leer del Terminal.
22 SIGTTOU3 Un proceso en 2do plano intenta escribir en el terminal.
23 SIGIO2 Operación de E/S posible o completada.
24 SIGXCPU Tiempo de UCP excedido.
25 SIGXFSZ Excedido el límite de tamaño de fichero.
30 SIGUSR1 Definida por el usuario número 1.
31 SIGUSR2 Definida por el usuario número 2.
34 SIGVTALRM Alarma de tiempo virtual.
36 SIGPRE Excepción programada. Definida por el usuario.
Tabla 12.1. Señales

Las señales comprendidas entre la 37 y la 58 (incluyendo ambas) están reservadas por el


sistema.

Una señal es un evento que debe ser procesado y que puede interrumpir el flujo normal
de un programa.

El tratamiento de una señal puede ser una de las siguientes acciones:


 Captura de una señal:
Una señal puede asociarse con una función que procesa el evento que ha ocurrido.
 Ignorar una señal:

Karim Guevara Puente de la Vega, Eveling Castro Gutierrez Sesión 08


Laboratorio de Sistemas Operativos Página: 3

El evento no interrumpe el flujo del programa. Las señales SIGINT Y SIGSTOP


no pueden ser ignoradas (ver tabla de señales).
 Acción por defecto:
Proceso suministrado por el sistema para capturar la señal (ver tabla de señales).

En nuestros programas utilizaremos la subrutina signal, la cual asocia una de las tres
acciones antes mencionadas con una señal.

Sintaxis:
#include <signal.h>
void (*signal (senial, accion))( )
int senial;
void (*accion )( )

Parámetros:
senial: número de señal, excepto SIGKILL.
accion: Puntero a la rutina asociada con la señal o uno de los siguientes valores:
o SIG_DFL: acción por defecto para dicha señal.
o SIG_IGN: para ignorar la señal .
Devuelve:
Valor de la acción anteriormente asociada; -1, en caso de error.

Envío de señales a los procesos


Comandos kill, killall
Estos dos comandos se usan para enviar señales desde el Shell a los procesos. El
comando kill necesita el número de un proceso como argumento, mientras que el
comando killall necesita el nombre de un comando.
Los dos comandos opcionalmente pueden recibir el número de una señal como
argumento. Predeterminadamente, ambos envían la señal 15 (TERM) a el o los procesos
relevantes. Por ejemplo, si quiere matar el proceso con PID 785, se tendría que ingresra
el comando:
$ kill 785

Si quiere enviarle la señal 9, usted ahora ingresa:


$ kill -9 785

Supongamos que quiere matar un proceso del cual usted conoce el nombre del comando.
En vez de encontrar el número de proceso usando ps, puede matar el proceso
directamente de la siguiente forma:
$ killall -9 netscape

Pase lo que pase, usted sólo matará sus propios procesos (a menos que sea root), por lo
que no debe preocuparse acerca de los procesos de los demás usuarios, incluso si tiene el
mismo nombre, ellos no serán afectados.

Karim Guevara Puente de la Vega, Eveling Castro Gutierrez Sesión 08


Laboratorio de Sistemas Operativos Página: 4

Función kill()
La función kill() incluida en un programa va a permitir que un proceso pueda enviar
señales a otro proceso. Admite dos parámetros:
 pid_t que es el identificador del proceso al cual vamos a enviar una
determinada señal.
 int indica el literal o el número de la señal a enviar.
Alarmas
Una alarma es una señal que es activada por los temporizadores del sistema a través de
SIGALRM.

IV
ACTIVIDADES
Escriba los siguientes programas, compílelos y luego ejecútelos y observe su
comportamiento
01. Uso de la señal CTRL+C y la señal alarma
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

int ncortes=0;
int bucle=1;
void alarma();
void cortar();

int main() {
signal (SIGINT, cortar);
signal (SIGALRM, alarma);

printf(“Ejemplo de signal.\n”);
printf(“Pulsa varias veces CTRL C durante 15 segundo.\n”);
alarm(15);
while(bucle);
signal (SIGINT,SIG_IGN);
printf(“Has intentado cortar %d veces.\n”,ncortes);
printf(“Hasta luego…..\n”);
exit(0);
}

void cortar( ) {
signal (SIGINT, SIG_IGN);
printf("Has pulsado CTRL C \n");
ncortes++;
signal (SIGINT, cortar);
}

void alarma ( ) {
signal (SIGALRM, SIG_IGN);
bucle=0;
printf("!Alarma! \n");
}

Karim Guevara Puente de la Vega, Eveling Castro Gutierrez Sesión 08


Laboratorio de Sistemas Operativos Página: 5

02. Comunicación entre procesos por medio del envío de señales: función kill

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void tratasenial (int);

main()
{
pid_t idProceso;
idProceso = fork();

if (idProceso==-1) {
perror("No se puede lanzar proceso”);
exit(-1);
}

if (idProceso == 0) {
signal (SIGUSR1, tratasenial);
while (1)
pause();
}

if (idProceso > 0) {
while (1) {
sleep(1);
kill (idProceso, SIGUSR1);
}
}
}

void tratasenial (int nsenial) {


printf (“Recibida la señal del Padre\n”);
}

La función pause() hace que el proceso quede suspendido hasta que llegue una señal.

03. Ejecutar el siguiente programa.


#include <unistd.h>
#include <signal.h>
#include <stdio.h>

void manejador (int);

main( )
{
if (signal (SIGINT, manejador) == SIG_ERR )
perror (“No se puede cambiar signal”);

while (1)
pause ();
}

void manejador (int nsenial) {


printf (“Pues no me salgo \n”);
printf (“Intentalo otra vez \n”);

Karim Guevara Puente de la Vega, Eveling Castro Gutierrez Sesión 08


Laboratorio de Sistemas Operativos Página: 6

signal (SIGINT, SIG_DFL)

04. Cierre el sistema

V
EJERCICIOS

01. Escriba un programa que cree un programa hijo y espere 4 segundos. Si después de
ese tiempo el hijo aún no ha terminado, el programa lo mata enviándole una señal.
Antes de resolver este ejercicio intente resolver la siguiente pregunta, ¿sería posible
saber si un proceso hijo ha terminado enviando una señal 0 mediante kill (como
hemos hecho en el ejercicio 2)?. Piense que, aunque el proceso haya terminado, si el
proceso padre sigue activo y no ha llamado a wait o a waitpid el proceso hijo sigue
existiendo en el sistema.
02. Escriba un programa que haga uso de las alarmas para mostrar el valor de un
contador cada 2 segundos. El contador se incrementará en uno cada vez que se
muestre su valor. Por ejemplo, si este programa estuviera en ejecución durante 11
segundos, su resultado sería el que se muestra a continuación.
$ ./vivo

Contador: 0
Contador: 1
Contador: 2
Contador: 3
Contador: 4
^C
$_

03. Una entidad bancaria almacena todas las operaciones de transferencias de fondos de
una cuenta a otra en un único fichero maestro. Las operaciones de transferencia se
reciben de varios ordenadores locales con capacidad de procesamiento autónomo.
Como pasa siempre en la vida real, el sistema no es perfecto y hay veces que los
ordenadores locales no pueden acceder al fichero maestro: fallos en la red, alta carga
de trabajo, mantenimiento del servidor, etc. Para la entidad es impensable que se
detengan las transacciones o que se pierda información de alguna de ellas. La
solución adoptada consiste en aprovechar las capacidades de procesamiento de los
ordenadores locales. Así, si un ordenador local no puede acceder al fichero maestro,
almacenará la transacción en un fichero local. Por las noches, un proceso recolector
sondea los ordenadores locales y añade al fichero maestro todas las operaciones
pendientes.

Karim Guevara Puente de la Vega, Eveling Castro Gutierrez Sesión 08


Laboratorio de Sistemas Operativos Página: 7

En este ejercicio vamos a implementar el código del proceso local cuya misión
enviar al recolector todas las operaciones almacenadas en su máquina. Su
funcionamiento se describe a continuación:
1. El proceso local esperará hasta recibir la señal USR1.
2. Después, el proceso local leerá el archivo de operaciones (llamado ‘operaciones’).
Éste es un archivo binario que contiene una estructura de tipo s_operacion por
cada operación almacenada en el ordenador local. Cada operación la enviará a la
salida estándar y leerá otra operación del proceso recolector. Si el identificador
de la operación leída es distinto del identificador de la operación que acaba de
enviar mostrará un mensaje de error de verificación.
3. Cuando el proceso local haya enviado todas las operaciones, terminará la
transmisión enviando una nueva operación con identificador.

Utilice la estructura se muestra a continuación.


struct s_operacion {
int id_operacion;
char cuenta_origen[15];
char cuenta_destino[15];
double cantidad;
}

VI
CUESTIONARIO

1. Averigüe para que se utilizan la función Raise.


2. Cuáles son las señales que no se pueden capturar?

VII
BIBLIOGRAFIA Y REFERENCIAS

 Blanco, V., “Linux Instalación, Administración y uso del Sistema”, Ed. Ra-Ma,
México, 2001.
 http://users.exa.unicen.edu.ar/~hcurti/linux/index.html

Karim Guevara Puente de la Vega, Eveling Castro Gutierrez Sesión 08

Potrebbero piacerti anche