Documentación de laboratorio€¦ · Para comenzar, ejecutaremos lo que llamamos una Shell o un...

73
Documentación de laboratorio Curso otoño 2017-2018 Este documento contiene las sesiones a realizar durante las clases de laboratorio. Las sesiones incluyen el trabajo previo y el trabajo a realizar durante la sesión Profesores SO-Departamento AC

Transcript of Documentación de laboratorio€¦ · Para comenzar, ejecutaremos lo que llamamos una Shell o un...

  • DocumentacióndelaboratorioCursootoño2017-2018Estedocumentocontienelassesionesarealizardurantelasclasesdelaboratorio.LassesionesincluyeneltrabajoprevioyeltrabajoarealizardurantelasesiónProfesoresSO-DepartamentoAC

  • Página2de73

    Índicedesesiones

    Sesión1:Elintérpretedecomandos:shell..................................................................................3

    Sesión2:EllenguajeC................................................................................................................17

    Sesión3:Procesos......................................................................................................................26

    Sesión4:Comunicacióndeprocesos.........................................................................................33

    Sesión5:GestióndeMemoria...................................................................................................40

    Sesión6:Análisisderendimiento..............................................................................................46

    Sesión7:GestióndeEntrada/Salida..........................................................................................54

    Sesión8:GestióndeEntrada/Salida..........................................................................................63

    Sesión9:SistemadeFicheros....................................................................................................67

    Sesión10:ConcurrenciayParalelismo.......................................................................................71

  • Página3de73

    Sesión1:El intérpretedecomandos:shellPreparaciónprevia

    1. ObjetivosEl objetivo de esta sesión es aprender a desenvolverse en el entorno de trabajo de loslaboratorios. Veremos que algunas operaciones se pueden hacer tanto con comandosinteractivoscomoutilizandoelgestordeventanas.Noscentraremosenlaprácticadealgunoscomandosbásicos y en la utilizacióndelmanual online (man) que encontraréis en todas lasmáquinasLinux.

    2. Habilidades• Sercapazdeutilizarlaspáginasdeman.• Ser capaz de utilizar comandos básicos de sistema para modificar/navegar por el

    sistemadeficheros:cd,ls,mkdir,cp,rm,rmdir,mv.• Conocerlosdirectoriosespeciales“.”y“..”.• Ser capaz de utilizar comandos básicos de sistema y programas de sistema para

    accederaficheros:less,cat,grep,gedit(uotroeditor).• Sercapazdemodificarlospermisosdeaccesodeunfichero.• Sercapazdeconsultar/modificar/definirunavariabledeentorno.• Ser capaz de utilizar algunos caracteres especiales de la Shell (intérprete de

    comandos):o &paraejecutarunprogramaensegundoplano(ejecutarenbackground).o >paraguardarlasalidadeunprograma(redireccionarlasalida).

    3. ConocimientospreviosEnestasesiónnoserequierenconocimientosprevios.

    4. Guíaparaeltrabajoprevio4.1. AccesoalsistemaEnloslaboratoriostenemosinstaladoUbuntu16.04LTS64bits.Tenemosvariosusuarioscreados para que se puedan hacer pruebas que involucren a varios usuarios. Losusernamesde losusuariosson:”alumne”,“so1”,“so2”,“so3”,“so4”y“so5”.Elpasswordes“sistemes”paratodosellos.

    Para comenzar, ejecutaremos lo que llamamos una Shell o un intérprete de comandos.UnaShellesunprogramaqueelS.O.nosofreceparapodertrabajarenunmododetextointeractivo.Esteentornopuedeparecermenos intuitivoqueunentornográfico,peroesmuysencilloypotente.

  • Página4de73

    Existen varios intérpretes de comandos, en el laboratorio utilizaréis Bash (GNU-BourneShell), pero en general nos referiremos a él como Shell. La mayoría de las cosas queexplicaremos en esta sesión se pueden consultar en el manual de Bash (ejecutando elcomandomanbash).

    ParaejecutarunaShellbastaconejecutarlaaplicación“Terminal”.Conestaaplicación,seabreunanuevaventana(similaraladelaimagen)dondeseejecutaunanuevaShell.

    Figura1Ventanadelashell

    El texto que aparece a la izquierda junto con el cursor que parpadea es lo que seconoce como prompt y sirve para indicar que la Shell está lista para recibir nuevasórdenes o comandos. Nota: en la documentación de laboratorio utilizaremos elcarácter#pararepresentarelprompteindicarqueloquevieneacontinuaciónesunalíneadecomandos(paraprobar la líneaNODEBÉISESCRIBIR#,sóloelcomandoqueapareceacontinuación).

    ElcódigodelaShellsepodríaresumirdelasiguientemanera:

    Existen dos tipos de comandos: comandos externos y comandos internos. Loscomandosexternossoncualquierprogramainstaladoen lamáquinay loscomandosinternossonfuncionesimplementadasporelintérpretedecomandos(cadaintérpreteimplementalossuyos,loshaycomunesatodosellosyloshaypropios).

    4.2. ComandosparaobtenerayudaEnLinux,existendoscomandosquepodemosejecutardeformalocalenlamáquinaparaobtener ayuda interactiva: el comandoman, que nos ofrece ayuda sobre los comandosexternos (como parte de la instalación, se instalan también las páginas delmanual que

    while(1){ comando=leer_comando(); ejecutar_comando(comando); }

  • Página5de73

    podremosconsultaratravésdelman),yelcomandohelp,quenosofreceayudasobreloscomandosinternos.• Lee la guía sobre cómo utilizar elman de Linux que tienes al final de esta sección

    (“Utilización del manual”). A continuación, consulta el man (man nombre_comando) de los siguientes comandos. En concreto, para cada comandodebesleeryentenderperfectamente:laSYNOPSIS,laDESCRIPTIONylasopcionesqueaparecenenlacolumna“Opciones”delatabla.

    Para leer con elman

    Descripciónbásica Opciones

    man Accedealosmanualeson-line ls Muestraelcontenidodeldirectorio -l,-aalias Defineunnombrealternativoauncomando mkdir Creaundirectorio rmdir Eliminaundirectoriovacío mv Cambiaelnombredeunficheroo lomueve

    aotrodirectorio-i

    cp Copiaficherosydirectorios -irm Borraficherosodirectorios -iecho Visualizauntexto(puedeserunavariablede

    entorno)

    less Muestraficherosenunformatoaptoparaunterminal.

    cat Concatenaficherosylosmuestraensusalidaestándar

    grep Buscatexto(opatronesdetexto)enficheros gedit EditordetextoparaGNOME env Ejecuta un comando en un entorno

    modificado, si no se le pasa comando,muestraelentorno

    chmod Modificalospermisosdeaccesoaunfichero. which Localizauncomando

    • Utilizad el comando help para consultar la ayuda sobre los siguientes comandosinternos:

    Paraconsultarconelhelp

    Descripciónbásica Opciones

    help OfreceinformaciónsobrecomandosinternosdelaShell

    export Defineunavariabledeentorno cd Cambiaeldirectorio(carpeta)actual alias Defineunnombrealternativoauncomando

    • Accedealapáginadelmanparaelbash(ejecutandoelcomandomanbash)ybuscael significado de las variables de entorno PATH,HOME y PWD (nota: el carácter “/”sirve para buscar patrones en las páginas del man. Utilízalo para encontrardirectamenteladescripcióndeestasvariables).

  • Página6de73

    Utilizacióndelmanual

    Saber utilizar el manual es básico ya que, aunque durante el curso os explicaremosexplícitamente algunos comandos yopciones, el resto (incluido llamadas a sistema) deberásbuscarlotúmismoenelmanual.Elpropiomanesautocontenidoenestesentido,yaqueparavertodassusopcionespuedesejecutar:

    #manman

    La informacióndelmanualestáorganizadaensecciones. La sección2,porejemplo,es ladellamadasasistema.Lasseccionesquepodemosencontrarson:

    1. comandos2. llamadasasistema3. llamadasalibreríasdeusuarioodellenguaje4. etc.

    Lainformaciónproporcionadaalejecutarelmanesloqueseconocecomo“páginademan”.Una “página” suele ser el nombre de un comando, llamada a sistema o llamada a función.Todaslaspáginasdemansiguenunformatoparecido,organizadoenunaseriedepartes.EnlaFigura 2 tienes un ejemplo de la salida delmanpara el comando ls (hemos borrado algunalíneaparaquesevean lasprincipalespartes).En laprimerapartepuedesencontrar tantoelnombredelcomandocomoladescripciónyunesquema(SYNOPSIS)desuutilización.Enestaparte puedes observar si el comando acepta opciones, si necesita algún parámetro fijo uopcional,etc.

    Figura2manls(simplificado)

    La siguiente parte es la descripción (DESCRIPTION) del comando. Esta parte incluye unadescripciónmásdetalladadesuutilizaciónylalistadeopcionesquesoporta.Dependiendodelainstalacióndelaspáginasdemantambiénpuedesencontraraquíloscódigosdefinalización

    LS(1)UserCommandsLS(1)NAMEls-listdirectorycontentsSYNOPSISls[OPTION]...[FILE]...DESCRIPTIONListinformationabouttheFILEs(thecurrentdirectorybydefault).Sortentriesalphabeticallyifnoneof-cftuSUXnor--sort.Mandatoryargumentstolongoptionsaremandatoryforshortoptionstoo.-a,--alldonotignoreentriesstartingwith.SEEALSOThefulldocumentationforlsismaintainedasaTexinfomanual.Iftheinfoandlsprogramsareproperlyinstalledatyoursite,thecommand info lsshouldgiveyouaccesstothecompletemanual.ls5.93November2005LS(1)

  • Página7de73

    del comando (EXIT STATUS). Finalmente suele haber una serie de partes que incluyen losautores de la ayuda, la forma de reportar errores, ejemplos y comandos relacionados (SEEALSO).

    EnlaFigura3tieneselresultadodeejecutar“man2write”,quecorrespondeconlallamadaasistemawrite.Elnúmeroqueponemosantesde lapáginaes la secciónen laquequeremosbuscaryqueincluimosenestecasoyaqueexistemásdeunapáginaconelnombrewriteenotras secciones.Enestecaso laSYNOPSIS incluye los ficherosquehandeser incluidosenelprograma C para poder utilizar la llamada a sistema en concreto (en este caso unistd.h). Sifueranecesario“linkar”tuprogramaconalgunalibreríaconcreta,quenofueranlasqueutilizaelcompiladordeCpordefecto, lonormalesqueaparezcatambiénenestasección.AdemásdelaDESCRIPTION,enlasllamadasafunciónengeneral(seallamadaasistemaoalibreríadellenguaje) podemos encontrar la sección RETURN VALUE (con los valores que devuelve lafunción) y una sección especial, ERRORS, con la lista de errores. Finalmente tambiénencontramos varias secciones donde aquí destacamos también la sección de NOTES(aclaraciones)ySEEALSO(llamadasrelacionadas).

    Figura3man2write(simplificado)

    Elmanessimplementeunaherramientadelsistemaque interpretaunasmarcasen ficherosdetextoylasmuestraporpantallasiguiendolasinstruccionesdeesasmarcas.Lascuatrocosasbásicasquetienesquesaberson:

    WRITE(2) Linux Programmers Manual WRITE(2) NAME write - write to a file descriptor SYNOPSIS #include ssize_t write(int fd, const void *buf, size_t count); DESCRIPTION write() writes up to count bytes to the file referenced by the file descriptor fd from the buffer starting at buf. POSIX requires that a read() which can be proved to occur after a write() has returned returns the new data. Note that not all file systems are POSIX con- forming. RETURN VALUE On success, the number of bytes written are returned (zero indicates nothing was written). On error, -1 is returned, and errno is set appropriately. If count is zero and the file descriptor refers to a regular file, 0 will be returned without causing any other effect. For a special file, the results are not portable. ERRORS EAGAIN Non-blocking I/O has been selected using O_NONBLOCK and the write would block. EBADF fd is not a valid file descriptor or is not open for writing. …. Other errors may occur, depending on the object connected to fd. NOTES A successful return from write() does not make any guarantee that data has been committed to disk. In fact, on some buggy implementations, it does not even guarantee that space has successfully been reserved for the data. The only way to be sure is to call fsync(2) after you are done writing all your data. SEE ALSO close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), read(2), select(2), fwrite(3), writev(3)

  • Página8de73

    • Normalmente una página de man ocupa varias pantallas, para ir avanzandosimplementehayqueapretarlabarraespaciadora.

    • Parairunapantallahaciaatráspuedesapretarlaletrab(back).• Parabuscaruntextoe irdirectamentepuedesusarelcarácter“/”seguidodeltexto.

    Porejemplo“/SEEALSO”osllevadirectoalaprimeraaparicióndeltexto“SEEALSO”.Parairalasiguienteaparicióndelmismotextosimplementeutilizaelcaráctern(next).

    • Parasalirdelmanutilizaelcarácterq(quit).

    5. BibliografíaLadocumentaciónqueosdamosenestecuadernonormalmenteessuficientepararealizarlassesiones,peroencadasesiónosdaremosalgunareferenciaextra.

    • GuíadeBASHshell:o DelaasignaturaASO(encatalán):

    http://docencia.ac.upc.edu/FIB/grau/ASO/files/lab/aso-lab-bash-guide.pdf

    o Eninglés:http://tldp.org/LDP/abs/html/index.htmlo TutorialdeusodeShell:http://www.ant.org.ar/cursos/curso_intro/c920.html

    Ejerciciosarealizarenellaboratorio

    Ø LasprácticasserealizaránenunsistemaUbuntu16.04LTSØ Tienesatudisposiciónunaimagendelsistemaigualaladeloslaboratoriosparapoder

    prepararlassesionesdesdecasa.LaimagenesparaVMPlayer:o https://my.vmware.com/web/vmware/free#desktop_end_user_computing/v

    mware_player/6_0o Imagen:http://softdocencia.fib.upc.es/software/Ubuntu64.zip

    Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecenen el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

    Ø Las líneas del enunciado que empiezan por el carácter “#” indican comandos que

    tienesqueprobar.NOtienesqueescribirelcarácter#.Ø Paraentregar:ficherosesion01.tar.gz

    #tar zcfv sesion01.tar.gz entrega.txt

    Navegarporlosdirectorios(carpetasenentornosgráficos)Podrásobservarque lagranmayoríade loscomandosbásicosenLinux son2ó3 letrasquesintetizan la operación a realizar (en inglés por supuesto). Por ejemplo, para cambiar dedirectorio (changedirectory) tenemoselcomandocd.Paraverelcontenidodeundirectorio(listdirectory)tenemoselcomandols,etc.

  • Página9de73

    En UNIX los directorios están organizados de forma jerárquica. El directorio base es la raíz(representadaporelcarácter/)yapartirdeahícuelganelrestodedirectoriosdelsistema,enel que se sitúan archivos y directorios comunespara todos los usuarios.Además, dentrodeestajerarquía,cadausuariosueletenerasignadoundirectorio(homedirectory),pensadoparaque actúe como base del resto de sus directorios y ficheros. Cuando un usuario inicia unterminal, su directorio actual de trabajo pasa a ser su home directory. Para modificar eldirectorio actual de trabajo puede usar el comando cd, que le permite navegar por toda lajerarquíadeficheros.

    A continuación, realiza los siguientes ejercicios utilizando los comandos que consideresmásoportunos:

    1. Crealosdirectoriosparalas5primerassesionesdelaasignaturaconlosnombresS1,S2,S3,S4yS5.

    PREGUNTA1. ¿QuécomandoshabéisutilizadoparacrearlosdirectoriosS1..S5?

    2. SiabreselFileBrowserdelUbuntu,yvasa lamisma“carpeta”en laqueestásen laShell,deberíasveralgosimilaralodeestaimagen:

    3. CambiaeldirectorioactualdetrabajoaldirectorioS1.4. Listael contenidodeldirectorio.Aparentementenohaynada.Sinembargo,haydos

    “ficherosocultos”. Todos los ficheros que enUNIX empiezanpor el carácter “.” sonficheros ocultos, y suelen ser especiales. Consulta qué opción debes añadir alcomandoparavertodoslosficheros.Losficherosquesevenahorason:

    o Ficherode tipodirectorio “.”:Hace referencia almismodirectorio en el queestás en ese momento. Si ejecutas (cd .) verás que sigues en el mismodirectorio.Másadelanteveremosquéutilidadtiene.

    o Fichero de tipo directorio “..”: Hace referencia al directorio de nivelinmediatamente superior al que estamos. Si ejecutas (cd ..) verás quecambiasaldirectoriodedondevenías.

    o Fíjatequeestos ficherosocultosnoaparecenenelentornográfico:sientrasen la carpeta S1 aparece vacía (en el entorno gráfico, también existe una

  • Página10de73

    opciónde configuraciónpara las carpetasquepermite visualizar los ficherosocultos).

    PREGUNTA2. ¿Quécomandoutilizasparalistarelcontenidodeundirectorio?¿Quéopciónhayqueañadirparaverlosficherosocultos?

    5. Lasopcionesde loscomandosnormalmentesepuedenacumular.Miraenelmanualqué opción hay que incluir para ver información extendida sobre los ficheros ypruébalo.

    PREGUNTA3. ¿Qué opción hay que añadir a ls para ver información extendida de losficheros? ¿Qué campos se ven por defecto con esa opción? (si no encuentras lainformaciónenelmanpreguntaatuprofesor)

    6. Cuando utilizamos muy a menudo una configuración específica de un comando sesueleusarloqueseconocecomo“alias”.Consisteendefinirunpseudo-comandoquelaShellconoce.Porejemplo,sivemosqueelcomando lssiempre loejecutamosconlasopciones“–la”,podemosredefinir“ls”comounaliasdelasiguientemanera:

    #alias ls=’ls –la’ Ejecuta este comando alias y a continuación ejecuta ls sin argumentos. Compruebaquelasalidaesladelcomandolsconlasopciones–la.

    7. Podemos ver una información similar a la del comando ls –la en el entorno gráfico.Mira cómomodificar el FileBrowserpara conseguirlo.Deberías ver algo similar a lomostradoenlasiguientefigura:

    LascolumnasquesemuestranaquísonlasseleccionadaspordefectoperosepuedencambiarenlaopciónView.

    PREGUNTA4. ¿Qué opciones de menú has activado para extender la información quemuestraelFileBrowser?

  • Página11de73

    8. Desde la Shell borra algunos de los directorios que has creado, comprueba querealmentenoaparecenyvuelveacrearlos.Miracómosehacelomismoenelentornográfico.

    PREGUNTA5. ¿Qué secuencia de comandos has ejecutado para borrar un directorio,comprobarquenoestáyvolveracrearlo?

    Comandosbásicosdelsistemaparaaccederaficheros1. Crea un fichero. Para crear un fichero que contenga cualquier texto tenemos varias

    opciones,porejemploabrireleditoryescribircualquiercosa:o #gedittest

    2. ParapoderejecutarcualquiercomandoverásquetienesqueabrirotraShellporquelaqueteníasestábloqueadaporeleditor(estosucedesóloalabrirelprimerfichero,nosiyatienesabiertoeleditor).EstoesasíporquelaShellpordefectoesperahastaqueelcomandoactualacabeantesdemostrarelpromptyprocesarelsiguientecomando.Para evitar tener una Shell abierta para cada comando que queremos ejecutarsimultáneamente, podemos pedirle al Shell que ejecute los comandos en segundoplano (oenbackground).Cuandousamosestemétodo, la Shelldejaenejecuciónelcomandoeinmediatamentemuestraelpromptypasaaesperarlasiguienteorden(sinesperar hasta que el comando acabe). Para ejecutar un comando en segundoplanoañadimosalfinaldelalíneadelcomandoelcarácterespecial“&”.Porejemplo:

    o #gedittest&3. Paraverdeunaformarápidaelcontenidodeunfichero,sinabrirotravezeleditor,

    tenemosvarioscomandos.Aquímencionaremos2:catyless.Añadealficherotest3o4páginasdetexto(cualquiercosa).Pruebaloscomandoscatyless.

    o Nota:sielficheroquecreasnoeslosuficientementegrandenoverásningunadiferencia.

    PREGUNTA6. ¿Quédiferenciahayentreelcomandocatyless?

    4. Copiaelficherotestvariasveces(añadiendounnúmerodiferentealfinaldelnombrede cada fichero destino, p.ej. “test2”) ¿Qué pasaría si el fichero origen y destinotuvieran el mismo nombre?Mira en el man la opción “–i “ del comando cp. ¿Quéhace?Creaunaliasdelcomandocp(llámalocp)queincluyalaopción–i.

    PREGUNTA7. ¿Paraquésirvelaopción-idelcomandocp?¿Cuáleslaordenparahacerunaliasdelcomandocpqueincluyalaopción-i?

    5. Pruebaaborraralgunodelosficherosqueacabasdecrearyacambiarleelnombreaotros.Hazunaliasconlaopción–idelcomandorm(llámalorm).Compruebatambiénlaopción–idelcomandomv.

    PREGUNTA8. ¿Qué hace la opción -i del comando rm? ¿Y la opción -i delmv? Escribe laordenparahacerunaliasdelcomandormqueincluyalaopción-i.

  • Página12de73

    6. Otro comando que es muy útil es el comando grep. El comando grep nos permitebuscarun texto (explícitoomedianteunpatrón)enunoomásarchivos.Añadeunapalabraenunodelosficherosquehascopiadoypruebaelcomandogrepparabuscaresapalabra.Porejemplo,añadimoslapalabra“hola”aunodelosficherosyhacemoslaprueba:

    #grep hola test test1 test2 test3 test4

    7. Elcomandols–ltambiénpermiteverlospermisosquetieneunfichero.EnUNIX,lospermisosseaplicanatresniveles:elpropietariodelfichero(u),losusuariosdelmismogrupo(g),yelrestodeusuarios(o).Yhacenreferenciaatresoperacionesomodosdeacceso:lectura(r),escritura(w)yejecución(x).Porejemplo,sieneldirectorioactualsólotenemoselficherof1,yesteficherotienepermisode lecturayescrituraparaelpropietariodelfichero,sólolecturaparalosmiembrosdesugrupoysólolecturaparaelrestodeusuariosdelamáquina,laejecucióndelcomandodaríalasiguientesalida:

    # ls –la drwxr-xr-x 26 alumne alumne 884 2011-09-15 14:31 . drwxr-xr-x 3 alumne alumne 102 2011-09-15 12:10 .. -rw-r--r-- 1 alumne alumne 300 2011-09-15 12:20 f1 Laprimeracolumnade lasalida indicael tipodeficheroy lospermisosdeacceso.Elprimer carácter codifica el tipo de fichero (el carácter ‘d’ significa directorio y elcarácter‘-‘significaficherodedatos).Yacontinuaciónelprimergrupode3caracteresrepresentan, en este orden, si el propietario tiene permiso de lectura (mediante elcarácter ‘r’) o no lo tiene (y entonces aparece el carácter ‘-‘), si tiene permiso deescritura (carácter ‘w’) o no puede escribir (carácter ‘-‘) y si tiene o no permiso deejecución (carácter ‘x’ o carácter ‘-‘). El segundo grupo de 3 caracteres son lospermisos que tienen losmiembros del grupo de propietario y el último grupo de 3caracteressonlospermisosdeaccesoquetienenelrestodeusuariosdelamáquina.Estospermisossepuedenmodificarmedianteelcomandochmod.Elcomandochmodofrece varias maneras para especificar los permisos de acceso, una manera muysencilla consiste en indicar primero los usuarios que se van a ver afectados por elcambiodepermisos,cómoqueremoscambiaresospermisos(añadir,quitaroasignardirectamente)ylaoperaciónafectada.Porejemploelcomando:

    #chmod ugo+x f1 Modificaríalospermisosdef1,activandoelpermisodeejecuciónsobref1paratodoslosusuariosdelamáquina.

    Elcomando:

    #chmod o-x f1 Modificaríalospermisosdef1quitandoelpermisodeejecuciónparalosusuariosquenosonelpropietarionipertenecenasugrupo.

    Yelcomando:

    #chmod ug=rwx f1 Haría que los permisos de acceso a f1 fueran exactamente los indicados: lectura,escriturayejecuciónparaelpropietariolosmiembrosdesugrupo.

  • Página13de73

    Modificalospermisosdelficherodetestparadejarsolamentelosdeescrituraparaelpropietariodelfichero,sugrupoyelrestodeusuarios,eintentahaceruncat.Vuelveamodificarlospermisosdetestdejandosolamentelosdelecturaparaelpropietariodelfichero,sugrupoyelrestodeusuarioseintentaborrarlo.

    PREGUNTA9. ¿Quéopcionesdechmodhasutilizadoparadejarsolamentelospermisosdeescritura?¿Quéresultadohadevuelvocatalintentarverelficherotest?¿Quéopcionesdechmodhasutilizadoparadejarsolamentelospermisosdelectura?¿Hasconseguidoborrarlo?

    VariablesdeentornoLosprogramasseejecutanenundeterminadoentornoocontexto:pertenecenaunusuario,aun grupo, a partir de un directorio concreto, con una configuración de sistema en cuanto alímites,etc.Seexplicaránmásdetallessobreelcontextooentornodeunprogramaeneltemadeprocesos.

    Enestasesiónintroduciremoslasvariablesdeentorno.Lasvariablesdeentornosonsimilaresalasconstantesquesepuedendefinirenunprograma,peroestándefinidasantesdeempezarelprogramaynormalmentehacen referenciaaaspectosdesistema (directoriospordefectoporejemplo)ymarcanalgunosaspectosimportantesdesuejecución,yaquealgunasdeellasson utilizadas por la Shell para definir su funcionamiento. Se suelen definir enmayúsculas,pero no es obligatorio. Estas variables pueden ser consultadas durante la ejecución de losprogramasmediantefuncionesdelalibreríadeC.ParaconsultarelsignificadodelasvariablesquedefinelaShell,puedesconsultarelmandelaShellqueestésutilizando,enestecasobash(manbash,apartadoShellVariables).

    8. Ejecutaelcomando“env”paraverlalistadevariablesdefinidasenelentornoactualysuvalor.

    Para indicarle a la Shell que queremos consultar una variable de entorno debemos usar elcarácter$delantedelnombredelavariable,paraquenoloconfundaconunacadenadetextocualquiera.Paraverelvalordeunavariableenconcretoutilizaelcomandoecho:

    #echo $USERNAME #echo $PWD

    9. Algunas variables las actualiza la Shell dinámicamente, por ejemplo, cambia dedirectorio y vuelve a comprobar el valor de PWD. ¿Qué crees que significa estavariable?

    10. CompruebaelvalordelasvariablesPATHyHOME.

    PREGUNTA10. ¿CuáleselsignificadodelasvariablesdeentornoPATH,HOMEyPWD?PREGUNTA11. LavariablePATHesunalistadedirectorios,¿Quécarácterhacedeseparador

    entreundirectorioyotro?

  • Página14de73

    También podemos definir o modificar una variable de entorno utilizando el siguientecomando(paramodificacionesnoseusael$antesdelnombre):

    export NOMBRE_VARIABLE=valor (sin espacios). 11. Definedosvariablesnuevasconelvalorquequierasycompruebasuvalor.

    PREGUNTA12. ¿Qué comando has usado para definir y consultar el valor de las nuevasvariablesquehasdefinido?

    12. Bájate el fichero S1.tar.gz y cópialo en la carpeta S1. Descomprímelo ejecutando elcomando tar xvfz S1.tar.gz para obtener el programa “ls” que vamos a usar acontinuación.

    13. SitúateenlacarpetaS1yejecutalossiguientecomandos:

    #ls #./ls

    Fíjate que con la primera opción, se ejecuta el comando del sistema en lugar delcomando ls que hay en tu directorio. Sin embargo, con la segunda opción hasejecutadoel programa ls que te acabasdebajar en lugar deusar el comando ls delsistema.

    14. Añadeeldirectorio“.”alprincipiodelavariablePATHmedianteelcomando(fíjateenelcarácterseparadordedirectorios):

    #export PATH=.:$PATH MuestraelnuevovalordelavariablePATHycompruebaque,apartedeldirectorio“.”,aúncontienelosdirectoriosqueteníaoriginalmente(noqueremosperderlos).Ejecutaahoraelcomando:

    #ls

    PREGUNTA13. ¿Quéversióndellssehaejecutado?:El lsdelsistemaoelqueteacabasdedescargar?Ejecutaelcomando“whichls”paracomprobarlo.

    PREGUNTA14. ¿El directorio en el que estás, está definido en la variable PATH? ¿Quéimplicaesto?

    15. Modifica la variable PATH para eliminar el directorio “.”. No es posible modificarparcialmentelavariableporloquetienesqueredefinirla.MuestraelcontenidoactualdelavariablePATHyredefínelausandotodoslosdirectoriosqueconteníaexceptoel“.”.

    Ejecutaahoraelcomando:

    #ls 16. Añadeeldirectorio“.”al finalde lavariablePATH(fíjateenelcarácterseparadorde

    directorios):

    #export PATH=$PATH:. Compruebaque,apartedeldirectorio“.”,lavariablePATHaúncontienelosdirectoriosqueteníaoriginalmente(noqueremosperderlos).Ejecutaahoraelcomando:

  • Página15de73

    #ls

    PREGUNTA15. ¿Qué binario ls se ha ejecutado en cada caso de los anteriores:El ls delsistema o el que te acabas de descargar? Ejecuta el comando “which ls” paracomprobarlo.

    Mantenemosloscambios:fichero.bashrcLos cambios que hemos hecho durante esta sesión (excepto los que hacen referencia alsistemadeficheros)seperderánalfinalizarlasesión(definicióndealias,cambiosenelPATH,etc).Paraquenosepierdan,hemosdeinsertarestoscomandosenelficherodeconfiguracióndesesiónqueutilizalaShell.ElnombredelficherodependedelaShellqueestemosutilizando.EnelcasodeBashes$HOME/.bashrc.Cadavezqueiniciamosunasesión,laShellseconfiguraejecutandotodosloscomandosqueencuentreenesefichero.

    17. Editaelfichero$HOME/.bashrcyañadelamodificacióndelPATHquetehemospedidoenelapartadoanterior.Añadetambiénladefinicióndeunaliasparaquecadavezqueejecutemos el comando ls se haga con la opción –m. Para comprobar que hasmodificadobienel.bashrcejecutalossiguientescomando:

    #source $HOME/.bashrc #ls

    Ycompruebaque lasalidadel lssecorrespondecon lade laopción–m.Elcomandosourceprovocalaejecucióndetodosloscomandosquehayelficheroquelepasamoscomoparámetro (es unamaneradeno tenerque reiniciar la sesiónparahacer queesoscambiosseanefectivos).

    • Nota: en el entorno de trabajo de las aulas de laboratorio, el sistema searrancautilizandoREMBO.Esdecir,secargaunanuevaimagendelsistemaypor lo tanto todos tus ficherossepierdeny los ficherosdeconfiguracióndelsistema se reinicializan mediante una copia remota. Eso significa que sireinicias lasesiónempezarásatrabajarconelfichero.bashrcoriginalynoseconservarántuscambios.

    AlgunoscaracteresespecialesútilesdelaShellEnlasecciónanterioryahemosintroducidoelcarácter&,quesirveparaejecutaruncomandoensegundoplano.OtroscaracteresútilesdelaShellqueintroduciremosenestasesiónson:

    • *: La Shell lo substituye por cualquier grupo de caracteres (excepto el “.”). Porejemplo,siejecutamos(#grep prueba t*)veremosquelaShellsubstituyeelpatrónt* por la lista de todos los ficheros que empiezan por la cadena “t”. Los caracteresespecialesdelaShellsepuedenutilizarconcualquiercomando.

    • >: La salida de datos de los comandos por defecto está asociada a la pantalla. Siqueremos cambiar esta asociación, y que la salida se dirija a un fichero, podemoshacerlo con el carácter ”>”. A esta acción se le llama “redireccionar la salida”. Porejemplo,ls > salida_ls, guarda la salida de ls en el fichero salida_ls. Prueba aejecutarelcomandoanterior.Acontinuación,pruébaloconotrocomandoperoconelmismoficherodesalidaycompruebaelcontenidodelficherosalida_ls.

  • Página16de73

    • >>:Redireccionalasalidadedatosdeuncomandoaunficheroperoenlugardeborrarelcontenidodelficheroseañadealfinaldeloquehubiera.Repiteelejemploanteriorperocon“>>”enlugarde“>”paracomprobarladiferencia.

    PREGUNTA16. ¿Quédiferenciahayentreutilizar>y>>?

    HacerunacopiadeseguridadparalasiguientesesiónDado que en los laboratorios se carga una nueva imagen cada vez que arrancamos elordenador,esnecesariohacerunacopiadeseguridaddeloscambiosrealizadossiqueremosconservarlosparalasiguientesesión.Paraguardarloscambiospuedesutilizarelcomandotar.Porejemplo,siquieresgenerarun ficheroquecontengatodos los ficherosdeldirectorioS1,ademásdelfichero.bashrc,puedesejecutarelsiguientecomandodesdetudirectorioHOME:

    #tar zcvf carpetaS1.tar.gz S1/* .bashrc Finalmentedebes guardar este ficheroenun lugar seguro comopor ejemplounpendriveoenviárteloporcorreoelectrónico.

  • Página17de73

    Sesión2:EllenguajeCPreparaciónprevia

    ObjetivosEnestasesiónelobjetivoespracticarcontodolorelacionadoconlacreacióndeejecutables.En este curso utilizaremos lenguaje C. Practicaremos la corrección de errores tanto demakefilescomodeficherosCylageneracióndeejecutablesapartirdecero:ficherosfuente,makefileylibrerías.

    Habilidades• SercapazdecrearejecutablesdadouncódigoenC:

    o Creacióndeejecutablesyutilizacióndemakefilessencillos.

    • SercapazdecrearprogramasenCdesdecero:o Definicióndetiposbásicos,tablas,funciones,condicionalesybucles.o Utilizacióndepunteros.o Formateadoenpantalladelosresultadosdelosprogramas.o Programasbienestructurados,claros,robustosybiendocumentados.o Creaciónymodificacióndemakefiles sencillos: añadir reglasnuevasyañadir

    dependencias.o AplicacióndesangríasacódigofuenteenC.

    Conocimientosprevios• Programaciónbásica:tiposdedatosbásicos,tablas,sprintf.• Programaciónmedia:punterosenC,accesoalosparámetrosdelalíneadecomandos.

    Fases del desarrollo de un programa en C: Preprocesador/Compilador/Enlazador (olinkador).

    • Usodemakefilessencillos.

    Guíaparaeltrabajoprevio• Leerlaspáginasdemandelossiguientescomandos.Estoscomandostienenmúltiples

    opciones,leedconespecialdetallelasqueoscomentamosenlacolumna“Opciones”de la siguiente tabla. No es necesario leer las páginas de man completas de cadacomando sino su funcionamiento básico que podéis ampliar a medida que lonecesitéis.

    Para leer en elman

    Descripciónbásica Opciones

    make Utilidad para automatizar el proceso decompilación/linkajedeunprogramaogrupodeprogramas

  • Página18de73

    gcc CompiladordeCdeGNU -c,-o, –I (i mayúscula), –L,-l(eleminúscula)

    sprint Conversióndeformatoalmacenándolaenunbúffer

    atoi Convierteunstringaunnúmeroentero indent Indentacióndeficherosfuente

    • ConsultarelresumensobreprogramaciónenCqueestádisponibleen lapáginaweb

    delaasignatura:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/ejemplos/EsquemaProgramaC.pdf

    • Consultar el resumen sobre la comparación entre C y C++ que está disponible en lapáginawebdelaasignatura:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/Laboratorios/C++vsC.ppsx

    • Crealacarpeta$HOME/S2ysitúateenellapararealizarlosejercicios.• Bájate el fichero S2.tar.gz, descomprímelo con tar zxfv S2.tar.gz para obtener los

    ficherosdeestasesión.

    Duranteelcurso,utilizaremosdirectamentelasllamadasasistemaparaescribirenpantalla.LoqueenC++erauncout,aquíesunacombinacióndesprintf(funcióndelalibreríadeC)+write(llamadaasistemaparaescribir).

    LafunciónsprintfdelalibreríaestándardeCseutilizaparaformatearuntextoyalmacenarelresultadoenunbúffer.Elprimerparámetroeselbúffer,detipochar*,elsegundoparámetroesunacadenadecaracteresqueespecificael textoaguardarasícomoel formatoy tipodetodas las variables o constantes que se quieren incluir en la cadena, y a partir de ahí esasvariableso constantes (mirad los ejemplosqueosdamosenel resumendeC). Todo loqueescribamosenlapantalladebeserASCII,porloquepreviamentedeberemosformatearloconsprintf(exceptoenelcasodequeyaseaASCII).

    Posteriormentesetienequeutilizarlallamadaalsistemawriteparaescribirestebufferenundispositivo. Durante estas primeras sesiones escribiremos en la “salida estándar”, que pordefecto es la pantalla, o por la “salida estándar de error”, que por defecto también es lapantalla. En UNIX/Linux, los dispositivos se identifican con un número, que se suele llamarcanal.Lasalidaestándareselcanal1ylasalidaestándardeerroreselcanal2.Elnúmerodecanal es el primer parámetro de la llamada a sistemawrite. El resto de parámetros son ladireccióndondeempiezan losdatos(elbufferquehemosgeneradoconsprintf)yelnúmerodebytesquesequierenescribirapartirdeesadirección.Paraconocer la longituddel textoutilizaremosstrlen(funciónlibreríadeC).

    Unejemplodeutilizacióndesprintfpodríaser(utilizaelmanparaconsultarcómoespecificardiferentesformatos):

    char buffer[256]; sprintf(buffer, “Este es el ejemplo número %d\n”, 1); write(1, buffer, strlen(buffer));

    Quemuestraporlasalidaestándar:“Esteeselejemplonúmero1”.

  • Página19de73

    Solucionandoproblemasconelmakefile1. Modificaelficheromakefileparaquefuncione.

    • El makefile es el fichero que utiliza por defecto la herramienta make. Siejecutas“make”sinparámetros,elficheropordefectoesmakefile.

    • Para que el formato de un fichero makefile sea correcto debe seguir unformatocomoeste(TABsignificaquenecesitauntabulador).

    Porejemplo:

    2. Modifica el makefile para que la regla listaParametros tenga bien definidas sus

    dependencias.Losficherosejecutablesdependendelosficherosfuenteapartirdeloscuales se generan (o ficheros objeto si separamos la generación del ejecutable encompilaciónymontaje).

    3. Modificaelmakefileparaqueelficherodesalidanoseaa.outsinolistaParametros.4. Creaunacopiadelmakefile,llamándolamakefile_1,paraentregarla.

    Solucionandoproblemasdecompilación• Solucionatodosloserroresdecompilaciónqueaparezcan.Siempreesrecomendable

    solucionarloserroresenelordenenelqueaparecen.

    Elcompiladorsiempredamensajesindicandodondesehaproducidoelerror,enquélíneadecódigo,ycuáleselerror.Enestecasoconcretotenemoselsiguientecódigo:

    Yloserroresson(sonerroresmuytípicos,poresoloshemospuesto):

    Target:dependecia1dependencia2..dependenciaN[TAB]comogenerarTargetapartirdelasdependencias

    P1:P1.c gcc–oP1P1.c

    1. voidmain(intargc,char*argv[])2. {3. charbuf[80];4. for(i=0;i

  • Página20de73

    Elprimeroindicaquehayunavariable(ienestecaso)sindeclararenlalínea4.Lalínea4esdondeseutiliza.Sitefijas,usamoslaienelbucleperonoestádeclarada.Enlaslíneas5y6utilizamosunasfunciones(sprintfystrlen)quenohemosdeclarado.Elcompiladornolasencuentraynopuedasabersisoncorrectas.EstasfuncionesestándefinidasenlalibreríadeCqueseañadealgenerarelbinario,peroelcompiladornecesitalacabeceraparaversiseusacorrectamente.Consultaelmanparaverqueficherosdecabecera(.h)esnecesarioincluir.Lalínea 7 nos indica que tenemosuna función (elmain) que acaba conun return 0 cuando lahabíamos declarado como un void. Lo normal es definir el main como una función quedevuelveunint.Elúltimoerrorsueleaparecercuandohayunerrorquesehapropagado.Enestecaso,faltabacerrarunallave(ladelfor).

    • Asegúrate de que el directorio “.” aparece en la variable PATH de forma que seencuentrenlosejecutablesqueesténeneldirectorioactual.

    AnalizayentiendeelficherolistaParametros.c.SinosabesprogramarenCleelosdocumentosrecomendadosantesdehacerestosejercicios.

    • LaprimerafuncióndeunprogramaescritoenCqueseejecutaeslarutinamain.• Larutinamaintienedosparámetrosquesellamanargcyargv.Elparámetroargc

    esunenteroquecontieneelnúmerodeelementosdelarrayargv.Yargvesunarraydestringsquecontienelosparámetrosdeentradaqueelprogramarecibealponerseen ejecución. Existe la convención de tratar el nombre del ejecutable como primerparámetro.Por lo tantosi sesigueesaconvenciónargc siempreserámayoro igualqueunoyelprimerelementodeargvseráelnombredeeseejecutable(laShellsigueesaconvenciónparatodoslosprogramasqueponeenejecución).

    • CompilalistaParametros.cparaobtenerelejecutablelistaParametros,yejecútalocondiferentesparámetros(tipoynúmero),porejemplo:

    #./listaParametros #./listaParametros a #./listaParametros a b #./listaParametros a b c #./listaParametros 1 2 3 4 5 6 7

    listaParametros.c: In function “main”: listaParametros.c:4: error: “i” undeclared (first use in this function) listaParametros.c:4: error: (Each undeclared identifier is reported only once listaParametros.c:4: error: for each function it appears in.) listaParametros.c:5: warning: incompatible implicit declaration of built-in function “sprintf” listaParametros.c:6: warning: incompatible implicit declaration of built-in function “strlen” listaParametros.c:7: warning: “return” with a value, in function returning void listaParametros.c:8: error: syntax error at end of input

  • Página21de73

    ¿Quévalorescontienenargcyelvectorargvencadaunodelosejemplos?Fíjate,queaunque pasemos números como parámetro, los programas los reciben SIEMPREcomounacadenadecaracteres.

    Elsistemaoperativoeselencargadoderellenarambosparámetros(argcyargv)usandolosdatosintroducidosporelusuario(loveremoseneltema2deteoría).

    Analizadetenidamenteyentiendeelficheropunteros.c.Elobjetivoesqueasimilesloquesignificadeclararunavariabledetipopuntero.Unpunteroseutilizaparaguardarsimplementeunadireccióndememoria.Yenesadireccióndememoriahayunvalordeltipoindicadoenladeclaracióndelpuntero.Aquítienesunejemploconelcasoconcretodepunterosaenteros.

    • Creaunficheronumeros.cyañadeunafunciónquecompruebequeunstring(enCsedefine como un “char *” o como un vector de caracteres, ya que no existe el tipo“string”)1querecibecomoparámetrosólocontienecaracteresASCIIentreel‘0’yel‘9’(además del ‘\0’ al final y potencialmente el ‘-‘ al principio para los negativos). LafunciónhadecomprobarqueelparámetropunteronoseaNULL.Lafuncióndevuelve1sielstringrepresentaunnúmeroytienecomomucho8cifras(defineunaconstanteque llamaremos MAX_SIZE y utilízala), y 0 en cualquier otro caso. La función debetenerelsiguienteprototipo:

    o intesNumero(char*str);• Paraprobar la función esNumero, añade la funciónmain al ficheronumeros.c y haz

    que ejecute la función esNumero pasándole todos los parámetros que reciba elprograma.Escribeunmensajeparacadaunoindicandosiesunnúmeroono.

    • CreaunMakefileparaesteprograma• Utilizaindentparaindentarelficheronumeros.c(#indentnumeros.c).• PARAENTREGAR:previo02.tar.gz

    #tarzcfvprevio02.tar.gznumeros.cMakefilelistaParametros.cmakefile_1

    1Ladefiniciónyutilizaciónde“strings”esbásica.Sinoentiendescomofuncionaacláraloconelprofesordelaboratorio

    char buffer[128]; int A; // Esto es un entero int *PA; // Esto es un puntero a entero (esta sin inicializar, no se

    // puede utilizar) PA=&A; // Inicializamos PA con la direccion de A *PA=4; // Ponemos un 4 en la posicion de memoria que apunta PA if (*PA==A) { sprint(buffer,”Este mensaje deberia salir siempre!\n”); }else{ sprint(buffer,”Este mensaje NO deberia salir NUNCA!\n”); } write(1,buffer,strlen(buffer));

  • Página22de73

    Bibliografía

    • TutorialdeprogramaciónenC:http://www.elrincondelc.com/cursoc/cursoc.html• ResumensobreprogramaciónenC:

    http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/ejemplos/EsquemaProgramaC.pdf

    • ComparaciónentreCyC++:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/Laboratorios/C++vsC.ppsx

    Bibliografíacomplementaria

    • ProgramaciónenC:o ProgrammingLanguage.Kernighan,BrianW.;Ritchie,DennisM.PrenticeHallo CursointeractivodeC:http://labsopa.dis.ulpgc.es/cpp/intro_c.

    • Makefiles:o http://es.wikipedia.org/wiki/Makeo http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

    • GNUCodingStandardso http://www.gnu.org/prep/standards/standards.html, especialmenteel punto:

    http://www.gnu.org/prep/standards/standards.html#Writing-C

    Ejerciciosarealizarenellaboratorio

    Ø Paratodoslosejercicios,seasumequesemodificaráelmakefilecuandoseanecesarioyseprobarántodoslosejerciciosquesepiden.

    Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecenen el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

    Ø Paraentregar:sesion02.tar.gz

    #tar zcfv sesion02.tar.gz entrega.txt makefile_1 listaParametros.c makefile_4mis_funciones.hmis_funciones.csuma.cpunteros.cmakefile_5words.cmakefile

    ComprobandoelnúmerodeparámetrosA partir de este ejercicio, haremos que todos nuestros programas sean robustos y usablescomprobandoqueelnúmerodeparámetrosquerecibenseacorrecto.Encasodequeno losea, los programas (1) imprimiránunmensaje quedescriba cómousarlos, (2) una líneaquedescriba su funcionalidad, y (3)acabarán laejecución.Es loque se conocecomoañadirunafunciónusage().

    1. Implementa una función que se encargue de mostrar el mensaje descriptivo de

    utilización del programa listaParametros y acabe la ejecución del programa (llama aestafunciónUsage()).ModificaelprogramalistaParametrosparaquecompruebeque

  • Página23de73

    por lo menos hay 1 parámetro y en caso contrario invoque a la función Usage().Recuerdaqueelnombredelejecutableseconsideraunparámetromásyasísereflejaenlasvariablesargcyargv.

    Ejemplodecomportamientoesperado:

    #listaParametros a b El argumento 0 es listaParametros El argumento 1 es a El argumento 2 es b #listaParametros Usage:listaParametros arg1 [arg2..argn] Este programa escribe por su salida la lista de argumentos que recibe

    Procesadodeparámetros2. Creaunacopiadenumeros.c(trabajoprevio)llamadasuma.c.3. Añadeotrafunciónalsuma.cqueconviertauncarácteranúmero(1cifra).Lafunción

    asumequeelcaráctersecorrespondeconelcarácterdeunnúmero.

    unsigned int char2int(char c); 4. Modificasuma.cañadiendounafunciónmi_atoiquerecibacomoparámetrounstring

    y devuelva un entero correspondiente al string convertido a número. Esta funciónasume que el string no es un puntero a NULL, pero puede representar un númeronegativo. Si el string no contiene un número correcto el resultado es indefinido. ElcomportamientodeestafuncióneselmismoqueeldelafunciónatoidelalibreríadeC.Utilizalafunciónchar2intdelapartadoanterior.

    int mi_atoi(char *s); 5. Modificasuma.cparaquesecomportedelasiguientemanera:Despuésdecomprobar

    que todos los parámetros son números, los convierte a int, los suma y escribe elresultado.ModificatambiénelMakefileparaquecreeel ficheroejecutablesuma.Lasiguientefiguramuestraunejemplodelfuncionamientodelprograma:

    #suma 100 2 3 4 100 La suma es 209 #suma -1 1 La suma es 0 #suma 100 a Error: el parámetro “a” no es un número

    6. Creaunacopiadelmakefile,llamándolamakefile_4,paraentregarla.

    UsamoselpreprocesadordeC:Dividimoselcódigo(#include)Queremos separar las funcionesauxiliaresquevamos creandode losprogramasprincipales,de forma que podamos reutilizarlas cuando las necesitemos. En C, cuando queremosencapsularunafunciónounconjuntodefunciones,lonormalescreardostiposdeficheros:

    Ejemplodeusocorrecto

    Ejemplodeusoincorrecto

  • Página24de73

    • Ficheroscabecera(“include”).Sonficherosdetextoconextensión“.h”quecontienenprototiposdefunciones(cabeceras),definicionesdetiposdedatosydefinicionesdeconstantes.Estosficherosson“incluidos”porelpreprocesadormediante ladirectiva#include en el lugar exacto en que aparece la directiva, por lo que laposición es importante. Añadir un fichero “.h” es equivalente a copiar y pegar elcódigodel ficheroenel lugardondeestá ladirectiva#includeysuúnicoobjetivoesfacilitar la legibilidad ymodularidaddel código. Lo correctoesponer en los ficherosincludeaquellosprototiposde funciones, tiposdedatos y constantesquequeramosusarenmásdeunfichero.

    • Ficheros auxiliares, ficheros objeto o librerías. Estos ficheros contienen lasdefinicionesdevariablesglobalesquenecesitenlasfuncionesauxiliares(sinecesitanalguna) y la implementación de estas funciones. Podemos ofrecer el fichero “.c”directamente,elficheroobjetoyacompilado(sinoqueremosofrecerelcódigofuente)o,encasodetenermásdeunficheroobjeto,juntarlostodosenunalibrería(archiveconelcomandoar).

    7. Separa las funciones realizadas en los ejercicios anteriores (excepto el main) en unfichero aparte (mis_funciones.c) y crea un fichero de cabeceras (mis_funciones.h),dondedefinas lascabecerasdelasfuncionesqueofreces,e inclúyeloenelprogramasuma.c.Añadeunapequeñadescripcióndecada función juntoalprototipo (añádelocomo comentario). Modifica el makefile añadiendo una nueva regla para crear elficheroobjetoymodificalaregladelprogramasumaparaqueahorasecreeutilizandoesteficheroobjeto.Añadelasdependenciasquecreasnecesarias.

    8. Modifica la función Usage de forma que como mínimo el programa suma reciba 2parámetros.

    9. Creaunacopiadelmakefile,llamándolamakefile_5,paraentregarla

    PREGUNTA17. ¿Qué opción has tenido que añadir al gcc para generar el fichero objecto?¿Quéopciónhas tenidoqueañadir al gccparaqueel compiladorencuentreel ficheromis_funciones.h?

    TrabajandoconpunterosenC10. Mira el código del programa punteros.c. Modifica el makefile para compilarlo y

    ejecútalo.Analizaelcódigoparaentendertodoloquehace.11. Crea un programa llamadowords.c que acepta un único parámetro. Este programa

    cuenta el númerode palabras quehay en el string pasado comoprimer parámetro.Consideraremos que empieza una nueva palabra después de: un espacio, un punto,unacomayunsaltodelínea(\n).Elrestodesignosdepuntuaciónnosetendránencuenta.Unejemplodefuncionamientosería:

    #words hola 1 palabras #words “Esta es una frase.” 4 palabras #words “Este parámetro lo trata” “este parámetro no lo trata” 4 palabras

  • Página25de73

    12. Modificaelmakefileparacompilarymontarwords.c

  • Página26de73

    Sesión3:ProcesosPreparaciónprevia

    ObjetivosLos objetivos de esta sesión sonpracticar con las llamadas a sistemabásicas para gestionarprocesos, y los comandos y mecanismos básicos para monitorizar información de kernelasociadosalosprocesosactivosdelsistema.

    Habilidades• AniveldeusuarioBÁSICO:

    o Sercapazdehacerunprogramaconcurrenteutilizandolasllamadasasistemadegestióndeprocesos:fork,execlp,getpid,exit,waitpid.

    o Entenderlaherenciadeprocesosylarelaciónpadre/hijo.• AniveldeadministradorBÁSICO:

    o Sercapazdeverlalistadeprocesosdeunusuarioyalgúndetalledesuestadomediantecomandos(ps,top).

    o Empezaraobtenerinformaciónatravésdelpseudo-sistemadeficheros/proc.

    Guíaparaeltrabajoprevio• Consulta el vídeo sobre creación de procesos que tienes en la página web de la

    asignatura:http://docencia.ac.upc.edu/FIB/grau/SO/enunciados/ejemplos/EjemploCreacionProcesosVideo.wmv

    • Lee las páginas demanual de las llamadas getpid/fork/exit/waitpid/execlp. Entiendelosparámetros,valoresderetornoyfuncionalidadbásicaasociadaalateoríaexplicadaenclase.Fíjatetambiénenlosincludesnecesarios,casosdeerroryvaloresderetorno.Consultaladescripciónylasopcionesindicadasdelcomandopsydelpseudo-sistemadeficheros/proc.

    Para leer en elman

    Descripciónbásica Parámetros/argumentosprincipales quepracticaremos

    getpid RetornaelPIDdelprocesoquelaejecuta

    fork Crea un proceso nuevo, hijo del que laejecuta

    exit Terminaelprocesoqueejecutalallamada waitpid Esperalafinalizacióndeunprocesohijo

    execlp Ejecuta un programa en el contexto delmismoproceso

    perror Escribe un mensaje del último error

  • Página27de73

    producidops Devuelveinformacióndelosprocesos -a,-u,-oproc Pseudo-file system que ofrece información

    dedatosdelkernelcmdline, cwd, environexe,status

    • Creaeldirectoriodelentornodedesarrolloparaestasesión($HOME/S3).• Descarga el fichero S3.tar.gz y descomprímelo en el directorio que has creado para

    obtenerlosficherosdeestasesión(tarzxvfS3.tar.gz).• Crea un fichero de texto llamado previo.txt y escribe en él la respuesta a todas las

    preguntas.• AnalizaelcódigodelosprogramasdeejemployelficheroMakefile.ejemplos

    o El fichero Makefile.ejemplos está preparado para compilar todos losprogramasexceptoejemplo_fork7.c

    • Compila todos los programas, excepto ejemplo_fork7, usando el ficheroMakefile.ejemplos(verficheroREADME_S3).

    • Ejecutaejemplo_fork1o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplica

    quéprocesomuestracadauno(padreohijo)yporqué.• Ejecutaejemplo_fork2

    o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplicaquéprocesomuestracadauno(padreohijo)yporqué.

    • Ejecutaejemplo_fork3o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplica

    quéprocesomuestracadauno(padreohijo)yporqué.• Ejecutaejemplo_fork4

    o ¿Enquéordenaparecenenpantallalosmensajes?¿Quéprocesoacabaanteslaejecución?

    o Modificaelcódigodeesteprogramaparaqueelpadrenoescribaelúltimomensajedesucódigohastaquesuhijohayaacabadolaejecución.

    • Ejecutaejemplo_fork5o Escribeenelficheroprevio.txtlosmensajesqueaparecenenpantallayexplica

    quéprocesomuestracadauno(padreohijo)yporqué.o Modificaelcódigodeesteprograma,paraqueelprocesohijomodifiqueel

    valordelasvariablesvariable_localyvariable_globalantesdeimprimirsuvalor.Compruebaqueelpadresigueviendoelmismovalorqueteníanlasvariablesantesdehacerelfork.

    • Ejecutaejemplo_fork6,redireccionandosusalidaestándaraunficheroo Describeelcontenidodelficherodesalidao ¿Podemosasegurarquesiejecutamosvariasvecesesteprogramael

    contenidodelficherosalidaseráexactamenteelmismo?¿Porqué?• ModificaelficheroMakefile.ejemplosparaañadirlacompilacióndeejemplo_fork7.c

    yutilízaloparacompilarloahora.

  • Página28de73

    o ¿Porquénocompilaelprogramaejemplo_fork7.c?¿Tienealgoqueverconelhecho de crear procesos? ¿Cómo se puede modificar el código para queescribaelvalordela“variable_local”?

    • Ejecutaejemplo_exec1o Describeelcomportamientodeesteprograma.¿Quévesenpantalla?

    ¿Cuántasvecesapareceenpantallaelmensajeconelpiddelproceso?¿Aquésedebe?

    • Ejecutaejemplo_exec2o Describeelcomportamientodeestecódigo.¿Quémensajesaparecenen

    pantalla?¿Cuántosprocesosseejecutan?

    • Consulta en el man a qué sección pertenecen las páginas del man que habéisconsultado. Además, apunta aquí si se ha consultado alguna página adicional delmanualalasquesehanpedidoexplícitamente.

    • PARAENTREGAR:previo03.tar.gz

    #tar zcfv previo03.tar.gz Makefile.ejemplos ejemplo_fork4.c ejemplo_fork5.cejemplo_fork7.cprevio.txt

    Ejerciciosarealizarenellaboratorio

    Ø Paratodoslosejercicios,seasumequerealizastodoslospasosinvolucrados.Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecen

    en el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

    Ø Paraentregar:sesion03.tar.gz

    #tar zcfv sesion03.tar.gz entrega.txt makefile myPS_v0.c myPS.c myPS2.c myPS3.cparsExec.c.

    Comprobacióndeerroresdelasllamadasasistema 1. A partir de ahora se incluirá siempre, para TODAS las llamadas a sistema, la

    comprobación de errores. Utiliza la llamada perror (man 3 perror) para escribir unmensajequedescribaelmotivoquehaproducidoelerror.Además,encasodequeelerrorseacrítico,comoporejemploquefalleunforkounexeclp,tienequeterminarlaejecucióndelprograma.Lagestióndelerrordelasllamadasasistemapuedehacersedeformasimilaralsiguientecódigo:

    int main (int argc,char *argv[]) { …

    if ((pid=fork())

  • Página29de73

    Creaciónymutacióndeprocesos:myPS.cElobjetivodeestasecciónespracticarconlasllamadasasistemadecreaciónydemutacióndeprocesos.Loscódigosquedesarrollarásenestasesiónteserviráncomobasedeltrabajodelassiguientessecciones.

    CreaciónymutacióndeprocesosElobjetivodeestasecciónespracticarconlasllamadasasistemadecreaciónymutacióndeprocesos.Paraellovasacreardoscódigosdiferentes:myPS.cymyPS_v0.c.Estoscódigosnosserviráncomobaseparalosejerciciosdelassiguientessecciones.

    2. CreaunprogramallamadomyPS.cquerecibaunparámetro(queseráunnombrede

    usuario:root,alumne,etc.)yquecreeunprocesohijo.Elprocesopadreescribiráunmensaje indicando su PID. El proceso hijo escribirá un mensaje con su PID y elparámetro que ha recibido el programa. Después de escribir el mensaje, ambosprocesos ejecutarán un bucle “while(1);” para que no terminen (este bucle loañadimosporqueusaremos este código en la siguiente sección sobre la consulta deinformacióndelosprocesos,yenesasecciónnosinteresaquelosprocesosnoacabenlaejecución).

    3. Crea un makefile, que incluya las reglas “all” y “clean”, para compilar y montar elprogramamyPS.c.

    PREGUNTA18. ¿Cómo puede saber un proceso el pid de sus hijos? ¿Qué llamada puedenutilizarlosprocesosparaconsultarsupropioPID?

    4. Copia el código de myPS.c en una versión myPS_v0.c. Modifica el Makefile paracompilarmyPS_v0.c

    5. ModificamyPS.cparaqueelprocesohijo,despuésdeescribirelmensaje,ejecute lafunciónmuta_a_PS.Estafunciónmutaráalprogramaps.Añadetambiénelcódigodelafunciónmuta_a_PS:

    PREGUNTA19. ¿Enquécasosseejecutarácualquiercódigoqueaparezcajustodespuésdela

    llamadaexeclp(Encualquiercaso/Encasoqueelexeclpseejecutedeformacorrecta/Encasoqueelexclpfalle)?

    /* Ejecuta el comando ps –u username mediante la llamada al sistema execlp */ /* Devuelve: el código de error en el caso de que no se haya podido mutar */ void muta_a_PS(char *username) { execlp(“ps”, “ps”, “-u”, username, (char*)NULL); error_y_exit(“Ha fallado la mutación al ps”, 1); }

  • Página30de73

    Consultadelainformacióndelosprocesosenejecución:myPS.cElobjetivodeestasecciónaprenderautilizarel/procparaconsultaralgunainformaciónsobrela ejecuciónde losprocesos. Paraelloutilizaremos los códigosmyPS.c ymyPS_v0.cquehasdesarrolladoenlasecciónanterior.

    6. ParaesteejerciciovamosautilizardosterminalesdelaShell.EnunaejecutamyPSconun solo username comoparámetro. En la segunda ventana ves al directorio /proc ycompruebaqueaparecenvariosdirectoriosquecoincidenconlosnúmerosdePIDsdelos procesos. Entra en el directorio del padre y de su hijo y mira la informaciónextendida(permisos,propietario,etc.)delosficherosdeldirectorio.

    PREGUNTA20. ¿Qué directorios hay dentro de /proc/PID_PADRE? ¿Qué opción de ls hasusado?

    PREGUNTA21. Paraelprocesopadre,apuntaelcontenidodelosficherosstatusycmdline.Comparaelcontenidodel ficheroenvironconel resultadodelcomandoenv(fíjateporejemploenlavariablePATHylavariablePWD)¿Quérelaciónhay?Buscaenelcontenidodelficherostatuselestadoenelqueseencuentraelprocesoyapúntaloenelficheroderespuestas. Anota también el tiempo de CPU que ha consumido en modo usuario(búscaloenelficherostatdelproceso).

    PREGUNTA22. Enelcasodelprocesohijo,¿aquéficheros“apuntan”losficheroscwdyexe?¿Cuálcreesqueeselsignificadodecwdyexe?

    PREGUNTA23. En el caso del proceso hijo, ¿puedes mostrar el contenido de los ficherosenviron,statusycmdlinedelprocesohijo?¿Enquéestadoseencuentra?

    7. Repite el experimento utilizando el programa myPS_v0.c en lugar de myPS.c yrespondedenuevoa laspreguntasparaelprocesohijo.Observa lasdiferenciasquehay entre ambas versiones del código. Recuerda que en la v0 el proceso hijo nomutaba.

    PREGUNTA24. Enelcasodelprocesohijo,¿aquéficheros“apuntan”losficheroscwdyexe?¿Cuál crees que es el significado de cwd y exe? ¿Qué diferencias hay con la versiónanterior?¿Aquésedeben?

    PREGUNTA25. En el caso del proceso hijo, ¿puedes mostrar el contenido de los ficherosenviron, status y cmdline del proceso hijo? ¿En qué estado se encuentra? ¿Quédiferenciashayconlaversiónanterior?¿Aquésedeben?

    Ejecuciónsecuencialdeloshijos:myPS2.cEl objetivo de esta sección es practicar con la llamada a sistema waitpid y entender cómoinfluye en la concurrencia de los procesos creados. En particular la vas a utilizar para crearprocesosqueseejecutendemanerasecuencial.

    Esta llamadasirveparaqueelprocesopadreespereaquesusprocesoshijosterminen,paraquecompruebesuestadodefinalizaciónyparaqueelkernel libere lasestructurasdedatosquelosrepresentaninternamente(PCBs).Ellugardondeseproducelaesperaesdeterminanteparageneraruncódigosecuencial (todos losprocesoshijossecreanyejecutande1en1)oconcurrente (todos los procesos hijos se crean y se ejecutan de forma potencialmente

  • Página31de73

    paralela,dependiendodelaarquitecturaenlaqueloejecutemos).Enestasecciónqueremoshacer un código secuencial. Para ello utilizaremos la llamada al sistema waitpid entre unacreacióndeprocesoy la siguiente,de formaqueaseguramosqueno tendremos2procesoshijosejecutándosealavez.

    8. Creauna copiademyPS.c, llamadamyPS2.c, con la que trabajarás en este ejercicio.Modifica,también,elmakefileparapodercompilarymontarmyPS2.c.

    9. Modifica myPS2.c para que, en lugar de recibir un parámetro (username), puedarecibirN.Hazqueelprogramaprincipalcreeunprocesoparacadausernameyqueseejecuten de manera secuencial. Puedes eliminar el bucle infinito del final de laejecucióndelprocesopadre.

    Ejecuciónconcurrentedeloshijos:myPS3.cEn esta sección se continúa trabajando con la llamada a sistemawaitpid. Ahora la utilizarásparacrearunesquemadeejecuciónconcurrente.

    Aprovecharemos también para comprobar los posibles efectos que puede tener laconcurrenciasobreelresultadodelaejecución.

    10. CreaunacopiademyPS2.c, llamadamyPS3.c,conlaquetrabajarásenesteejercicio.ModificatambiénelmakefileparapodercompilarymontarmyPS3.

    11. ModificaelprogramamyPS3.cparaqueloshijossecreendeformaconcurrente.Parapoderconsultarlainformacióndelosprocesos,hazqueelpadresequedeesperandounatecladespuésdeejecutarelbucledewaitpid.Paraesperarunateclapuedesusarlallamadaasistemaread(read(1,&c,sizeof(char)),dondecesunchar).

    //Ejemplo esquema secuencial for (i=0;i

  • Página32de73

    12. EjecutamyPS3convariosusernamesydejaalpadrebloqueadodespuésdelbucledewaitpids.Enotraventanacompruebaqueningúnprocesohijotieneundirectorioen/proc.Compruebatambiénelestadoenelqueseencuentraelprocesopadre.

    PREGUNTA26. Comprueba el fichero status de /proc/PID_PADRE. ¿En qué estado está elprocesopadre?

    13. Para comprobar el efectode la ejecución concurrente, y ver que la planificacióndelsistemageneraresultadosdiferentes,ejecutavariasveceselcomandomyPS3conlosmismosparámetrosyguardarlasalidaendiferentesficheros.Compruebasielordenen que se ejecutan los ps’s es siempre el mismo. Piensa que es posible que variosresultadosseaniguales.

    PREGUNTA27. ¿QuéhashechoparaguardarlasalidadelasejecucionesdemyPS3?

    PasodeparámetrosalosejecutablesatravésdelexeclpElobjetivodeestasecciónesentenderlarelaciónentrelosparámetrosrecibidosporelmaindeunejecutabley losparámetrospasadosala llamadaasistemaexeclp.Recordad: larutinamain recibedosparámetros:argc,de tipoentero, yargvde tipoarrayde strings.El sistemaoperativorellenaelparámetroargcconelnúmerodeelementosquetieneargv,yrellenaargvconlosparámetrosqueelusuarioindicaenlallamadaasistemaexeclp(quetienenqueserdetipo string). Para seguir lamisma convención que utiliza la Shell, se tiene que hacer que elprimerparámetroseaelnombredelejecutablealquesevaamutar.

    14. ElprogramalistaParametrosquetrabajamosenlasesión2,simplementemuestraporpantalla los parámetros que recibe. Escribe un programa parsExec.c que cree 4procesos hijos. Una vez creados, el proceso padre sólo tiene que esperar hasta quetodos los hijos acaben. Cada proceso hijo sólo tiene que mutar al ejecutablelistaParametros, cada uno pasando unos parámetros diferentes, de manera que, alejecutarparsExec,enlapantallasetienenqueverlossiguientesmensajes(elordendelos mensajes da igual y puede ser diferente para cada ejecución). Cada grupo demensajescorrespondeconlasalidadeunprocesodelosquemutan:

    El argumento 0 es listaParametros El argumento 1 es a El argumento 2 es b Usage:listaParametros arg1 [arg2..argn] Este programa escribe por su salida la lista de argumentos que recibe El argumento 0 es listaParametros El argumento 1 es 25 El argumento 2 es 4 El argumento 0 es listaParametros El argumento 1 es 1024 El argumento 2 es hola El argumento 3 es adios

    15. Modifica el makefile para poder compilar y montar parsExec.c.

  • Sesión4:ComunicacióndeprocesosPreparaciónprevia

    1. ObjetivosDuranteestasesiónintroduciremoslagestióndeeventosentreprocesoscomomecanismodecomunicación y sincronización entre procesos. También se trabajarán aspectos relacionadosconlaconcurrenciadeprocesos.

    2. Habilidades• Sercapazdereprogramar/esperar/enviareventosutilizandolainterfazdeUNIXentre

    procesos.Practicaremoscon:sigaction/sigsuspend/alarm/kill.• Sercapazdeenviareventosaprocesosutilizandoelcomandokill.

    3. ConocimientospreviosLos signals o eventos pueden ser enviados por otros procesos o enviados por el sistemaautomáticamente, por ejemplo cuando acaba un proceso hijo (SIGCHLD) o acaba eltemporizadordeunaalarma(SIGALRM).

    CadaprocesotieneunatablaensuPCBdondesedescribe,paracadasignal,quéacciónhayquerealizar,quepuedeser:Ignorarelevento(notodospuedenignorarse),realizarlaacciónpordefectoquetengaelsistemaprogramadaparaeseevento,oejecutarunafunciónqueelprocesohayadefinidoexplícitamentemediantela llamadaasistemasigaction.Lasfuncionesdetratamientodesignaldebentenerlasiguientecabecera:

    Cuandoelprocesorecibeunsignal,el sistemapasaaejecutarel tratamientoasociadoaesesignal para ese proceso. En el caso de que el tratamiento sea una función definida por elusuario,lafunciónrecibecomoparámetroelnúmerodesignalquehaprovocadosuejecución.Estonospermiteasociarunamismafunciónadiferentestiposdesignalyhaceruntratamientodiferenciadodentrodeesafunción.

    4. GuíaparaeltrabajoprevioCon unos ejemplos veremos, de forma sencilla, como programar un evento, como enviarlo,que sucede con la tabla de programación de signals al hacer un fork, etc. Para esta sesiónrepasalosconceptosexplicadosenclasedeteoríasobreprocesosysignals.Leelaspáginasdelmanrelacionadasconeltemaqueseindicanenlasiguientetabla.

    void nombre_funcion( int numero_de_signal_recibido );

  • Página34de73

    Paraleerenelman Descripciónbásica Opcionessigaction Reprograma la acción asociada a un evento

    concreto

    kill (llamada a sistema)

    Envíauneventoconcretoaunproceso

    sigsuspend Bloqueaelprocesoquelaejecutahastaquerecibeun signal (los signals cuyo tratamiento es serignoradonodesbloqueanelproceso)

    sigprocmask Permite modificar la máscara de signalsbloqueadosdelproceso

    Alarm ProgramaelenvíodeunsignalSIGALRMalcabodeNsegundos

    Sleep FuncióndelalibreríadeCquebloqueaalprocesoduranteeltiempoqueselepasacomoparámetro

    /bin/kill (comando)

    Envíauneventoaunproceso -L

    Ps Muestra información sobre los procesos delsistema

    -opid,s,cmd,time

    Waitpid Esperalafinalizacióndeunproceso WNOHANG

    Bájate el fichero S4.tar.gz y descomprímelo (tar zxvf S4.tar.gz). Compila los ficheros yejecútalos. En el fichero README que encontrarás hay una pequeña descripción de lo quehacen y cómo compilarlos. Intenta entenderlos y comprender cómo se usan las llamadas asistemaquepracticaremosantesdeirallaboratorio.Losficherosestáncomentadosdeformaqueentiendasloqueseestáhaciendo.

    Los signals queprincipalmente vamos a usar son SIGALRM (alarma, temporizador), SIGCHLD(fin de un proceso hijo), o SIGUSR1/SIGUSR2 (sin significado predefinido, para que elprogramador pueda usarlos con el significado que le convenga). Mírate las acciones pordefectodeestossignals.

    Realizalassiguientespruebasantesdeirallaboratorio.Creaunficherollamadoentrega.txtyescribeenéllasrespuestasalassiguientespreguntas(indicandosunúmero).

    Sobre alarm1: recepción de diferentes tipos de signals y envío de eventosdesdelaconsola

    1. Ejecutaalarm1enunaconsolayobservasucomportamiento.¿Quéocurrecuandopasan5segundos?

    2. Ejecutadenuevoalarm1yantesdequeacabeel temporizadorenvíaleunsignaldetipoSIGKILL.Paraello,enotroterminalejecutaelcomandopsparaobtenerelpiddelprocesoy a continuación utiliza el comando kill con la opción “–KILL” para enviar al proceso elsignal SIGKILL. ¿El comportamiento es elmismo que si esperas que llegue el SIGALRM?¿Recibesunmensajediferenteenelterminal?

    Recuerda que el Shell es el encargado de crear el proceso que ejecuta los comandos queintroducesyrecogerelestadodefinalizacióndeeseproceso.Elpseudo-códigodelShellparaejecutaruncomandoenprimerplanoeselsiguiente:

  • Página35de73

    3. ¿Quéprocesoseencargademostrarlosmensajesqueaparecenenpantallacuandomuereelprocesoalarm1?¿Conquéllamadaasistemaelshellrecogeelestadodefinalizacióndelprocesoqueejecutaalarm1cuandoéstetermina?

    4. ¿Esnecesarioelexitquehayenelcódigodealarm1?¿Seejecutaenalgúncaso?

    Sobrealarm2:cualquiersignalsepuedeenviardesdeelShell.

    1. Ejecutaalarm2enun terminal.Abreotro, averiguaelpiddelprocesoalarm2yutilizaelcomando kill para enviarle el signal “–ALRM” varias veces. ¿Qué comportamientoobservas?¿Elcontroldetiempohafuncionadocomopretendíaelcódigo?

    2. ¿Sepuedemodificareltratamientoasociadoacualquiersignal?

    3. Mira en elman (man alarm) el valor de retornode la llamada a sistemaalarmy piensacómopodríamosarreglarelcódigoparadetectarcuándounSIGALRMnos llegasinestarrelacionadoconeltemporizador.

    Sobrealarm3:latabladeprogramacióndesignalssehereda.

    1. ¿Quién recibe los SIGALRM: el padre, el hijo o los dos? ¿Cómo lo has comprobado?Modifica la función “funcion_alarma” para que en el mensaje que se escribe aparezcatambiénelpiddelproceso,deformaquepodamosverfácilmentequéprocesorecibelossignals.

    Sobrealarm4:losSIGALRMsonrecibidosúnicamenteporelprocesoqueloshagenerado

    1. ¿CuántosSIGALRMSprogramacadaproceso?¿Quiénrecibecadaalarma:Elpadre,elhijo,losdos?¿Quélepasaalpadre?¿Cómolohascomprobado?Modificaelcódigodeformaquelaprimeraalarmalaprogrameelpadreantesdefork(yelhijono),yobservacómoelhijosequedaesperandoenlallamadasigsuspend.

    Sobreejemplo_waitpid:envíodesignalsmediantellamadaasistema,gestióndelestadodefinalizacióndeloshijosydesactivacióndeltemporizador.

    1. Analiza el código de este programa y ejecútalo. Observa que dentro del código de losprocesoshijosseutilizauntemporizadorparafijarsutiempodeejecuciónaunsegundo.

    2. Modifica el código para que el proceso padre al salir del waitpid muestre en salidaestándarunmensajedescribiendolacausadelamuertedelhijo(haacabadoconunexitohamuertoporqueharecibidounsignal).

    3. Completa el programa para limitar el tiempomáximo de espera en el waitpid en cadaiteracióndelbucle:sialcabode2segundosningúnhijohaacabadolaejecución,elpadre

    while (1) { comando = leer_comando(); pid_h = fork(); if (pid_h == 0) execlp(comando,….); } waitpid (pid_h, &status, 0); }

  • Página36de73

    deberá enviarle un SIGKILL a todos sus hijos vivos. En caso de que algún hijo acabe atiempo, el padre desactivará el temporizador y mostrará un mensaje indicando cuántotiempofaltabaparaqueseenviaraelSIGALRM.Paradesactivareltemporizadorsepuedeutilizarlallamadaasistemaalarmpasándolecomoparámetroun0.NOTA:tenencuentaque para hacer esto es necesario guardar todos los pids de los hijos creados e irregistrandoloshijosqueyahanmuerto.

    PARAENTREGAR:previo04.tar.gz #tarczfvprevio04.tar.gzentrega.txt

    5. Bibliografía • TransparenciasdelTema2(Procesos)deSO-grau.• Capítulo21(Linux)deA.Silberschatz,P.GalvinyG.Gagne.OperatingSystem

    Concepts,8thed,JohnWiley&Sons,Inc.2009.

    Ejerciciosarealizarenellaboratorio

    Ø Paratodoslosejercicios,seasumequeseprobarántodoslosejerciciosquesepidenysemodificaráelmakefileparaquesepuedancompilarymontarlosejecutables.

    Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueaparecenen el documento, indicando para cada pregunta su número y tu respuesta. Estedocumento se debe entregar a través del Racó. Las preguntas están resaltadas ennegritaenmediodeltextoymarcadasconelsímbolo:

    Ø Paraentregar:sesion04.tar.gz

    #tar zcfv sesion04.tar.gz entrega.txt makefile ejemplo_alarm2.c ejemplo_alarm3.cejemplo_signal.cejemplo_signal2.ceventos.ceventos2.csignal_perdido2.c

    Sobrealarm2:Detectamosquésignalhallegado1. Reprograma el signal SIGUSR1 y haz que esté asociado a la misma función que la

    alarma.Modificalafunción“funcion_alarma”deformaqueactualicelossegundosencaso que llegue un signal SIGALRM y que escriba un mensaje en caso que llegueSIGUSR1. Deberás modificar también la máscara de signals que pasas a la funciónsigsuspend. Comprueba que funciona enviando signals SIGUSR1 desde la consolautilizandoelcomandokill.

    NOTA: Recuerda que la función de atención al signal recibe como parámetro elnúmerodesignalrecibido.Eneltrabajopreviotenéismásdetalles.

    Sobrealarm3:Signalsycreación/mutacióndeprocesosEstos ejercicios estánorientados aqueobservéis loquehemosexplicadoen clasede teoríarelacionadoconlagestióndesignalsylacreación/mutacióndeprocesos:Alcrearunproceso

  • Página37de73

    elhijoHEREDAlatabladesignalsdesupadre.Almutarunproceso,sutabladesignalsseponepordefecto.

    2. ModificaelcódigoparaquelareprogramacióndelsignalSIGALRM(llamadaasistemasignal) sólo la haga el hijo.OBSERVA como antes de estamodificación, tanto padrecomo hijo (por medio de la herencia) tenían capturado el SIGALRM. Después delcambio, la modificación del hijo es privada, por lo que el padre tiene asociado aSIGALRMlaacciónpordefecto.

    PREGUNTA28. ¿QuélepasaalpadreahoracuandolellegaeleventoSIGALRM?

    3. Modifica el código para que después de programar el temporizador el proceso hijomuteparaejecutarotroprograma.Esteprogramatienequedurarmásde10segundosparaquerecibaelsignalSIGALRMantesdeacabar(porejemplo,puedesimplementarun programa que sólo ejecute un bucle infinito).OBSERVA como almutar la acciónasociadaaSIGALRMseponepordefecto,yaquelatabladesignalsseresetea.

    PREGUNTA29. ¿Quépasa con la tabla de tratamientos de signals si hacemosun execlp (ycambiamos el código)? ¿Se mantiene la reprogramación de signals? ¿Se pone pordefecto?

    Sobre ejemplo_waitpid: Esperamos que acaben los hijos. Impacto de laimplementacióndelossignalsPREGUNTA30. Elprogramaejemplo_waitpid,¿Essecuencialoconcurrente?

    La llamadaasistemawaitpidnormalmenteseutilizadeformabloqueante.Elprocesoque laejecutanocontinuahastaquealgúnprocesohijotermina.Sideseamoscontrolarlafinalizacióndelosprocesoshijossinbloquearalpadre,podemoscapturarelsignalSIGCHLDyesperarquevaya llegando. Eneste caso, al serun casounpoco forzado,deberemos realizarunaesperaactivaenelprocesopadreyaquedeotraformaterminarásuejecuciónantesdequeterminenlosprocesoshijos.

    4. Crea una copia de este programa llamada ejemplo_signal.c.Modifica este programaparaqueelprocesopadrenosebloqueeenelmainalaesperadeloshijos,sinoqueejecute la llamadawaitpiden la funcióndeatenciónalSIGCHLD(notificacióndequeun hijo ha acabado). Esto le permite continuar con su ejecución normalmente.Recuerdaqueenestecasodebeshacerqueelpadrerealiceunaesperaactivaparanoacabar suejecución. Lonormal seríautilizar estaopciónen casoqueelpadre tengaalgoparaejecutar.Puedesutilizarunavariableglobalquetedigasiaúnquedanhijosvivos.

    CUIDADO!: Mientras se está ejecutando el tratamiento de un signal, el sistemabloquea lanotificacióndenuevos signalsdelmismo tipo, y el proceso los recibirá alsalir de la rutina. Pero, el sistema operativo sólo es capaz de recordar un signalpendientedecadatipo.Esdecir,simientrasseestáejecutandoeltratamientodeunsignalelprocesorecibemás,alsalirdelarutinasólosetrataráunodecadatipoyel

  • Página38de73

    restoseperderán.Porestemotivo,larutinadetratamientodeSIGCHLDdebeasegurarque al salir de ella se ha esperado a todos los hijos que hayan muerto durante eltratamiento del signal pero sin bloquearte (recuerda que dentro de una rutina detratamiento de signal jamás debes bloquearte). Mira el significado de la opciónWNOHANGdelallamadaasistemawaitpid(manwaitpid)yutilízalaparaquewaitpidseanobloqueante.

    5. Crea una copia de ejemplo_signal.c con el nombre ejemplo_signal2.c.Modifica esteprograma para que el padre, una vez creados todos los procesos hijos, les envíe atodosellosel signalSIGUSR1 (cuyaacciónpordefectoes terminar)y luegocontinúeincrementandolavariablecontador.Además,despuésdeejecutarlallamadawaitpid,elpadremostraráelPIDdelhijomáselmotivoporel cualesteprocesohaacabado(macros WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG). ¿Qué valor definalizaciónpresentacadaprocesohijo?

    • PISTA: Ten en cuenta que la llamada sigsuspend() bloquea al proceso hasta quellegueunsignalqueelprocesotengacapturado,perosielsignalllegaantesdequeelprocesoejecuteelsigsuspend(),elprocesopodríabloquearseindefinidamente.Deberás modificar la máscara de signals del sigsuspend para que capture elSIGUSR1.

    • Creaunafunciónque,utilizandolasmacrosanteriores,escribaelPIDdelprocesoquehaterminadoyunmensajeindicandosihaterminadoporunexitounsignalyencadacasoelexit_statusosignal_code.TenéisunejemplodecómousarestasmacrosenlastransparenciasdelT2.

    PROTECCIÓNENTREPROCESOSLosprocesosnopuedenenviarsignalsaprocesosdeotrosusuarios.Enelsistemahayvariosusuarioscreados(so1,so2,so3,so4yso5)elpassworddetodoses“sistemes”.

    6. Ejecuta el programa alarm2 en un terminal y comprueba su PID. Abre una nuevasesiónycambiaalusuarioso1(ejecuta#suso1).Intentaenviarsignalsalprocesoqueestáejecutandoalarm2desdelasesióniniciadaconelusuarioso1.

    PREGUNTA31. ¿El usuario so1 puede enviar al signals al proceso lanzado por el usuarioalumne?,¿quéerrorda?

    GESTIÓNDESIGNALSElobjetivodeestasecciónesqueseascapazdeimplementarporcompletounprogramaquegestionevariostiposdesignalsutilizandountratamientodiferentealdepordefecto.

    7. Haz un programa, llamado eventos.c, que ejecute un bucle infinito y que tenga unavariable global para almacenar el tiempo que lleva el proceso ejecutándose (ensegundos).Estavariablesegestionamediantesignalsdelasiguientemanera:

    • Cadasegundoseincrementa• SielprocesorecibeunSIGUSR1lavariablesepondráacero

  • Página39de73

    • Si el proceso recibe un SIGUSR2 escribirá por pantalla el valor actual delcontador

    Hazquetodoslossignalsdelprogramaseanatendidosporlamismafunción.Envíalossignalsdesdelalíneadecomandosycompruebaquefuncionacorrectamente.

    COMPORTAMIENTOPORDEFECTOLa reprogramaciónde un signal en Linux semantienedurante toda la vida del proceso. Porestarazón,aveces,esnecesarioforzarelcomportamientopordefectodelossignalsenelcasodequenonosintereseprocesarmáseventos.

    8. Crea una copia de eventos.c con el nombre eventos2.c. Modifica el código deeventos2.c para que la segunda vez que reciba el mismo signal se ejecute elcomportamientopordefectodeesesignal.PISTA:consultaenlapáginadelmanualdelsigactionlaconstanteSA_RESETHAND.

    PREGUNTA32. ¿Quémensajemuestra el Shell cuando se envía por segunda vez elmismosignal?

    RIESGOSDELACONCURRENCIACuandoseprogramanaplicacionesconvariosprocesosconcurrentesnosepuedeasumirnadasobre el orden de ejecución de las instrucciones de los diferentes procesos. Esto tambiénaplicaalenvíoyrecepcióndesignals:nopodemosasumirqueunprocesorecibiráunsignalenunmomentodeterminado.Estohayquetenerloencuentaalutilizarlallamadasigsuspend.

    El programa signal_perdido.c muestra esta problemática de forma artificial. Este programacreaunprocesoquepretendeesperarenunallamadasigsuspendlarecepcióndeunsignal.Elprocesopadreeselencargadodeenviarleestesignal.Elmomentoenelqueseenvíaelsignaldependedel parámetrodel programa: sehace inmediatamente (valor deparámetro0) o seretardauntiempo(valordeparámetro1).

    9. Ejecutaelprogramasignal_perdidopasándolecomoparámetro1.Anotaenelficheroentrega.txt qué resultado observas. A continuación ejecuta de nuevo el programapasándole como parámetro 0. Anota de nuevo en respuestas.txt el resultado queobservas.

    PREGUNTA33. Explicaaquésedebeelresultadodelasejecucionesdesignal_perdidoconparámetro1yconparámetro0

    10. Modifica el programa signal_perdido (llámalo signal_perdido2.c) para que, antes derealizar la espera, bloquee provisionalmente la recepción del signal utilizando lallamada sigprocmask, de manera que se evite la pérdida del signal. Recuerdadesbloquearelsignaldespuésdelaespera.

  • Sesión5:GestióndeMemoriaPreparaciónprevia

    Objetivos• Comprenderlarelaciónentreelcódigogeneradoporelusuario,elespaciológicodel

    proceso que ejecutará ese programa y el espacio dememoria física ocupado por elproceso.

    • Entenderladiferenciaentreenlazarunejecutableconlibreríasestáticasodinámicas.• Entender el funcionamiento de algunos comandos básicos que permiten analizar el

    usodelamemoriaquehacenlosprocesos.• Entenderelcomportamientodefuncionesdela libreríadeCydellamadasasistema

    simples que permitenmodificar el espacio de direcciones lógico de los procesos entiempodeejecución(memoriadinámica).

    Habilidades• Sercapazde relacionarpartesdeunbinarioconsuespaciodedirecciones lógicoen

    memoria.• Saber distinguir las diferentes regiones de memoria y en qué región se ubica cada

    elementodeunproceso.• Entenderelefectodemalloc/free/sbrksobreelespaciodedirecciones,enparticular

    sobreelheap.• Sabercómoreservaryliberarmemoriadinámicaysusimplicacionesenelsistema.• Sercapacesdedetectarycorregirerroresenelusodememoriadeuncódigo.

    Conocimientosprevios• Entenderelformatobásicodeunejecutable.• ProgramaciónenC:usodepunteros.• Saberinterpretaryconsultarlainformacióndisponiblesobreelsistemaylosprocesos

    eneldirectorio/proc.

    Guíaparaeltrabajoprevio• Antes de la sesión, consultad el man (man nombre_comando) de los siguientes

    comandos.Enconcreto,paracadacomandodebéisleeryentenderperfectamente:laSYNOPSIS, la DESCRIPTION y las opciones que os comentamos en la columna“Opciones”delatabla.

    Paraleerenelman

    Descripciónbásica Opcionesaconsultar

    gcc CompiladordeC -staticnm Comando que muestra la tabla de símbolos del

    programa(variableglobalesyfunciones)

  • Página41de73

    objdump Comando que muestra información sobre elficheroobjeto

    -d

    /proc Contiene información sobre el sistema y losprocesosenejecución

    /proc/[pid]/maps

    malloc FuncióndelalibreríadeCquevalidaunaregióndememorialógica

    free FuncióndelalibreríadeCqueliberaunaregióndememorialógica

    sbrk Llamada a sistema que modifica el tamaño de laseccióndedatos

    • En lapáginawebde laasignatura (http://docencia.ac.upc.edu/FIB/grau/SO) tenéiselficheroS5.tar.gzquecontienetodoslosficherosfuentequeutilizaréisenestasesión.Créateundirectorioentumáquina,copiaenélelficheroS5.tar.gzydesempaquétalo(tarzxfvS5.tar.gz).

    • Creaunficherodetextollamadoprevio.txtycontestaenélalassiguientespreguntas.• Practica el uso de nm y objdump con los siguientes ejercicios aplicados al siguiente

    código(quepuedesencontrarenelficheromem1_previo.c):

    • Utiliza el comando nm sobre el ejecutable y apunta en el fichero “previo.txt” ladirección asignada a cada una de las variables del programa. Busca en el man (yapunta en previo.txt) los tipos de símbolos que nos muestra nm. Por ejemplo, lossímbolosetiquetadosconuna“D”significaqueestánenlaseccióndedatos(variablesglobales).¿Esposiblesaberladireccióndelasvariables“i”y“j”conelcomandonm?¿Por qué? ¿En qué zona de memoria están reservadas estas variables? Buscatambiénladirecciónasignadaalafunción“suma”.

    #include #include #include char buff[100]; void suma (int op1, int op2, int *res){ *res = op1 + op2; } int j; main(int argc, char *argv[]){ int i; int s; i=atoi(argv[1]); j=atoi(argv[2]); suma(i,j,&s); sprintf(buff,”suma de %d y %d es %d\n”,i,j,s); write(1,buff, strlen(buff)); }

  • Página42de73

    • Modificaelprogramaanterior (llámalomem1_previo_v2.c)paraque lavariable “s”estédefinidaenelprogramaprincipalcomopunteroaentero (int*s)yasígnaleunadirecciónválidaantesdellamaralafunción“suma”.Paraelloutilizalafunciónmallocpara reservar suficienteespacioparaalmacenarunenteroy asígnale ladireccióndeesa región a la variable. Adapta el resto del código a este cambio para que sigafuncionando.

    • Utiliza el comando gcc para compilar el fichero mem1_previo.c enlazándolo conlibreríasestáticas.Indicaenelfichero“previo.txt”quécomandohasutilizado.

    • El programamem2_previo lee de teclado el número de elementos de un vector deenteros, inicializaelvectorconesenúmerodeelementosyacontinuación lossuma.Modifica este programa (llámalo mem2_previo_v2.c) para que en lugar de usar unvectorestático,usememoriadinámica.Paraellodeclaralavariable“vector”comounpuntero a entero. Después de leer por teclado el número de elementos que debetenerelvector,elprogramadebeutilizarlallamadaasistemasbrkparareservarunaregión dememoria en la que quepan esos elementos y asignar la dirección de estaregiónalavariablevector.

    • Compila de forma estática tantomem2_previo comomem2_previo_v2. Para ambosprogramas haz lo siguiente: ejecuta el programa y antes de pulsar Return para queacabe, desde otro terminal, accede al directorio del /proc/PID_del_proceso quecontiene la información sobre el proceso y observa el fichero maps. Este ficherocontieneuna líneaparacada regióndememoria reservada. Laprimeracolumnanosindica la dirección inicial y final de la región (en hexadecimal). La diferencia entreambosvaloresnosdaeltamañodelaregión.Buscaenlapáginadelmanparaprocelformatodelasalidadelficheromapsyelsignificadodelrestodecampos.Anotaenelfichero previo.txt el tamaño total de la region de heap y datos para los siguientesnúmeros de elementos del vector: 10 y 40000. La región del heap esta etiquetadacomo[heap]perolaregióndedatosestáetiquetadaconelnombredelejecutable.Deberás deducir cual es (hay varias) por los permisos de la región. ¿Existe algunadiferenciaentrelosdistintosvaloresdelasejecucionesdeambosprogramas?

    • El fichero mem3_previo.c contiene un código que tiene un error en el uso de unpuntero.Ejecutaelprogramaycompruebaquéerroraparece.Modificaelcódigo(enel ficheromem3_previo_v2.c)paraque cuandoelprogramagenereel signalde tipoSIGSEGV (segmentation fault), la rutinadeatenciónal signalmuestreunmensajedeerrorporpantallayacabelaejecucióndelprograma.

    • PARAENTREGAR:previo05.tar.gzo #tar zcfv previo05.tar.gz previo.txt mem1_previo_v2.c mem2_previo_v2.c

    mem3_previo_v2.c

    Bibliografía• Capítulo8(MainMemory)deA.Silberschatz,P.GalvinyG.Gagne.OperatingSystem

    Concepts,8thed,JohnWiley&Sons,Inc.2009.

    Ejerciciosarealizarenellaboratorio

    Ø Para cada pregunta que se crea un nuevo fichero de código se tiene que modificar elMakefileparaquelocompileymonteelejecutable.

  • Página43de73

    Ø Contestaenunficherodetextollamadoentrega.txttodaslaspreguntasqueapareceneneldocumento,indicandoparacadapreguntasunúmeroyturespuesta.Estedocumentosedebeentregara travésdelRacó.Laspreguntasestánresaltadasennegritaenmediodeltextoymarcadasconelsímbolo:

    Ø PARAENTREGAR:sesion05.tar.gzo #tar zcfv sesion05.tar.gz entrega.txt Makefile mem1_v2.c mem1_v3.c

    mem2_v2.c

    Espaciodedireccionesdeunprocesoycompilaciónestáticaydinámica

    Elobjetivodeestasecciónesdoble:porun lado,entendercómoseorganizan losdatosyelcódigodeunprogramaenelespaciodedireccionesdelproceso;porotrolado,entendercómoinfluye tanto en el ejecutable como en el espacio de direcciones el tipo de compilaciónutilizado (estática o dinámica). Para ello, usaremos comandos que permiten analizar losejecutables y observaremos la información sobre el espacio de direcciones guardada en el/proc.

    Elficheromem1.ccontieneunprogramaquereservamemoriadurantelaejecución.Analizasucontenidoantesderesponderalassiguientespreguntas.

    1. Compila el programa enlazando con las librerías dinámicas del sistema (compilaciónpor defecto) y guarda el ejecutable con el nombre mem1_dynamic. Ejecuta elcomandonmsobreelejecutable.

    PREGUNTA34. ¿Qué variables aparecen en la salida del nm de mem1_dynamic? ¿Quédirecciónocupa cadauna? Indicaaque regiónpertenece cadavariable según la salidadelnmyeltipodevariable(localoglobal).

    2. Compilaahoraelprograma,enlazandoconlaslibreríasestáticasdelsistema,yguardael ejecutable con el nombre mem1_static. Compara ahora los ejecutablesmem1_dynamicymem1_staticdelasiguientemanera:

    a. Utilizando el comando nm para ver los símbolos definidos dentro de cadaejecutable.

    b. Utilizandoelcomandoobjdumpconlaopción–dparaverelcódigotraducido.c. Comparandolostamañosdelosejecutablesresultantes.

    PREGUNTA35. Paralosdosejecutables,compiladoestáticoydinámico,observasutamaño,lasalidadeloscomandosnmyobjdump¿Enquésediferencianlosdosejecutables?

    3. Ejecutaenbackground(ensegundoplano)lasdosversionesdelejecutableycomparaelcontenidodelficheromapsdel/procparacadaunodelosprocesos.

    PREGUNTA36. Observaelcontenidodelficheromapsdel/procparacadaprocesoyapuntaparacadaregiónladireccióninicial,direcciónfinalyetiquetaasociada.¿Quédiferenciahayentreelmapsdecadaproceso?

  • Página44de73

    PREGUNTA37. ¿A qué región de las descritas en el maps pertenece cada variable y cadazonareservadaconmalloc?Apuntaladireccióninicial,direcciónfinalyelnombredelaregión.

    Memoriadinámica

    Elobjetivodeestasecciónesentendercómoafectaalespaciodedireccionesdeunprocesolamemoria dinámica reservada en tiempo de ejecución, dependiendo del interfaz que se use:sbrk o malloc. Recuerda que sbrk es la llamada a sistema, y que simplemente aumenta oreduceeltamañodelheapenXbytes(loquepidaelusuario).Malloc/freesonlasfuncionesdela libreríadeC,queofrecenunagestiónmuchomás sofisticadade lamemoriadinámica. LalibreríadeCreservaunazonagrandedeheapylautilizaparairgestionandolaspeticionesdelusuario sin tener que modificar el tamaño del heap. Para ello, utiliza estructuras de datos(también almacenadas enel heap) que sirvenpara anotar que trozos estánocupados y quetrozosestánlibres.

    4. Ejecutaenbackgroundelprogramamem1pasándolelosparámetros3,5y100(son3ejecuciones). Observa el maps del /proc para comparar el tamaño de las zona