Vous êtes sur la page 1sur 4

Files,Pipes,FIFOs,I/ORedirection,UnixSockets,andSignals SrgioSantos DanielMachado Class3 Foramnos propostos 4 exerccios para resolver, nos quais deveramos aplicar todos os conhecimentosquefomosadquirindoaolongodosemestre.

dosemestre.Conseguimosresolvlosatodos,tendo algumadificuldadenoexerccio3,pois,umavezquenuncatnhamosestudadosockets,tivemosque pesquisarprimeirosobreoassunto,parapercebermoscomoseusavam. Assimpassamosaexplicaroqueerapedidoeoquefoifeitoemcadaexerccio: Exerccio1: @EsteexercciofoiresolvidonoficheiroExercise_1.cdentrodapastaExercise1. Objectivo: Fazerumprogramaqueestejaacorrercontinuamenteequecaptureossinais SIGINT(CtrlC)eSIGQUIT(Ctrl\),apenasterminandoaexecuoquandoosinalSIGQUITfosse capturadoenooCtrlC. QuandoosinalSIGQUITfossecapturadooprogramadeveriaterminarlanando paraoecronmerodevezesqueosinalSIGINTfoicapturado. Implementao: Esteexercciofoiimplementadonumaaula prtica,porm notnhamos posto o programaacontaronmerodevezesqueosinalSIGINTeracapturado.Tivemosdeimplementar umafunoparacapturarossinais,osinalSIGINT(CtrlC)eosinalSIGQUIT(Ctrl\). A funo sigproc captura um sinal e caso o seja o sinal SIGINT incrementa o contador,seforosinalSIGQUITimprimenaconsolaonmerodevezesqueCtrlCfoipressionado eterminaoprograma.Nointmain()chamamosafunoreferidaemcimaeprovocamosumciclo infinitodamodoaqueoprogramaestejasempreacorrerat quesejacapturadoosinalSIGQUIT (Ctrl\). 2007103867 2006111471

SistemasOperativos2009/2010 Relatrio PracticalAssignmentN1

Exerccio2: @EsteexercciofoiresolvidonoficheiroExercise2.cdentrodapastaExercise2. Objectivo: Emularduaslinhasdashell.ls>output.txtecatoutput.txt|sortr.

No segundo programa usamos as funes dup e dup2 para redireccionar os descritores padro paraoficheiro.Adiferenaentreestasfunes queafunodupvaiescolheromenor numerododescritordisponveledireccionaloparaodescritorpassadocomoargumento,nafuno dup2oprimeiroargumentovaisercopiadosegundoargumentoefechaodescritorpassadono primeiroargumentocasoesteestejaabertoinicialmente. Paraemularaprimeiralinhadashell(ls>output.txt)stemosqueredireccionarodescritor deescritapadroparaodescritordoficheiroedepoisfazerumachamadaaosistemaatravsda funoexeclp. Paraemularasegundalinhadashell(catoutput.txt|sortr)h anecessidadedecriarum pipeparacomunicarentreosprocessos.Noprimeiroprocessodireccionamosodescritordeescrita paraaentradadotuboenosegundoprocessodireccionamosodescritordeleituraparaasadado tubo. Tivemos sempre em ateno para no deixar aberta a extremidade do tubo que no era utilizadademodoanoocorreremerrosnaleituraeescritadosdescritores. Exerccio3eExerccio4: Ambososexercciostinhamomesmoobjectivo,apenasdiferiamnomododetransmissode dadosentreoClienteeoServidor,noexerccio3tnhamosdeusarsocketsUNIXenoexerccio4 usarnamedpipes(FIFOs). @EsteexercciofoiresolvidonosficheirosClient.ceServer.cdentrodapastaExercise 3(paraoexerccio3),edentrodapastaExercise4(paraoexerccio4),tendoumficheirode apoiodenominadoinput.ascemambasaspastas. Objectivo(dosdoisexerccios): Client.c: Converter um ficheiro do tipo asc (input.asc) para um do tipo bin (input.bin). Lertodososnmerosqueestonoficheiroinput.binparaumatabelacom apenasumaoperaodeleitura. Enviartodosestesnmerosqueestonatabelaparaoutroprocessoatravs deumFIFO. Nofimdeenviarosnmerosenviar onmero"DBL_MAX"paraqueo outroprocessosaibaquejnodeverlermaisnada

