Vous êtes sur la page 1sur 2

SistemasOperativos

Prctica5

Aligualqueelncleodelsistematrabajamedianteinterrupciones,paraprocesosaniveldencleo,elsistemanos
ofreceunmecanismoanlogoparatrabajarconlosprocesosaniveldeusuario:lasseales.Existenmultituddeseales
enelsistema.Podemosencontrarlasdefinidasenelarchivo
/usr/include/asm/signal.h
Conellastrabajantodoslosprocesos,echadlesunvistazo.
Laformadecapturarlasesmediantesignal(mansignalparamsdetalles).Lallamadaalsistemasignaltienedos
parmetrosunodeelloseslasealqueesperamosrecibir,yelotroelpunteroalarutinadeservicioquevamosa
ejecutarenelmomentoquelarecibamos.Podemosayudarnos,aveces,depause()quesuspendelaejecucindel
procesohastaquerecibeunaseal.
porejemplo.Elsiguientecdigoprogramaalmanejadorderelojparaquenosavisedentrode5segundosyesperaa
recibirlas seal SIGALRM.Unavezrecibida,sesaltaalarutinadeservicioalarma queimprimeunmensajey
continualaejecucinnormaldelproceso.
#include<signal.h>
voidalarma()
{
printf("acaboderecibirunSIGALRM\n");
}
main()
{
signal(SIGALRM,alarma);
printf("acabodeprogramarlacapturadeunSIGALRM\n");
alarm(3);
printf("ahoraheprogramadolaalarmaparaquevengaen3segundos\n");
pause();
printf("ahoracontinoconlaejecucinnormal\n");
}
Elsistematienepordefectounpardemanejadoresparaeltratamientodetodasycadaunadelasseales:SIG_DFLy
SIG_IGN.Elprimerodeellos,realizaunexitconelnmerodesealquerecibe,mientrasqueelsegundodeellos,
ignoralasealquellega.
Enelejemploanterior,sicomentolalneadelsignal,compiloyejecutoelprograma,comprobarquenoseimprimela
ltimalneadebidoaquepordefectoelsistemaposeeunmanejadorSIG_DFLquehaceexitconelnmerodeseal
recibida.
EnelestandarPOXIS,hayquetenerencuentaqueunavezrecibidalaseal,sedesprogramaelmanejador,demanera
quesirecibisemosunsegundoSIGALRMmematara.EnLINUXnoocurreas.Elsiguienteejemploloilustra.
#include<signal.h>
voidalarma(){
printf("acaboderecibirunSIGALRM\n");
}
main(){
signal(SIGALRM,alarma);

printf("acabodeprogramarlacapturadeunSIGALRM\n");
alarm(3);
printf("ahoraheprogramadolaalarmaparaquevengaen3segundos\n");
pause();
printf("vuelvoaprogramarlaalarma\n");
alarm(3);
pause();
printf("EnPOXISestalneanuncaseejecutaraporquemehamatadoelSIGALRM\n");
}
UnasealmuyutilizadaesSIG_CHILDqueesenviadaportodoprocesohijoasu
Padreenelmismoinstantequerealizaexit.Destamanera,elpadresabequesuhijohapedidoterminar.Ejemplo.El
siguienteprograma,unavezconvertidoenproceso,tieneunhijoquerealizaexit(5).Elpadrecapturael5.
#include<signal.h>
intstatus;
voidfinhijo(){
wait(&status);
}
main(){
signal(SIGCHLD,finhijo);
if(fork()==0){sleep(3);exit(5);}
pause();
printf("mihijohamuertoconestado%d\n",status/256);
printf(ahoracontinoconlaejecucin\n);
}
Entreprocesos,esposibleenviarsesealesaunque,paraello,esnecesarioconocerelPIDdelprocesoalqueseleenva
laseal.Comopodeisveren/usr/include/asm/signal.helsistemadefinedossealesparalosprocesosdeusuario:
SIGUSR1ySIGUSR2.
Ejercicio:realizarunprogramaquecreeunprocesoyqueelpadreenveunSIGUSR1asuhijo.Cuandoesteloreciba
queimprimaenpantallaquehacapturadounaseal,elprintfdebeestarincrustadoenelmanejadordeestaseal.
Hechoesto,elpadrerealizarunpausemientrasqueelhijoterminarsuejecucinconunexit(Elvalordelexitser
pasadocomoparmetroamain).Alrealizaresto,elpadrecapturarsuestadoyloimprimirenpantalla.Ahora,de
nuevoelpadretendrunhijoqueejecutarlaordenlslRdelraz.Denuevosepidequesecaptureelestadode
finalizacinyseimprimaenpantalla.