Server.c: ReceberatravsdeumFIFOumacertaquantidadedevaloreseescrevelos directamentenoficheirooutput.asc. Quandorecebeonmero"DBL_MAX"j nooescrevenoficheirode sadaepraaleitura. Implementao: ParacumprirtodososobjectivosdoClient.coptamospordesenvolvertrsfunes: voidText_to_Bin(char*FileTxt,char*FileBin); converteoficheiroFileTxt(input.asc)paraoficheiroFileBin(input.bin)atravsde filepointers. longGet_File_Size(char*FileBin); ObtmonmerodedoublesqueestonoficheiroFileBin(input.bin),comauxilio dasfunes: fseek()permitemoverocursodentrodoficheiroparaaposiodesejada ftell()devolveonumerodebytesdoficheironaposioemqueest double*Read_All_Doubles(char*FileBin,longFile_Size); EstafunovaialocarmemoriaconsoanteoparmetroFile_Size,ecomumas operaodeleituravailertodososdoublesnoficheiroFile_Bineretornaressesmesmovalores. Agoranosprximosdoispontosexplicamosoprocessodecriaodasligaes(porSocket eporFIFO)assimcomooqueoServer.cfaz. 1)ExplicaosucintadoprocessodecriaodaligaodoExerccio3(Sockets) ChamadastodasasfunesdesenvolvidasnoClient.c,apenastemosdeinicializarosocket. Quandoeste criadocomsucessodeveserseguidocomopreenchimentodeuma struct dotipo sockaddr_uncomosdadosconvenientes,visandoapreparaoparafazeraconexo.Quandoessa conexo estabelecidatodososvaloresguardadosnavarivelvaluesvosertransmitidos,umpor um,atravsdosocket,enquantoqueoServervailendo,tendosidoenviadostodososvalorestemos deenviaroDBL_MAXqueestnabibliotecafloat.hparaqueoServersaibaquenoprecisadeler maisnada. Aps da criao no Server.c do socket, tem que se preencher uma struct do tipo sockaddr_uncomosdadosconvenientes.Deseguidatemosdechamarafunobind()demaneira aassociarumendereoaosocketcriado.Posteriormentedefineseafunolisten(), quevaicriar umatabelacomospedidosdeconexo.Por ltimochamamosafuno accept() quevaiver tabela anterior os pedidos de conexo e estabelecer a ligao. No fim da ligao estabelecida abrimosumficheiroe, medidaquevamoslendoosnmerosdosocketvamosescrevendoosno ficheirofinaldesada(output.asc),atleroDBL_MAX,nosendoesteescritonoficheiro.

2)ExplicaosucintadoprocessodecriaodaligaodoExerccio4(FIFOs) ChamadastodasasfunesdesenvolvidasnoClient.c,apenastemosdeabrironamedpipe (FIFO)eescrevertodososvalores,enquantoqueoServervailendo,tendoescritotodososvalores temosdeenviaroDBL_MAXqueestnabibliotecafloat.hparaqueoServersaibaquenoprecisa delermaisnada. No Server.c temos de ter ateno criao do FIFO, pois se o programa j tiver sido executadoeoFIFOcriado,aotentarcriarumFIFOcomomesmonomepoderocorreralgumerro. Assim,criamosumalgoritmoqueseacriaodoFIFOnoforbemsucedidoapagaoFIFOantigo eocriadenovo.EstandooFIFOcriadovamosterdelerdoFIFOeescreverparaoficheirofinalde sada(output.asc),atleroDBL_MAX,nosendoesteescritonoficheiro.