Vous êtes sur la page 1sur 556

KURT WALL

Programacin en Linux
CON E J E M P L O S

FVirson

Argentina Solivia * Br.! Coiomb.a Cosa Rica Chile Ecuador Salvador Espaa * Guatemala Honduras Mxico Nicaragua Panam Paraguay Per 1 Puerto Rico Repblica. Dominicana Uruguay Venezuela
A m i t r c i m K a rie w L o o d re s M rn Jc M t i - M u n i c h N u t v a O e lh i N u r v J n e y N u e v a Y o r k O n t a r i o P a n * S n * p r S y C .-* y T o l d o - T o r o n t o Z u r i c h

/ 519.68 W AL

datos de catalogacinbibliogrfica

Associate Publisher
Dean Miller

Wall. Kur t Programacin en Linux con ejemplos -1 ed. Buenos Aires. Prenti ce Hall. 2000 568 p.; 2-1x19 cm Traduccin de: Jorge Qcria ISBN: 9S7-9460^9-X L Titulo - L Projroraacin

Executlve Editor
i e f f Koch

Acqufsltlons Editor
G retch en G a n s e r

Development Editor
S e a n Dixon

Editora M a n a Fernanda Castillo

Managlng Editor
Lisa W lson

A rm ado de in terio r y tapa P rez Villainil & Asociado* T raduccin; .Jorge Gvrin Produccin: M arcela M angareili

Proyect Editor
Tooya S im p so r.s

T raducido de: Lin-.ix Progrumming oy exam plo. by Kur*. Wall, publishml by QUE

Copy Editor
Kozia Entsley

Copyright 0 2000,
All R ighU Re*erv<rd. Published by arr.uiguniont wtch the origmal publfoher, PRKNTICE HALL. me. A Pearson Educatlon Compnny. ISBN. 0-7897-2215-1

Indoxor
Cberyl la n o e s

Proofroadcr
B enjam n B crg

Edicin en EipaAol publicada por Ponmon Education. S.A. C o p yright O 2000 ISBN: 987.9460 09.X

Technlcal Editor
Cam eron Laifd

Edte libro no puede te r reproducido totul ni parciulm antc e n n in g u n a for n a, ox por n in g r. medio o procedim iento, jo a reprugreo, fotocopia, m i cro film acin, mimeogrtiico o cu alq u ier otro alaterna m ecnico, fotoquinuco, elvctronico. inform tico, m agntico, ilectroptlco, e tc te ra . C a a lq u ie r re produccin i m ol perm iso pravio p o r escrito do la editorial violn derechos reservado*, ed degal y const ituyu u n delito

Team Coordlnator
Clnay T eeters

Interior De&lgn
Karon Ryggles

Cover Ooslgn
D uar.e R ader O 2000. PRA fiSO N EDUCATION S.A. Av. R egim iento de P atricios 1959 (126(J), Buenos Aires. R epblica A rgaa& na Q ueda hecho el depsito q u e dispone la ley 11.723 Im preso en P e n i. P rm tod in P er. Im preso en Q uebeoor P er , en el me3 de noviembre de 2000 P m n e ra edicin: D iciem bre de 2000

Copy Writer
Eric B o rg ert

Productlon
O an H arris H e a tn e r M o sem an

>

J
vl

El c o n te n id o

d e

u n

v is ta z o 1 5 7 33 55 59 61 93

In tro d u c c i n ............... ........ ..................................... ................................. P a rte I E l e n to r n o d e p r o g r a m a c i n d e L i n u x ............................... 1 Compilacin e p ro g r a m a s ..................................................... 2 Control del proceso de compilacin: el mak e do G N U ...... 3 Acerca del proyecto . . . . . . . . . . . . . . . . .......................................... P a r t e II P ro g r a m a c i n d e s is te m a s ...................................................... 4 P ro c e s o s ........................................................... ......... ................ 5 S e a le s ............... .....................................................................

6 Llam adas a S is te m a ................................................................ 1L9 7 A dm inistracin bsica de archivos en L in u x .................... 131 5 A dm inistracin av an zad a de archivos en Linux .............. 157 9 Daemons .................................................................. ................ 191 P a r t e III L as A P ls ( I n te r f a c e s d e p ro g r a m a c i n d e a p lic a c io n e s d e L in u x ) ................................................... 201 10 La API de base de d a to s ......................................................... 203 11 Manipulacin de p a n ta lla con neu rae*............................... 219 12 Programacin av an zad a con ncuntcs ................................. 2-19 13 La API de sonido: OSS/Fr* ............................................... 277 14 Creacin y utilizacin de bibliotecas de program acin ... 299 P a r t e IV C o m u n ic a c i n e n t r o p ro c e s o s ............................................. 319 15 Pipes y F I F O s .......................................................................... 321 16 M emoria c o m p a rtid a ............................................................... 341 17 Semforos y colua d e m ensajes ............................................ 355 P a r te V' 13 Programacin de T C P rtP y s o c k e ts ..................................... 377 U tilid a d e s d e p r o g r a m a c i n e n L in u x .............................. 407 19 Seguim ientos de cambios en el codigo fuente: el RCS o Sistem a de C ontrol de Revisiones................................... 409 20 Un toolkit de depuracin .............. - ....................................... 425 21 Distribucin de s o ftw a re ................. ...................................... 445 22 Proyecto de program acin: u n a base de datos de CD de m s ic a ....................................................................... 463 P a r t e VI A p n d ic e s ...................................................................................... 4*J7 A Recursos adicionales ............................................................... 499 3 H erram ientas adicionales de p ro g ram aci n ..................... 509 ndice te m tic o ............................................................................... 515

viH

T a b la

d e

c o n te n id o s 1 1 I 2 5 7 5 8 S 10 11 12 12 14 16 22 24 28 29 33 34 34 35 36 37 3S 40 40 41 41 42 44 45

Program acin en Linux con ejemplos .................................. Acerca de este lib ro ............................................................ P a ra quin est pensado esto li b r o ................................ Programacin en entorno L inux con ejemplos captulo por c a p itu lo .......................................................... P u rtu I 1 El e n to r n o d o p ro g r a m a c i n de* L i n u x ......................... Compilacin de p ro g ra m a s..................................................... Utilizacin del compilador do cdigo de GNU ( g e e ) .... Invocacin do g e e .............................................................. E je m p lo ................................................................................ Invocacin do g e e paso t p a s o ........................................ Ejemplo ................................................................................ Utilizacin do m ltiplos archivos de cdigo fuente Ejemplo .............................................................................. Opciones y argum entos .................................................... E jem plos............................................................................... Extensiones dul GNU C ........................................................... E jem plos...................................................................................... Utilizacin de e g e s .................................................................. Mejoras a g e e .................................................................... 2 Control del proceso fie compilacin: el make de G N U ....... Qu uso tiene make? .............................................................. Utilizacin de make .................................................................. Creacin de m a k e f i l e s .................................................. .. Ejemplo .......................................................... ..................... Invocacin de m a k e ............................................................ E jem p lo s............................................................................... Creacin do reglas .. ........................................................ _ T argets ficticios................................................................... E jem p lo s............................................................................... Variables .............................................................................. Ejemplo ................................................................................ E jem plos............................................................................... Ejemplo ................................................................................

Ix

Ejemplo - ...................... ....... ............................................ Ejemplo - .............................................................................. - R eglas im plcitas . ................... - ....... ............................ R eglas p a tr n ....................................................................... Ejemplo .................................... - ........................................ Com entarios ..................................................,............... Targets tiles para un m a k e f i l e .................................. A dm inistracin de e r r o r e s ....................................................... 3 Acerca del proyecto ..............-.................................................... El program a de base de d ato s de CD m usicales ............. Componente* y R ubatem as .................................................. P a r t e II 4 P ro g r a m a c i n d e s is te m a s ................................................ Procesos ............................... ..................................................... ....................................................... ......................................... Que es un p ro c e so ..................................................................... A tributos de un proceso tdenuicadores de procesan

46 47 48 49 49 50 50 52 55 56 56 59 61 62 62 62 63 64 65 66 67 67 69 76 77 77 78 85 #6 89 94 94

Ejemplo ............................................................................. Identificaciones reales y efectivas ................................. E jem p lo s............................ .................................................. Program as s e t u i d y s e t g i d ....................................... Informacin de usuario .......... ............................. ..........Ejemplo ........... .............................................................Informacin adicional so b re p ro ce so s........................ . Sesiones y grupos de p ro c e s o s ........................ ...............M anipulacin de procesos ....................................................... Creacin de procesos ......... ...........................................E je m p lo ......... ...............................................- ................... E je m p lo ................................................................................ Eliminacin killing) de pro ceso s................................... C undo m an ip u lar p ro c e se s........................................ ........ Conceptos sobre seales .................. - ..................................... Qu es una seal? ...........................................................

E speras en procesos............... .............................................- ..............

id U .

Terminologa de las seales ........................................ H istoria de las se ales ................................................ Seales disponibles .......... ........................................... Envi de seales ................................................................... Empleo del comando k i l l .......................................... Ejemplo ........................................................................... Empleo de la funcin k i l l ......................................... Ejemplo ........................................................................... Intercepcin de seales ...................................................... Progamacin de u n a alarm a ...................................... E jem p lo s.......................................................................... Utilizacin de la funcin c a u s o .............. - ............... Ejemplo ........................................................................... Definicin de un h an d ler de ? e a le s ......................... E jem p lo s......................................................................... E jem p lo s..... ................................................................... Deteccin de seales p e n d ie n te s...................................... Ejemplo ........................................................................... 6 L lam adas a s is te m a ............................................................ G eneralidades sobro llam adas a sistem a ...................... Qu os una llamad/i n sistem a Limitacin de las llam adas n sistem a ................. Qu empleo tiene una llam ada u sistem a Utilizacin do llam adas a sistem a ..................... Llam adas a sistem a comunes .................................... Adm inistracin de se a le s.. ......... ................ ........... Cdigos do reto m o de los llam adas n sistem a ...... E jem plos.......................................................................... Tabla de cdigos de erro r retom ados por llam adas a s i s te m a ........................................................................ Adm inistracin de errores ................................ ..... E jem plos......................................................................... 7 A dm inistracin bsica de archivos en L in u x ................. C aractersticas y conceptos ........................................... El modo de un archivo ................................................ La urr.ask .................................................................. - ...... Ejemplo ...........................................................................

94
9-5

96 99 99 99 100
101

102 102 103 105 105 106 107


111

114 114 119

120
120

121
121

122 122 123 124 124 124 126 127 131 132 134 136 138

xi

La :nterf3s de adm inistracin de a rc h iv o s.......................... A p ertu ra y d e r r e de archivos ........................................ Ejemplo ................................................................................ Lectura y e scritu ra de archivos ...................................... Ejemplo ................................................................................ Posicionam icnto del p u ntero del archivo ..................... E je m p io ........ ....................................................................... Truncado de archivos ...................................... ..... ..... . E je m p lo ................ .................................... ...... ................ .. Obtencin de inform acin de archivos ......................... Ejemplo .......... .............................................. ....................... Modificacin de la s caractersticas de un archivo ...... Ejemplo ................................................................................. 8 A dm inistracin av an zad a de archivos en Linux ............... Modificacin de la fecha y horn de creacin y edicin de u n a rc h iv o ............................................................................. . Ejemplo ................................................................................. C aractersticas del fiiesyat*m y x t2 ..................................... Ejemplo ............................................. ................................... Trabajo con d ir e c to r io s ............................... Modificacin de diroctonon .......................................... E jem plos................................................................................ Creacin y elim inacin do d irecto rio s............................ Ejemplos................................................................................. Listado de un directorio ................................................... Ejemplo ..............- ...................................... ......................... Mulciplexing de E / S .................................................................. E je m p lo ................................................................................ Archivos de mapeo e n m em oria - ........................................... Creacin de un m ap a de archivo en la m e m o ria ......... Ejemplo ................................................................................. Utilizacin de irn archivo mapeado ............................... E je m p io ................................................................................. Bloqueo de archivos .................................................................. Bloqueo de La to ta lid a d del archivo ............................... Ejemplo ...................................................... ...................... ...

139 140 141 142


143

144 145 146 147 148 149 151 152 157 158
159

U50 161 163 163 163 165 L66 167 168 169 171 174 175 177 179 180 182 183 184

t xiv

Dispositivos de sonido ....................................................... P a u ta s p a ra pro g ram ar s o n id o ....................................... Utilizacin de la API de s o n id o ............................................. E jem p lo s............................................................................... Program acin de a u d io ...................................................... 14 Creacin y utilizacin de bibliotecas de p ro g ram aci n ..... H erram ientas p ara bibliotecas .............................................. El comando ntn _......... .................................. ........... .......... Ejemplo ................................................................................. El comando a r .................................................................... El turnando Id d ............ ..................................................... Ejemplo .......................................... - ................................... El comando I d c o n f i g ..................................................... Variables de entorno y archivos de configuracin ...... Bibliotecas e st tic a s.................................................................. Creacin de una biblioteca e s t ti c a ............................... Ejemplo ................................................................................ Empleo de una biblioteca esttica ................................. Ejemplo ............................................................................... Bibliotecas com partidas ......................................................... Construccin do u n a biblioteca com parada ............... Ejemplo ................................................................................. Empleo de una biblioteca com partida .......................... Ejemplc................................................................................... Objetos cargados dinm icam ente ......................................... En qu consiste este tipo de objetos .............................. La interfaz elX ..................................................................... Empleo d !a interfaz U l .................................................. Ejemplo ................................................................................ P a r to IV C o m u n ic a c i n e n tr e p r o c e s o s ......................................... 15 Pipes y FIFO s ...................................... ..................................... Pipes (conductos) ....................................................... A p ertura y cierre de p ip e s ................................................ Ejemplo ................................................................................ L ectura y escritu ra de pipes ............................................ Ejemplo ................................................................................ U na m anera m s sim ple .................................................

27S 279 279 231 287 299 300 300 300 301 302 302 302 303 303 304 304 308 308 310 311 311 312 312 312 312 31-1 315 315 319 321 322 324 325 325 327 329

XV

Ejemplo ............................................ .................................... F iF O s ............................................................... ................... Q u es un FIFO ................................................................... Ejemplo ................................................................................. C reac.n de u n F IF O .................................................. Ejemplo ................................................................................. A pertura y cierre -de F IF O s .............................................. Lectura y e sc ritu ra de FIFO s .................................... ..... Ejemplo ................ ....... ................ ........................................ 16 M em oria com partida ................................................................ Introduccin al IPC S ystem V ................................................ Problemas que p la n te a el IPC System V ............................. Q u es la m em ona com partida .............................................. Creacin de un segm ento de m em oria c o m p a rtid a .......... Ejemplo ................................................................................. Adobamiento a u n segm ento de m em oria com partida E jem p lo s..................................... ....................................... 17 Semforos y colas de m ensajes ..................... ........................ El IPC System V y L i n u x ........................................................ Colas de m e n s a je s...................................................................... C reaa n y a p e rtu ra do u n a c o la ..................................... Ejemplo ................................................................................. E sen tu ra de un m ensaje una cola .......................... Ejemplo ................................................................................. Obtencin de u n m ensaju presente en una cola de m ensajes ........................................................................ E je m p lo ................................................................................. Manipulacin y elim inacin de colas de m ensajes ... Semforos ............ ...................................................................... Creacin de u n s e m fo ro ..... ..................................... E je m p lo .................. - ................. .......................................... Control y rem ocin de sem foros ................................... Ejemplo ................................................................................. 13 Program acin de T C P /IP y s o c k e ts ....................................... Conceptos y term inologa de reden ....................................... La API de Socket B erkeiey ......................................................

330 331 332 332 333 334 335 335 3.35 341 342 345 34-5 347 347 34# 349 355 356 356 358 358 359 361 363 363 365 36$ 368 370 371 372 377 378 380

.1'

.1

----------------------- r

xvl

Fundam entos de los so c k e ta ................. - ................................ Creacin de un socket ....................................................... Conexin a un socket .................i ..................................... Sockets de entorno U N IX ........................................................ Creacin do un socket do emborno UNIX ...................... E jem plos............................................................ .................. Lectura y escritu ra de u n socket de entorno UNIX E je m p lo ................................................................................ Programacin de T C P /IP ......................................................... Nmeros de red .................................................................. Direcciones de red ............................................................. Ejomplos ............................................................................. .. Lectura y escrituro du uockets T C P /IP ......................... Ejemplo ................................................................................ Emploo de h o stn o m e * .................................................... P a r te V Ejemplo ................................................................................ U tilid a d e s d e p ro g r a m a c i n e n L in u x ........................ 19 Seguim ientos de cambios en el cdigo fuente: El RCS o Ststom a de Control de Revisiones....................... Por que razn u tilizar R C S ? ..................... ......................... Terminologa del control de versiones ................................. Utilizacin del mtodo RCS .............. .................................... Verificacin de archivos do RCS que e n tra n y s a l e n ......... Ejemplo ....................................................................................... Realizacin de caminos a archivos de reposicin .............. Ejemplo ...................................................................................... Opciones adicionales de linea de comandos ..................... E jem plos..................................................................................... Palabras reservadas de RCS ........ ........................................ S l d S ...................... ............................................................... $ L o g :m e n s a je S ................................................................ Ejemplo ................................................................................ O tras palabras reservadas de R C S ................................ El comando i d e n t ............................................................. Ejemplo ................................................................................ Empleo de r e s d i f f .......................................................... E jem p lo s.......................................... ................ ...................

381 381 383 335 385 386 390 390 392 392 393 395 398 398 401 403 -107 409 410 410 111 411 412 413 413 414 414 415 415 415 415 416 417 417 418 418

xvll

O tro s com andos KCS ............................................................... Empico de re S C le a n ........................................................ Ejem plo ................................................................... ............ Empico de r i o g ......................................................... ........ Ejem plo .................................................................... - ......... Empleo de r e s .................................................................... Ejemplo .............................................. - ................... ....... 20 U n toolkit de d e p u ra c i n .............................................. .......... Empleo del g d b .......................................................................... Compilacin con apoyo e d e p u ra d o r............................ Ejem plo ...... ......................................... ........................... Comandos b sic o s............................................................... Deteccin y reparacin de problem as de memoria ........... Tipos de fallas do tnom ona .............................................. Ejemplo ................................................................................ M emoria D e b u te n ......................................................... Empleo de mpr y m check .................... ..................... Ejemplo .............................................................................. U sando rucheck.................................................. ............. Ejemplo .......- .................................................................. 21 Distribucin de s o f tw a r e ...........................................- .......... Empleo de t a r y g z i p ............................................................ Empleo de t a r .................................................................... Invocacin a i n s t a l i ....................................................... E jem plos............................................................................... Empleo de R P M ........................................................................ Requerim ientos m n im o s ........................................ - ..... Creacin de un p aquete RPM ......................................... Construccin efectiva d e l paquete RPM ..................... Ejemplo ........... ............. .................................................. 22 Proyecto de programacin: a ^ a base de datos de CD de m sica ................................................................................... E l cdigo, mdulo por m d u lo ................................................

420 420
421

421 421 422 422 425 426 426 427 427 435 435 436 437 441 44i 442 442 445 446 446 450 450 453 453 454 49 459 463 464

Empleo del comando i n s t a 11 .............................................. 449

xvifj

P arte VI
A

Apndices
Recursos adicionales ...................................... Bibliografa com entada .................................. Recursos de In tern et ...................................... Sitios Web .................................................. U senet ........................................................ Listas de co rreo .......................................... B H erram ientas adicionales de programacin Bastidores p ara aplicaciones......................... B ib lio tecas......................................................... Compiladora! y lenguajes ............................................. .. .. .. .. .. .. .. .. .. .....

497 499 499 502 502 506 506 509 509 509 509 510 510 510 511 511 511 512 512 515

C e rtificaci n ............................................................................... Distribucin de softw are ...................................................... Editores ................... .................................................................... Grficos ..................................................................................... H e rra m ie n tn s.......... ........ ........................................................ M isceln e as.............................. ................................................. Softw are cientfico y m atem tico ........................................... Software do baso de d a t o s ..................................................... ndice tem tico ................................................................................

Acerca del autor


K u rt W all ha estad o empleando UNIX desde 1993 y h a estado interesado en Linux por casi ia m ism a cantidad de tiempo. A ctualm ente es el encargado de m an ten e r ia seccin e FAQ (Frequently A shed Q uzstionso Preguntas fo r m ulad a s cor. frecuencia >de Inform ix y es presidente e !a seccin Linux dei Grupo de U suarios de Informix. Es tam b in vicepresidente de! Grupo de U suarios de Linux de S al Lake City, U t3h. EE.U U Le adrada, sin que ia enum eracin rep resen te un orden de preferencias, el caf, los gatos, la program acin. Ia cocina, lev an tarse tard e e irse a dorm ir an m s ta rd e . No le agrada escrib ir sobre s mismo en tercera persona. A nteriorm ente estuvo em pleado en a US West. E a la actualidad K urt Wall se dedica por completo a escribir y e d ita r publicaciones. Recientem ente acaba de com pletar su prim er libro. L in u x P ragram m ing UnUashcd.

Dedicatoria
A Mam (E leanor C laire Flem ing Wall): La estoy pagando m uy bien, me g u stara que hubieses estado aqu.

Reconocimientos
Asbleigh Riit y Zane Thom as se resignaron do m an e ra valiente y estoica a ju g ar con *u N intendo y m ira r dibujos anim ados d u ran te el tiompo que rae llev escribir ente libn> Tam bin mo ay u d aro n a ponerlo nom bres a algunos do los programad de m uestra cuando mi im aginacin llegaba a su limite. Pup no hizo nada en especial, pero sin su confianza, apoyo y aliento yo no podra hobor tenido la motivacin nocesorio como p ara em prender la t.nrea de escribir un libro. Mam, te extrao y hubiese doseado que estuvieras \qu para poder com partir esto contigo De alg u n a m an era, sin embargo, s que t sabes. Rick. Amy, Morgan L eah y el joven m aestro Isaac Benjamn 3on sencillam ente o mejor herm ano, cuada, sobrina y sobrino que cualquiera pudiese ten er Gracias a la p andilla de F.l Pao por ntivumermu por e-m ail y por perm itirm e m ezclar en sus vidas cuando necesito aire Lrosco. M arty me m antuvo trabajando, preguntndom e cmo iba todo Mi perro Nudgo hizo honor al significado en Yiddish de su nombre hacindome com paa a las 4:00 de la m aana, calen tan d o ini regazo, ayudndom e a p ear e insistiendo en requerir mi atencin ju s to cuando no se la poda brindar. Finalm ente, los amigos de Bill Wilson contribuyeron a m antenerm e lo suficientem ente cuerdo como para poder escribir; si se debe conceder algn crdito, ste va para Dios. Mi editor tcnico, Cameron L aird. me brind sugerencias que mejo raron la calidad general del original, se alaro n un alarm an te num ero de errores realm ente estpidos, evitaron que el libro sonase a pgina de m a nual. y en general lograron evitar que el au to r de estas lneas pareciese un perfecto imbcil. G racias, Camern. El equipo de M acnllan fue estupendo A G retchen G anser hay que concederle el m rito de que este libro siq u iera exista -re riebo un alm uerzo todava ., G retchen, y te agradezco por no e n tra r en pnico cuando nos retrasb am o s-. G retchen y S ean Dixon, mi editor de desarrollo, ambos se las arreglaro n p ara ayudarm e volver a los tiempos previstos .gracias a rodos'). N isiq u ie ra quiero sab e r c u an ta s reglas pasaron por alto. S ean se merece un alm uerzo, tam bin, si alguna vez aparece por Sale Lake City. Kezia Endsley Llev a cabo u n excelente trabajo de edicin del original y se

XXI

as arreglo p ara leer d i r.ente cuando lo que yo haba escrito p areca prosa bizantina. S ara Bosin, o tra editora, fue g ra tam e n te paciente d u ra n te la etapa ce edicin, especialm ente cuando yo m u tilab a s u nombre. Lo escrib bien esta vez? G racias a S ara, ahora s la diferencia en tre un guin em e y un guin ene Tonya Sunpson. la reem p lazan te de S ara. ~e merece un agradecim iento adicional por su paciencia conmigo. Gracias a todo* !oa ciudadanos de la red y a los miembros de la comunidad de usuarios de Linux que. con paciencia y gentileza, respondieron mis p re gunta? y m e b n n d a ro n sugerencias. En p articu lar. Th ornas Dickey, actual m antenedor de la seccin dedicada a n cu rses, reviso u n a versin prolim inor de los captulos sobre ncurses y corr.gi v a n o s errores contos y m ultitu d de errores de tipeo. Michae 1 Olaon. de S leopycat Software, fabricantes de ia base de datos Berketey. gentilm ente revis el capitulo obre la API pora base de datos, resultando u n capituio mucho m ejor que lo que hubiera sido de otra m anera. La lista de correo l l n u x so u n d me ayud con el captulo sobre la AP! de sonido. A preao especialm ente la colaboracin dn H annu Solavainen. el au to r orifinal de e sta API. por su ayuda. Las em presas quo realizan negocios con. y p ara, la comunidad Linux ta m bin a brindaron apoyo. Red Hat Softw are y C aldera System s me apor taron copias con asistencia plena de sus D istribuciones de Linux, ah o rr n dome muchsimo tiem po do descarga y to d av a m s frustracin. Hoilv Robinaon de Metro Luik Incorporated m e obsequi en tusiastam en te copias de sus producto? M onf y O penG L Holly, cubrirem os este m aterial en el prximo libro. C h n s Dibona. A sistente dts Vaguedades de VA Research (n como qu iera que 5*- llamen e^r -r sem ana \ me prest un excelente .-iifitemu con el cual desarrollar el codigo em pleado er. este libro. C h n s no se sobre salt. ni siquiera pestae, cuando le expliqu que prefera colgar el sistem a de algn otro que exponer el mo a los caprichos de algunos punteros b ri bones. Sirva como testim onio de la increble estabilidad y robustez de Linux: el mismo nunca se colg, aunque me can se de exam inar archivos centrales de Linux; las teclas w g*. d. y 'b de u n teclado quedaron lisas y sin marcas. Si me he olvidado de alguien, le rieg o que acepte mis m s sen tid as discul pas y me enve un e-rr.aii a kwalI@xmission.com. de modo que pueda rem e diar la omisin. A p e -a r de teda la asisten cia que he tenido, asum o la p lena responsabilidad por cualquier e rro r y d islate que haya podido quedar e n pie.

Programacin en Linux con ejemplos


Bienvenido a Progrznccicr, s.i L in u x con q em plm l Paredera.que uno apenas pudiese encender el televisor, escuchar la radio, navegar per Internet o ieer un peridico o revi3ta sin escuchar o v er algn mendfin ai "sistema operativo gra tuito denominado Linux, similar a UNIX y creado por LinusTorvalds..." Aunque el resto del mundo parece recin h ab er descubierto Linux, este sistem a operati vo ha <:do muy coa^xid-j en Internet desde 1991. cuando Linus hizo pblica por pr-.mera ve* una de las primeras versiones del ndeo (kerntl) de 3U creadn. Yo descubr a Linux por primera vez en 1993, m ientras trataba de localizar una versin de UNIX que pudiera utilizar en casa para aprender lo suficiente sobre UNIX como para mejorar mis perspectivas laborales. Qued asombrado de sus prestacin?? y fui inm ediatamente atacado por el virus de Linux. Sir. embargo, mi computadora mantuvo una doble vida durante m is de dos ailos m ientras iba cambiando entre Windows y L inux finalm ente, profundamente disgustado con Windows en 1995, lo retir completamente de mt sistem a y comenc a utilizar Linux y prr>gramar para el mismo todo el tiempo. Desde entonces no he tenido oportunidad de arrepentirme.

Acerca de este libro


De modo que, para qu existe Programacin para/en interno Linux con tjtm pos? La respuesta, simplemente, es para llenar una clara necesidad. Durante ui primeros tre i o cuatro .os. la base do usuarios do Linux estaba constituida por programadores tcnicamente muy sofisticados y conocedores, qu- adems -m encontraban familiarizados con UNEX. A medida que Linux fu? ganando popularidad, .tu comunidad de usuarios ha ido cambiando notablemente. El nmero de nuevos usuarioa no familiarizado con los desarrollo* de ofVwar en un entorno UNIX pro que queran program ar on y para Linux crcd desm esuradam ente. Por desgracia, ha habido un; tvidn falta de informacin dirigida hacia les programadores principiantes de Linux, Hay. por supuesto, libres que le ensean a uno cmo utilizar las herram ientas individuales y que cubren temas especficos, pero Programacin para/un > sntor no Linux con ejemplos rene todo el m aterial relevante a este sistem a operativo en an nico libro.

Para quin est pensado este libro


Este libro da por u n ta d o que el lector sabe cmo utilizar Linux y que sabe cmo programar en el lenguaje C. Debera estar en condidones de abrirse camino pur e! iesyatem. leer pginas de m anuales, emplear un editor do texto y ejecutar comandos Le ser til, aunque no sea excluyente, contar con una cooexin a In ternet. Como programador de C. deber saber como redactar un programa que compile sin mayores inconvenientes, comprender los fundamentos del uso de punteros y estar familiarizado con les dialectos de C. En cambio no se requiere contar coa conocimientos avanzados Escrib este abro ccn dos grapos de personas en mente. El primer grupo est com puesto por gente que se encuentra en la posidn en que me encontraba yo en 1993.

Ye habi utilizado y programado en varias versiones de DOS y ce Windows, pero ciando tuve que compilar un programa en L:nnx, me sent pordido. La piora de herramientas rr.e abrum, lo mismo que* la terminologa y. hasta cierto punto, la propia filosofa de UNIX: todo es un archivo, unir entre s multitud de pequeas he rramientas para formar programas ms grundes, 1 h lnea de comandos es oigo apa sionante. De modo que. si el lector sabe cmo programar utilizando el lenjtuovje C. pero no tiene idea sobre ias herramientas y utilidades que tiene a su servicio y se siente abrumado por la complejidad espartana del entorno do programacin de Li nux. cate libro es para usted. El otro grupo de ectorcs son los usuarios de Linux que desean saber cmo redac tar aplicaciones que funcionen sin problemas en el entorno de Linux. Este grupo ya se ha dado cuenta de cmo escribir y compilar programas y puede de hecho comprender algo do lo que consta en las pginas do loa manuales, pero no tiene ninguna idea 3obre io que es un proceso, cmo escribir un handler d* erial, o in clusive de por qu razn hnbna que prcocujiarsc por ello Si el lector encuadr.i en la descripcin formulada en este prrafo, este libro tambin e> para usted Si, por otro lado, lo que desea al lector es manipular el kornul, <tote definitivamen te no 03 ol libro adecuado porque todo el material presentado nqul es cdigo do upiicaciones que se basa cu el kornel y utiliza servicios quo proveo justamente ktfmel. Otro tema no cubiolto en este libro os la programacin en X Window, La programacin de l.n GUI iOraphtc User nterface. o Interfaz Grfica de Usuario) es una cuestin compleja y ma allrt del alcance do este libro, que esta dingtdo pnnci* palmenta al programador principiiuite. La programacin en X Window merec* su propio libro; hasta un compendio de material introductorio puede fcilmente ab ar car ua par de cientos de pginas.

Programacin en entorno Linux con ejemplos, Captulo por Captulo


La primera parte del libro introduce al loctur id entorno de programacin en Linux El capituio l, Compilacin de Programas", le ensenar a utilizar el compilador de C de GNU. ce. El lector podr explorar sus opciones y caractersticas y aprender algunas de las extensiones al lenguaje C que admite gcc. El capitulo 2. 'Control del prcceso de compilacin: el malte de GNU" anolizu ul programa make. que auto matiza el proceso de construccin do software. El capitulo final de esta parte del li bro. captulo 3, Acerca del proyecto" trata sobre el programa que el lector tendr construido al final del libro, un administrador da base de datos de CD musicales El proyecto de programacin emplear muchas de las tcnicas y herramientas cubier tas en el libro. EL C D IG O U TILIZA D O EN E S T E LIBRO ?3*3 ver =i ccoga utuzaco cr este .Oro. dirigi*se a'awv.mcp.com/ in fo y tioear 0?8S722t 5: ;el zcc go ISBN 1ese este D 'O ) para acceder a. sitio Wea oe Programacin en U T-x mt ejemsos. La segunda parte, Programacin de sistemas", dedica cinco captulos a la progra macin ce bajo nivel para Linux. El primer tema son los procesos, porque 05 mis ma* constituyen la clave para entender cmo funciona cualquier programa que co

rre baja lin n x E~ el capitulo -4, 'Procesos', el lector aprender qu os un pruceso. cmo crearlo, manipularlo y eliminarlo. y cmo interactan los procesos con la pro piedad de archivc6 y ei acceso a los recursos el sistema. El captulo 5, Seolea' cxpjca qu son las sedales. cmo crear sus propios handlere personalizado? de se ales y cmo hacer para peder ignorar seales. La programacin de sistemas a menudo requiere inicractuar con el kemel y reque rir ser.-.cos del miamo Las ivtc/n calh p ro v e n la interfaz entre el cdigo de su aplicacin y d kcrnel. de modo que esto se cu bre on el captulo 6. Llamadas a rtema Tanto el capitulo 7 Administracin bsica de archivos en Linux") como o! captulo 8 Administracin avanzada de ard u v w en Lmux") atin dedicados h la administracin ce archivos con Linux Todo, o casi todo, lo que existe en Linux es un arduvo. de modo que todos los programas, excepto los ms simplea, nccwiUMn de s^rv.cioa de archivos El primero de dicho captulos (el capitulo 7) suministra tnormacn bsica sobre lo servaos de archivos, incluyendo la creacin. apertura, e rre y eliminacin de archivo#, y la obtencin de informacin aobre archivo*. El capitulo 8 incursin* <*n tema* avanzados vibre administracin de archivos, tai es cmo m teractuor con el filesya Cem de Linux. xt2. E/S (wntrnda/aalsda) di* alta velocidad mediante el empleo de mapa*i de meraona. y bloqueo de archivos. Para term inar c ita parte hay un captulo sobro reduccin du duumonn, quu un programan que corren de m anara no interactiva *n segundo plano y proveen ce r vunos a pedido o realizan otra- tareas Los daomons tienen requerimientos espe ciales y e: capitulo 9 (Daemons*) lo m ostrar lo que son y cmo abordarlo La terrera parte el libro, La* APU (interneos de programacin de aplicacio n esde Linux', io conducir i traves de algunas de las interfaces clavo de pro gramacin de aplicaciones A Pls) disponibles en Linux. El pnm er tema a tra ta r ser la API de base de datos, porque la mayora de las aplicaciones uecesitan al macenar dalos de una m anera ordeuada y que porania una recuperacin senci lla La base de datos Berkeley satisface esa necesidad, y se comenta en el capitu lo 10 '"La API de base de datos :-. Ei capitulo 11 Manipulacin de pantalla coi: ncurses") y ei cupulo 12 Pro gramacin s van rada de ncurses"' ** concentran en la administracin de p an ta llas en modo texto utilizando la API para r.curses. El captulo 11 analiza los usos bsicos de loa ncarses tniciahzaoon, terminacin, entrada y salida El capitulo 12 comenta las prestaciones avanzadas que proveen los ncurses, tales comn el empleo de colar, administracin de ventanas, interaccin con rutones y creucion y utilizacin de formularios y mens. El capitulo 13 La API de sonido; OSS/Free") cubre la AHI de sonido integrada en el kem el de T.-nn Finalmente, el capitulo 14. Creacin y utilizacin do bi bliotecas de programacin*, clausura esta seccin del libro. Todas las APIs discu tidas aqu son implementadas mediante el empleo de bibliotecas, de modo que saber cma emplearlas resulta esendaL Adems, a medida que escriba ms pro gramas para Linux, el lector se snconirar redactando el mismo cdigo una y otra vez; la solucin es almacenar ese cdigo en sus propias bibliotecas. La cuarta parte dei libro cubre varia m aneras de realizar a comunicacin en tre procesos que hay disponibles cor. Linux. El tema del primer capitulo de esta p a r^ . el capiculo 15 'Pipes y FIFOs 1 . :c constituyen los pipes, despus do los cuales sigue el captulo 16 Memoria compartida*), y ei capitulo 17 (Semforos

y colas de mensajes1 '). Como Linux es un producto de Internet y cuenta con so fisticadas prestaciones para trabajar en red. no lo debera sorprender que el l timo captulo de esta seccin, e! captulo 18 ("Programacin de TCP.TP y sockets") est consagrado a los fundamentos de la programacin para redes empleando TCP/IP. La ltima seccin del libro. Utilidades de programacin p.ira Linux", cubre he rramientas que el lector encontrar tiles a medida que vaya ganando experien cia en programar para Linux El captulo 19 (Seguimiento de cambios en cdi gos fuente: El sistema de control de revisiones") cubre ei control dei cdipo fuente utilizando el venerable Sistem a de Control de Revisiones. Cualquier cdi go de programacin indefectiblemente contendr errores, de modo que el capitu lo 20 <*Un toolkit de depuracin) le ensear cmo utilizar el depurador de cdi go fuente gdb y cmo emplear un por do tolkits de depuracin de memoria. Electric Fenceymor. Cuando el lector baya finalmente completado alguna vez esa aplicacin imbarible que tiene pensada, seguramente la querr distribuir. El capitulo 21 D istri bucin de software*) cubre los mtodos principales de distribucin de software t a r y el Administrador de Red H at Packag, RPM. El capitulo final del libro, el capitulo 22 ' "Proyecto de programacin. u:iu buse de datos de CDs do msica") es un progrumu completo y de aplicacin cotidiana, un administrador de una base de datos de CD de mii&ica. Adems do listar I Cdigo fuente coaplato do! peoyocto, esto captulo explico cmo funcionan en conjunto la* diversas partos componentes del mismo. Ese proyecto de programacin da trmino al libro, y por onda a u introduccin u la pmgram/icin pnra Linux. Si le quedan deseos de continuar aprendiendo, el primero de los dos apndices, el Apndice . \ ("Rccuraoa adicionales") prove* bibliografu e informacin adicional obro programacin para Linux. El Apndice B iHerramientas adicionales de programacin") proveo informacin sobre matenal adicional lenguajes, herramienta, empresas y programas de certificacin. A esta altura del libro el lector contar con una slida base do programacin pa ra Linux. La experiencia, el maestro por ejemplo m s importante, contribuir u nutn r an mas su versacin en la materia.

Lo que viene
El capitulo 1, Compilacin de program as," da comienzo a su viaje a travs de -a programacin para Lmux m ostrndole cmo utilizar el com pilador de C qcc de GNU. Despus que ap ren d a a u tilizar el compilador p asara a cono cer maka, -I cual, en cierta medida, au to m atiza el uso de g ee, trabajando duram ente de modo que no lo ten g a que h acer usted.

Parte I

El entorno de programacin de Linux


1 . C o m p ila c i n d e p r o g r a m a s 2 . C o n t r o l d e l p ro c e s o d e c o m p ila c i n 3 . A c e rc a del p ro y e c to

Compilacin de programas
E'. GNU cc g c c es el conjunto tic program as que com prenden el compilador del proyecto GNU. Compila prvp-am aa escrito en C, C-*-*, 9 C dirigido a O b jetos. El g cc tam b in compila FORTRAN icn apoyo de g77). Esto captulo m concentra en el com pilador de C porque C es la lengua nativ a de Linux El capitulo tam bin cubre las diferencias e n tre g c c y egCS vennn 1.1.2. el conjunto experim ental de program as del com pilador GNU. E ste capitulo abarca los siguientes tem as: Invocacin del QCC Opciones y argum entos para controlar la conducta del g cc Compilacin de m ltiples archivos fuente Utilizacin de las prestaciones de optim izacin <le g cc U tilizacin de las prestaciones de depuracin de g c c A d m in istra ra n de errores de compilacin Extensiones del GNU al lenguaje C El nuevo compilador de C. e g e s Todos los program as de este capitulo p u ed en ser encontrados en el sitio web n ttp : w r t . n c p .c o n i n f a bajo el n m ero de ISBN 0789722151

Programacin en Unux

Utilizacin del compilador de cdigo de GNU (g c c )


El g c c le da al program ador un amplio control sobre el proceso de compiladon. E ste ltimo comprende cuatro etapas: preprocesado, compilacin, ensam blaje y vinculacin. Uno puede detener el proceso despus de cualquiera de di chas etapas para exam inar el rendim iento del compilador en la mism a. El g cc tam bin puede ad m in istrar ios diversos dialectos de C. tales como el ANSI C o el C tradicional (el de .sus desabolladores, K em ighan y Ritchie). Se puede con trolar la cantidad y el tipo de informacin de depuracin, si se {s d eseara em plear, que se in cru star en el archivo binario resultante y, como !a m ayora de ios compiladores, a c c puede llevar a cabo tam bin optimizacin de cdiico. El g c c incluye m s de tre in ta advertencias individuales y rres niveles de acv o rte n d a tipo cap tu ra todo'. E l g c c es tam bin un compilador cruzado, de modo que so pueda d esarro llar el cdigo en una arq u itectu ra de procesador y correrlo en otra. La compilacin cruzada es im portante porque Linux corre en muchos tipos diferentes de sistem a, tales cntno el xS6s de Intel, ias PowerPC, las Amiga y las SCN Sparcs. Cada chip do procesadur tien e unu arq u itectu ra fsica diferente, do modo que la m anera en que se debe cons tru ir un binario varia p ara cada sistem a. C uando so utiliza como un compi lador cruzado, ol g c c perm ile que se compile u n program a diseado p ara co rre r en una PowerPC en. digam os, u n sistem a Intel x86i Finalm ente, ot g c c acepta una lista lara de extensiones i C. 1.a m ayora de estaa extensiones mejora ol desem peo, contribuye a la ta re a del compilador tendiente a 1a optimizacin del cdigo, o hoco m is sencillo el trab ajo del probram ador. El precio a p a g ar a cambio ea la disminucin de la port.abilidad Mondonarutnott alg u n as de las extensiones ma comunes, porquo las m is mas se pueden encontrar on los archivos de encabezam iento del kerne!, pero lo ideal es que el lector evite su aso 011 los program as que redacto.
In v o c a c i n d e g c c

Para utilizar g c c , sum inistro un nombre de archivo fuente de C y utilice la op cin -c para especificar el nombre del archivo de salido, g cc preprocesara. cumpilar, ensam blar y vincular ilink) e! programa, generando un archivo ejecu table, a menudo denominado binario. La sintaxis ms simple se ilustra aqu gcc 'cbivo.en'rta.c |-a vcluvo.saUda] a r c h iv o _ e n tr a < a .c i un ardvo de cdigo fuente en C y -o establece que el nombre dei archivo de salida ser a rc h iv c _ s a li< J a . Las corchetes < 1 j) indican a lo largo de esto libro argum entos opcionales. Si ol nombre del archivo de sali da no se espedca, g cc lo denom inar a .O u t como opcin predeterm inada.
E je m p lo

TEMPLO

Este ejemplo utiliza g c c p ara crea r el program a h o la a p a rtir del cdigo fuente h o l a . c. Primero, el cdigo luente: > \cno--e aol pragr&M on Internet: Hallo.c / /* i.;3ta<Jo 1 . i

Capitulo i : Compilacin de programas

h o l a .c - P ro g r M zinaica ' o l a , cen dal *

t n t * 3in { v 0 )

t
puCSi'iH^U, n-j-c c'CQ-iissc.-es 3e unux! |:
r ita n *;

> para com pilar y correr este proeraxna. tipee


S a c c ft o la .c -o o la

Si todo anduvo bien, g cc realiza s u trabajo en 3encio y Luego regresa a la seal de peticin de comandos del sistem a operativo, g e e compila y lin k ea el archivo fuente h o l a . c . creando el archivo binario que fvip especificado m e d ian te el argum ento -O. o sea h o la . Ei comando 15 (que vendra a se r oigo as como la co n trap arte UNIX del co m ando DIR do DOS: m uestra que ex iste un nuevo program a, h o la . El lti mo comando ejecuta el program a, y produce la siguiente salida:
S la h o i.C *U *

J ./fU
H O l. uftOO 4

er.>;r*iUC<5r#j

4 * L lr u * '

P R E C A U C IO N
k t m o c - o e , o t o c f C f v n a h o l a In c lu esp e tfle a m e rta : dircccono corrien te, taoo co un p o n o U . p o ro u * inciulr oi o fo c io n o com ento n o ruta w a t fr ieren un n esgo M r a S<7jun3ac 1 fleo ?. *l <1 rectOrtO com ente fu e se un subdirectono OM Ct.m o ire c to fto inctukJo en a m ta . on lugar ao uts/ un aef'.er.ctl SPATH n e ja r.:* 3 / P i n : / u s r ' f c ; n : , ' u r f L o c a L l n : . f w o ei ounto al final), lo sen ton e s oeoer^a sr ; o n : / u s r / s n ; / u s / l o c a l / t > t n . c u m cco que t-mgCin haciter pu c a r scicc ar en et ^ 'e c to n o com ente, un c o rra ro o dad too del m iim o "o r r w o del cott^ o co norma) c - o uno w B rdataranerw c e se n e|ecu;ar

Cmo sabe g e e cmo procesar los archivos? Se basa en las extensiones de los mismos p a ra d eterm in ar como p ro cesar correcuim enle cada archivo Las extensiones m s comunes y sus in terp retacio n es se listan en la tab la l . l . Tabla i~i_ Z im o .n terveia gee las extensiones e srcnivo ___________ Extensin__________ Tipo de archivo_____________________________________
.C .C, .i . cc Ccsgo fuente ce lenguaje C Cdigo rente c e lenguaje C* Ccigo fuente ce C creorccesaco

contino

Programacin en Linux

Tabla 1.1. continuacin Extensin .i i .S, . $ .o .3 . .so


In v o c a c i n d e g C C

Tipo do archivo__________________ Cdigo fuente de Cv+ preorocesaoo Cdigo fuente de lenguaje ensamblador Cdigo oajeto compilado Cd'go do biblioteca compilado
p aso a paso

En el p n m e r ejemplo, hubo m ach as cosas que tuvieron lugar do m an era e n cubierta y el lector no las vio. g e e prim ero corri h o L a. c por el prcprocesador, cop, para expandir cualquier m acro que pudiese h ab er e in s e rta r los contenidos de Ion archivos incluidos m odinto tf in c lu e Luego compil el cdigo fuente preprocesado. convirtindolo en cdigo objeto. F inalm ente el linkor. Ld. cre el archivo binario h o la . El proceso completo de vinculacin se ilustra en la figura 1-1.

F ig u ra 1.1. La compilacin de un programa consiste de uaridi tapaUro puede recrear estas etapas m anualm ente, avanzando por el proceso de compilacin un paso por vez. P a ra indicarle a g e e que d etenga la compila cin iuei del preprocesado, utilice iu opcin -E de g ee, como se indica a continuacin: S gee -5 3rc-ivo_3':tr33a.c o arsnavo_salioa.cpp

Caotu

i : Compilacin de programas

11

El paso siguiente consiste en com pila- si archivo preprocesado p ara conver tirlo en cdigo objeto, utilizando ia opcin -c de g c c . La opcin x se utiliza p ara indicarle a g c c que comience ia compilacin a p a rtir de cierta e tap a La sintaxis correcta p ara esta etap a es:
S ;c c -* c j a - o j t S '. t : * r c f i 0_ * t ' 40J . : a p -o a r c r U '0 _ M ll< la .o

L in kta n o el archivo oojoto. finalm ente. 3e obtiene au im agen binaria. E! co mando que llevara a cabo la e ta p a de vinculacin sera algo as como la si guiente:
tc reH*_*tratf*.e o ar:nio_jaI:fla

) ai program a h o la del ejemplo anterior, avance paso a paso a tra v del proceso de compilacin ta l como lo ilu stra el ejemplo siguiente Prim ero, p re proceso h o l a . C:
S gcc f t o u . c -o r o l a . cpp

Si el lector exam ina h o l a . cpp con un e d ito r de texto, vera que el contenido del archivo de encabezam iento S t d i o . h ha sido cfcctivamenti* inwjrtudo on el cdigo fuente, ju n to a otros smbolo* de preprocesado. El listado siguiente es un ex tracto de h o l a . epo:
r n t t r - tn t f$*t5c * :* m m t **:pcs (FILE 'o o a j _
po j )

ts o a t fpos_t

Talio

* 518 '/w /U daa;*io.n* 3

* i* * rr oitf C:e*r_*fr x t t o i m t ?*cf

( R t i *_straart| * _ straan|

i-".: fcrfOT

{FLt _stre a a )

te m *ci<: c:ci',err_.cio<k
ir.z **of_jn:aek#a

i^IL* *_ rs a ir ;

cPI!_ * _ a t r s ii)
i FI lE

e i: rr

ir - i'_ .o ;c c c

* _ stre a B l

e:en*, voia par**" i_coost


in t

_s

*Xt=m _ co n jt ir-a- _ * i/S_"IXS*l!; El siguiente os com pilar h o la .c p p p a ra convertirlo en cdigo objeto:

$ gcc -i c?p-5'jt2ut -c -wla.cpc -3 nola.O

i 12 Programacin en Linux

,j

Se debo utilizar la opcin - x p ara indicar! a g cc que comience la compilacin a cierta altura, en este caso, a p artir del cdigo fuente preprocesado. C uando se efecta e liokeo del cdigo objeto, finalm ente, se crea un archivo binario:
S gcc n c .o -o f-cla

Espero que con esto el lector p ueda ad v ertir que es mucho m as sencillo u tili zar la sin ta x is'a b re v ia d a , g c c h o l a . c -o h o la E l ejemplo paso a paso dem ostr que uno puede detenor y com enzar la compilacin en cualquier etapa, si surgiese la necesidad. Una situacin en la cual uno puede realiza r la compilacin paso a paso es cuando se e st creando bibliotecas. En este caso, uno solo desea c re a r a rch i vos objeto, de modo que la etap a final de linkeo resu lta innecesaria. O tra c ir cunstancia de realizar el proceso de compilacin paso a paso es cuando un archivo incluido m ediante tf in c lu d e produce conflictos con el cdigo que e lector ha redactado, o ta l vez con otro archivo insertado con # in c l u d e . Re correr el proceso paso a paso p erm itir ver con m ayor claridad cul es el a r chivo que genera el conflicto.
U tiliz a c i n d e m ltip le s a r c h iv o s d e c d ig o fu e n te

La mayora de los program a* de C consiste do m ltiples archivo* de cdigo fuonto. do modo que cadfl Archiv fuente debo se r compilado a cdigo objeto antes del paito final do linkeo. E ste requerim iento se satisface con facilidad Slo se requiere proveer a g cc del nombro de cada archivo do cdigo fuenu* que no deba compilar, g cc se hace cargo del resto del proceso La invocacin de g c c nera sim ilar a la niguiento:
t jc c ir c r t v o i. c * rc n u o 2 .c arcn:vo3.c o tarejjroorw w

g cc prim ero crea a r c h i v o I . o , a r c h i v o 2 . o y a r c h i v o 3 . o ante de linkeario t entro s para cre a r n o m b ro p ro g ra m a .


* ,, E je m p lo

v /iE ) ^ pg

Supongam os que so desee com pilar n u e v o * h o la , que utiliza cdigo prove m ente de dos mdulos, m o s tr a r , c y m e n s a je s .c , y un archivo do encabezado. m sg . h:
/ Noore do prograaa un Internet: sh o m t.c / nj*vc_floia.c / {J - ------------- o o s t r a r .c -----

r
n o stra r.c _ Contralaor c* p an talla

i UKluc* tdio.h
irc uo 1nansaJt.n

int Bain(void) (
cnar ne 3a ] _ C io n v o n :d a ;i * { H ola, p.-o gran ao ar.'* } ; o r a r fls a j8 _ d e s p e < J o a | = { * :A o i s , p rsg ran a d o r: } ;

Captulo i : Compilacin de programas

13

2 ';rr*:

" t r* rrWjs_fcienveiida};

iacri,-u-_S5n3s:. r.saj4_2C4di.;s| T ; > / fcnjijg.h

/
. E rtjc s ic c (Je 7*nsa).C

t*SV.E_H_ M ifise ssyt_-_


1 3 UOfii*_r*a j * {c* ar

/*

------------------------------------------- ------------------------------------------w m jB .c

?"ta;*.c - fyftctefl 5?m:3a r. o*rj*.n


in c l flt sto io .n

iriioa* 3i3 ucfau.*_*n*j*|cMr *M nu|t) < M rtt'C 's .rt*. ?!:); > El com anda p ara com pilar estos p rogram as, y por lo tanto para crear n u a v o _ n a la , es:
S ;< c M f i U ] . : s e s t e a r c o flw v o jt o la

Al correr este program a, su 3alida 3er la siguime: 3 ..i^tve_noIa Aics. 3 rc-5."sU 20<r i gee recorre las m ism as etap a s de preprocesado-com pilacin-linkeo que a n tes. sta vez creando archivos objeto p a ra cada archivo fuente an tes de pro-

Programacin en Linux

ceder a crear el archivo final binario. n u e v o _ h o la . T ipear comandos largos corr.o ste puede volverse tedioso, sin embargo. En el capitulo 2, C ontrol col proceso de compilacin: el make de GNU", se ver cmo resolver este proble m a La prxima seccin p resen tar la s m uchas opciones de linea de com an do de g cc.
O p c io n e s y a rg u m e n to s

Lu lista do opciones de lnea de comando que acepta gcc ocupara vara p a ginas. do modo que lu labia 1.2 p resen ta slo las m s comunes Tabla 1.2. Opciones de linea de comando efe gcc ___________________________ Opcin______________ Propsito_________________________________________
0 nom a r c h iv o Designe l archivo de salida n o n _ a r c h iv o (no necesariamen te! cuanto so compila cdigo objeto). Si no *e especifica el nombre ele eate archivo, la opcin prodetnrminad* o s a . o u t Compltor sm OnkOf. Defino un macro de proprocoindor f oo con jn valor b a r en la linnd J' Comando. SllOa 'a ruta de acceso o directorio espociricooo on < -u ta _ d ir ii comlen/o de ia lista de directorio en que gcc busca los ar chivos .i incluir por la proaancia do directivas I n d u c e Sita :n ruta de acceso ni directorio sp^c-flcaco on r u t a _ d i r ai comienzo de j lista ce directonos en que gcc busca arcm vos de biblioteca. Como opcin predeterminada. gcc linKea bi bliotecas compartidas. Unkea bibliotecas estticas. LinKea ia biblioteca foo. incluyo en el archivo binario informacin estndar ce depuracin. incluyo en o! archivo binarlo muchsima Informacin de a p u ra cin que slo pueda interpretar el depurador del GNU. gdb. Optimiza el cdigo compilado. Esto es equivalente a especificar - 01 . Especifica un nvel ae optimizacin n. 0<*n<*>3. Coloca el compacur en modo ANS1/IS0 C, no permitiendo ex tensiones GNU cue generen confiteros con dichos estndares. Muestra tedas '.as advertencias Que reouiere e- ANSi/ISO C es tndar. Muestra todos los errores Qi,ie requiere el ANS/!SQ C estn dar. Habilita el apoyo para ia sintaxis de! C ce Kerr.ighan y Stente (S el ector no comp/ende o que significa esto, no se preocupe por eiio; oasta con saber que Kernignan y Rltcfve fueron ios aiseadores fiel C originan. Suprime ccdos los mensajes de avenencia.

C D f o o -b a r r u t a _ d ir

-ir u t a id ir

s ta tic lfo o 5 ggcb


-O

-On
-a n s

-p e o a n tic
-p e a a r.c ic - a r r o r s tra o itio n a l

-Wall

Exhibe todas ias advertencias generalmente aplicables que


puede proveer g c c . ?a- ver advertencias especificas. Jtilice W toarning.

Coc.tir.n

C s C m j Io i

Compilacin de programas

1S

Tabla 1.2. C< yiVruad.r ____ __ _____________ _________________ Opcin_____________ Propsito__________________________________________ e rr o r


VW

Er- lugar de generar advertencias, gcc convertir las adverten cias # errores, deteniendo ia comolactn,
Emitir -na lista d e d e p en d e n cia com patib le con m a k e. til p a ra c re a r una n t a k e f l i e en un n royecto co m n llc sa o .

v Muestra sos comandos yolIzados en cada ctaoa de o c<*rD t>c>n Ei lector ya ha visto cmo operan -c y -o. Si no se especifica -o. sin e m b a r go. para un archivo do en tra d a denom inado n o m _ a r c h iv o .e x t (donde e x t represen ta cualquier extensin de h o stn tre s caracteres), la accin p re d e te r m inada de g c c ser denom inar al archivo ejecutable a .o u t, al archivo obje to no<r._archlvo - O. y *1 archivo en lenguaje ensam blador n o i r a r c h tv o . s. La salida del p rep n x esad o r va al dispositivo que se encuentre establecido como S td o u t (dispositivo e stn d a r de aalid.t).
ARCHIVOS OE 8 IB U 0 TE C A Y DE INCLUSIN

Si m dispono do archivos de biblioteca o de inclusin situados en ubicaciones no estndar, las opciones - l r u t a _ d i r y - I r u t a _ d i r perantn jv.pod fk-nr dichas ubicaciones y aseg u rar que se busquen ios respectivos archivos en esas ubicacin*!' a n u d* hacerlo un la^ e st n d a r (las asignadas por ol com pilador como predeterm inadas} Por ejem plo, i <te alm acenan lo archivos de inclusin h ab itu ales en / u s u a r i o / l o c a l / i t u s _ i n c l u s i o n e s , p a ra que gcc los encuentre la invocacin a gcc debera ser algo parecido a.
5 jc c i f f l U . C
:/ u u irtO /iO C * l/ U _ irc L ;H O I, * l

De m anera s un: lar, supongamos que el lector est comprobando una nueva bi blioteca de programacin, li b n u e v a . a. que est corrientemente alm acenada en u s u a r i o / l o c a l i S _ b ib liO te c a $ . an tes de inatalarla como bibliolecu estndar de sistema. Supongamos tam bin que los archivos de encabezado es tn almacenados en . j s u a n o / l o c a l r a is _ in c lu s io n e s . Consecuentemen te. para linkear l i b n u e v a . a y ayudar a g cc a encontrar los archivos de enca bezado. el comando g c c de inea de comandos debera sor sim ilar al siguiente: i 5: : ai_icliaseis.e -!/uiuno/lecIrcis_inclusLafls L/u:niriij/lc<i/til3_atD i:a t :s i Ir -.* va

La opcin -i le indica al im ker que tom e cdigo objeto desde la biblioteca e s pecificada. El ejempio an terio r vinculara l i b n u e v a . a.
CONSEJO
Lr-a :o-i*-on uttX de .',-; c a s rfe?j<e q u e tas tubliotecas s e daronv-en l i O { a l g n n ootore) , y g c c , a r o t u l e s compiladores c e UNIX y ac- Linux, se s s s a er d t a co o w rb n . Si c- ectw no -. opofln - :-_arco vincula o ic c e c a s g no oro.= tv5 .t 3 r<5 s c ^ s o 3 3 s i oteca 3 vinculada. H etap a c e Itaxeo .-o tsficr xito y k c =r t ' a r e r s s e 3e s r a aC uco-oo n-f^-enr. $ 3 rnir i *nointire.aa- funcin"-

Como opcin predeterminada gcc utiza bibliotecas compartidas, de modo que si el lector necesitara vincular bibliotecas estticas, deber utilizar la opcin s t a t i c . Esto significa que slo se utilizarn bibliotecas estticas. El siguiente ejem pio crea un archivo ejecutable vinculado contra la biblioteca esttica ncurnes: S ce 35lic_c-r*s.c lucirse* -s:s:ic Para =;.-=rc=- = aregranar cen nc.-ses. .er *Uns n:=r~az A PI 26 .sueno en medo texto', pg.213.

) / ) . )

>

'

Programacin en Linux

Cuando uno vincula bibliotecas estticas, el archivo ejecutable que se obtiene resulta mucho ms grande que cuando se utilizar, bibliotecas com partidas. P ara qu utilizar una biblioteca esttica, entonces? U na razn habita] es p ara garantizar que los usuarios puedan utilizar el programa: en el caso de las bibliotecas com paradas, el cdigo que necesita un program a para poder co rrer se linkea al mismo dinm icam ente d u ran te su ejecucin, en lu g ar de serlo estticam ente d u ran te su compilacin. Si la biblioteca com partida q u e requie re ei program a p ara poder ser corrido no se encuentra instalada en el sistem a del usuario, el mismo obtendr errores y no podr correr ol program a. El navegador N etscape constituye un ejemplo perfecto de este probiema. N'etscape se basa fertem onte en Motif, u n costoso toolkit de program acin en X. La m ayora de los usuarios de Linux no pueden afro n tar el costo d in stala r M otif en su s sistem as porque ol mismo cuesta dem asiado dinero, de modo que N etscape en la prctica in stala dos versiones de au navegador *en su sistem a; una que linkea bibliotecas compartida, netscape -dynMotif. y una que vincula bibliotecas esttica, netscape statl/otf. El propio archivo ejecutable de N etscape es en realidad un acript de interfaz que de term ina si el usuario posee in stalad a la biblioteca com partida do M otif y ac tiva uno u otro de tos archivos binarios, segur, sea requerido.
E je m p lo s

1 Esto ejemplo eren unu biblioteca esttica, lib m e n s a ) e s . a. Los comandos requerido p a ra hacer esto aon:
SJCMPIO

S jc c

: * # ns j .c -o libJ>snja|oa.o

S ir re lit e n a iie j.,i !ibotn&a]s.o Recurdele en un pargrafo a n terio r do este capitulo que* -c le indica a g cc crear un archivo objoto denom inado, en este caso, lib m e n s a j e s . o. la se gunda lnea utilizu l comando a r pura crear una biblioteca esttica denom i n ada l i b m e n s a j e s . a a p a rtir dol mdulo objeto, lib m s g . o. El *j**mpio si guiente utiliza esa lbioteca.
Para jprenor m fls SCOte el com ando v , v a r B com ando ar*. p 3g- 301 .

eiEMPio

2. Ahora el lector dispone de u n a biblioteca para poder se r linkeada. Le de ber inform ar a gcc dnde en co n trar el archivo de inclusin, utilizando I. dnd<* encontrar la biblioteca, em pleando -L, y el nombre de la biblioteca, utilizando i, como se ilu stra aqu: S gcc aov.rar.c 1 nu#vo_nola_Ul) -I. -L. Inansajea Un ejemplo an terior creaba n u e v o j i o l a compilando juntos m o s t r a r . c y mensa j e s . c. Esta vez. creamos n u e v o _ h o la _ lib linkeando la biblioteca es ttica lib m e n s a ] e s . a . Este ejemplo cre un archivo ejecutable denominado n u e v o _ n ala l i b (el nombre fe elegido aqu p ara distinguirlo de! que se em pleaba en 1 otro ejemplo) vinculando a lib m e n s a j e s . a , f -Im en sa] e s i u b i cado en el directorio de trabajo corriente (- L . El punto (.) situado ai lado de la Letra L representa el directorio corriente. La salida do este program a se lis ta a continuacin:

COtufO 1: Compilacin da programas

17

*1 _ ;

^ 5 V ja o I _ Iic

Tifr-U,

5 - 5CO '

M tO s , c ^ o g rs a M c r!
SA LID A

VERIFICACIN DE ERRORES Y AVISOS

QCC ofrece to d a u n a gam a de opdone-s de lnea de comando p a ra verifica* c:n ce errores y generacin de avisos. stas incluyen -ansi, -pedantic, oodantic - e r r e r s . y -Va 11. A modo de comienzo, -pedantic le indica a gcc em itir to d as ias advertencias requeridas por el estricto ANSl/ISO C e s tndar. Todo program a que u tilice extensiones prohibidas, tales como los aceptados por gccr ser rechazado, -peaantic -errors se com porta de m a n era similar, excepto que em ite m ensajes de erro r en lugar de advertencias, -ansi desh ib ilita las extensiones: GNU que no e ajusten al estndar. N ingu na de esas opciones, sin em bargo, g a ra n tiz a que u n cdigo fuente, a u n cuan do compile sin erro res al utilizar alg u n as o todas estas opciones, sea d e n t por ciento concordante con ANSI/ISO La opcin -W a ll in stru y e a g c c a que exhiba todaa las advertencias gene ralm en te relevantes que pueda - n relacin al cdigo que C9tii Siendo com pi lado. W all em ite avisos sobre cdigo que la m ayora de los program adores consideran objetables y/o que sean sencillos de modificar para e v itar la ge neracin de la advertencia. Un ejem plo de raain prctica de program acin es d ecla rar una vuriablw pero no em plearla. O tro es d eclarar una v ariable sin establecer explcitam ente su tipo.
E je m p lo s

Considerem os el siguiente ejem plo, que m u estra u n a muy m ala prctica de program ador: En el mismo se d eclara m am como retornando v o ic l, cundo de hecho n a in retorna i n t , y u tiliza la extensin GNU lo n g lo n g n t para d e cla rar un entero de 64 bita.
noaer i*', crog*aa !*>tdrr.e?: oe<Snt.c '/

i - CoaprU'- sucesivaM At* u t i l i r i r c a p r u r o p*<antic y f M la t o t -j< nntie-*'Tors - s i . Ivego


/

ro a in (v o ifl)
t

Icrg i233 iitt 1 - 01;


Svts ("EsTi r.o 5 un arog.-aaa que CLnoia con Lai re g ias de C ')
)

Programacin en Linux

1 Primero, tra te de compilarlo utilizando verificacin de no conformacin.


$ gcc o*Gan.c -c peflant sed an :.c: In funcUon M in ':
int*

sdant.c:6: am ing . raturn tyjx of naln1 la no* 2.

s a lid a

Luego, compile utilizando el especicador - a n s : * - - -

p t a a .i t .c : l : w a rn irg : r :u r n ty p * c* 'o u in * : s not ln t '

S4L,*

Lo que m u estra eata salida os que - a n s obliga a g c c u em itir los m ensajes do diagnstico requerido por o estn d ar. No garan tiza que su cdigo re s ponda a las norm as de ANSI C. El program a com pilara a posar de ia inco rrecta declaracin de m a m . 3. Ahora, utilice - p e d a n t ic :
'iMttnt

pe<Jan t.e; 9 : m m in g - M S I s a lid a

doca not su p p o r:

lo n g ' n t*

p *can t e : - warmrvg: ra tu rn typa o f

n a in ' la not

N uevam ente el program a compilar, a posar de las advertencias em itida 4. F inalm ente, utilice - p e d a n t i c - e r r o r s : -- 1 ;,c -o peaant *
-*
s a l i d a

3 4 c a n t .c :3 : A.VSI C ao<s$ not auaport }e a a n t .c :8 : .-eturn typ e o f

lo.ng lo rg * iftt1

n ain ' i M t

E sta vez el program a no se compila, g c c se detiene despus de exhibir los diagnsticos de error requeridos. A riesgo de parecer reiterativo, las opciones de compilador a n s . p e d a n t i c y - p e d a n t i c - e r r o r s no aseguran que se produzca un cdigo que cu m pla con las norm as ANSI/ISO. Las mi3ma3 m eram ente lo guian d u ran te la compilacin. R esulta instructivo se a lar el com entario que aparece en ia do cum entacin de g c c sobre ci uso de - p e d a n t ic : Esta opcin no se pretende que sea til; existe solo p ara satisfacer a p e d a n tes que de no ser asi alegaran que GNL' CC no responde al e st n d ar ANSI. Algunos a su a n a s tra ta r, de utilizar - p e d a n t i c p ara verificar la e stricta a d herencia de sus program as al ANSI C. Pronto en cu en tran que no hace del todo lo que desean: detecta J g u n a s prcticas no ANSI, pero no todas; solo -.quellas p a ra las cuales ANSI C requiere u n diagnstico."

Caoftulo i : Compilacin de programas

19

OPCIONES DE OPTIMIZACIN

La optimizacin del cdigo es una ten tativ a de mejorar el desempeo de un pro grama. La desventaja consiste en m ayores tiempos de compilacin, mayor ompleo de la memoria d u ran te la compilacin y. tai vez, mayor tam ao de cdigo. A ctualm ente, g c c tiene tres niveles de optim izacin. La opcin -o sin a d ita m entos le indica a g c c que reduzca tanco el tam ao del cdigo como el tiem po de la ejecucin. Es equivalente a -01 Los tipos de optimizacin realiza dos a este nivel dependen del procesador al que se a p u n ta, pero siem pre incluyen por lo m enos optimizacin de hilos do comandos j ump (aaiter a) y diferim icnto de comandos COP retorno d e valorzi de registros) desde la pila 'stock Las optmuzacione3 de hilos de com andos j ump in ten tan reducir el nm ero de este tipo de operaciones Los diferim iento* de p o p s desdo la pila tienen lu g ar cuando el compilador perm ite que lo* argum ento He acum ulen en la pila a m edida que las funciones re torn an valores y luego los regresa s i m ultneam ente, en lugar de ir reto rn an d o los argum ento de a uno por ver,, cuando reto m a cada funcin llam ada. L'is optim izaciones de ruvel 02 incluyen todas las optimizaciones de nivel 01 m s toque;, adicionales que se vinculan con la m anera en que se llevan a cabo los comandos del procesador. En este nivel de optimizacion. el com pila dor in te n ta g a ra n tiz a r que el procesador cuente con comandos p ara ejecutar m ientras espera por ios resultados de o tros comandos El compilador ta m bin in te n ta com pensar por ia tard a n z a de datos, que es l dem ora ocasiona da por 1 tiem po que requiere o btener d ato s desde el escondite" o la memo ria principal La m iplem cntacn de e s ta optimizacin depende en gran p arte del tipo de procesador sobre el q u e se realice. Las opciones -0 3 incluyan todas las optim izaciones 02. desenrollo de lazos y otras prestaciones muy vinculadas con el tipo de procesador. Segn sea la cantidad de conocimiento a bajo nivel que uno tenga sobre una fam ilia dada de CPU. podra utilizar la opcin f f Lag para requerir las opti mizaciones especificas q u t s* deaea llevar a cabo Tres de esos indicadores flags merecen consideracin, - f f a s t t n a t h , in lin e - f u n c ti o n s y -fu n r o l l - lo o p s - f f a s t o a t h genera optimizaciones sobre las operaciones m ate mticas de punto flotante que a u m en tan la velocidad, pero violan estndares IEEE y/o ANSI- - f m i m e f u n c t i o n s expande todas las funciones 'simples d u r a n la compilacin da un programa, de m anera sim ilar a I03 reemplazan de los macro rn el preprocesador. Es el compilador, sin embargo, el que decide cul constituye una funcin simple y cu l no. - u n r o l l - lo o p s instruye a cc p a ra que desenrolle todos los lazos que te n gan un nm ero jo de iteraciones, siem p re y cuando dicho nmero de ite ra ciones pueda ser determ inado d u ran te la compilacin. D esenrollar un lazo significa que cada iteracin de-, mismo s e convertir en una sentencia indivi dual. Asi, por rjemplo. u n Lazo que conste de cien iteraciones se convertir en cien bloques secueadales de cdigo, con cada uno de ellos ejecucando las m is mas senter.c-.as. La g u ra 1-2 ilu stra grficam ente un desenrollo de lazos. Obsrvese que La gjr a sim plem ente m u e s tra el principio general del desen rollo de lazos. El mtodo que emplee g c c puede ser drsticam ente diferente.

,1

J-

>

>

.1

Programacin en Linux

Las optimizaciones que h ab ilitan - f i n l i r s - f u n c t i o n s y - f u n r o l l lo o p s pueden m ejorar er. form a n o tab le la velocidad de ejecucin de u n pro gram a porque ev itan la acum ulacin de llam adas a funciones y b squedas de variables, pero el precio es h ab ituairnente un g ra n increm ento e n es ta mao del archivo ejecutable o e l archivo objeto. Es cuestin de exp erim en tar para determ in ar si el aum ento de velocidad de ejecucin ju stifica el aum ento del tam ao del archivo. Ver las pg in as de informacin de g c c p a ra obtener ms detalles sobre los indicadores (fiags 1 - f p a ra el procesador.
I - 8;

s n n t f f SCS.l , i ) . 1 - t: pr:nff i . il:

i - l:
1

; <, -9.' 1 prlnrri M \< > , .1 i;

prw tf{*d\ii, i l; 1 - 3; s r l n ; r i vj'.n , i ) ; i - :

i - 5; prllUf< t - 0; i - :

i; , l|

p rl n ir < v j i n , t ) ; p r i n t r i > \ t , i t ; i 9:

flflfKft *U . II; t i;
p n n t f ( S i n , x j ;

F in u ra 1.2. E l desenrolle de lazos expande os lazos de manara sim ila r a la que < lprepi'cesador expande los rnacros.
CONSEJO
GeriH.i-monte. con ur nivel d i Oftimtacin o 2 resulta aurlclcn'.c. An i>n prof/amnn OJqucrios. toles como ol do la artmoni u*cclrt jompio' al fiom ionio do esto capitulo, el <Ktor ;ipr<Jcir) pdq-eAtw rrt(iucclOr<5 s on ol tnmaio dol cdigo ooueftos Incremt-^. tas e r ol dosomc*<to.

E je m p lo

ejemplo

Esta situacin utiliza el mximo nivel de optimizacin, 03, p a ra com pilar los listados 1.2, 1.3, y 1.4. Comparo ul tam a o dl program a optim izado con el tamao dei programa no-optimizado.
S qcc -03 wnsajes.c nostrar.c -o nuevoJioia 5 is - i iuevojiola x p- x r
x 1 k u r t _ - a li u s u a r io s

12091 Ju ! >3 2 ! 36 n u evc_.io !*

SAUOA

s gcc -00 n e . i $ a ] s . s t . - s r . c -o n u d v o jio la S ia l n u e vo jto la

r**

r - * r - l juirtjraU

usuarios

12137 ju l :3 :: 2? num_noia*

La opcin -0 0 desactiva coda optimizacin. A unque la diferencia es peque a, slo 16 bytes, debera resu ltar sencillo com prender que program as ms grandes producirn mayores ahurros de espacio en disco.

Capitulo i : Compilacin de programas

21

OPCIONES DE DEPURACIN

'

Los erro res h:igs i son can in ev itab les como la m uerte o los im puestos. P a ra sobrellevar esta tn sce realidad, utilice las opciones -g y -ggdb de g c c p a ra in s e rta r informacin de depuracin en su s program as compilados. E sta s op ciones facilitan :3s sesiones de depuracin. La opcin -g ad m ite tres niveles. 1 .2 o 3. que especifican c u n ta inform a cin de depuracin incluir. El niv el predeterm inado es 2 ( -g2), que incluye gran cantidad de ta as de smbolos, nm eros de lneas e informacin sobre variables Iccales y externas. La inform acin p ara depuracin de nivel -3 in cluye toda !a informacin del nivel 2 y todas las definiciones de m acros p re sentes. El nivel 1 genera slo la inform acin suficiente para c rear rastreo s h a c a a tra s y volcados de pa. No g e n e ra informacin de depuracin para variables locales ni p ara nm eros d e lnea. Si el lector piensa em plear el depurador GNX'. gdb -cubierto on el captulo 20, *La toolkit do depuracin*i. el empleo de la opcin -ggdb crea informacin adicional que facilita las tareas de depuracin bajo g d b . La opcin ggob acepta el mismo nivel de especificaciones que -g. y stas producen los mismos afectos sobre la salid a del depurador. La utilizacin do cualquiera de las dos opciones de habilitacin del d epurador increm entar notablem ente, sin em bargo, #1 tam ao de su archivo ejecutable.
E je m p lo

Este ejemplo le m uestra cmo com pilar con informacin de depuracin e ilustra e! im pacto que los smbolos, que controlan la depuracin, pueden te ner n t! u m a o de un archivo ejecutable U na compilacin y linkeo com u nes dl Listado l i produjo u n archivo binurio de -1089 bytos on mi sistem a. Los tam aos obtenidos cuando com pil el mismo cdigo fuente con las opcio nes -g y -ggdb pueden llegar a sorprenderlo:
S
|T *

;:c ; *o*.e HoUjj


l 1 M i

1 * u r t_ a ill * S jcc -59:2 n c U .c -o iola_ 5fldO s i s - 1 s o U _ :5

usuario

Ju i 13 21:09 llOlSJ)*

- r

- - i

* - t u irtjn ll

jsuarios

3S4fl7 Jul 13 21.35 nola_3ga3*

Como se podr apreciar. la opcin -g increm ent el tam ao del archivo bina rio re su lta n te en un cincuenta por ciento, .m ien tras que la opcin -g g d b in fl el mismo archivo casi un novecientos por ciento! A pesar del au m ento de tam ao, se debera proveer a los archivos ejecutables con smbolos e st n d a r de depuracin creados utilizando -g) p a ra el caso de que alguien encuentre algn problem a y tra te de d e p u ra r el cdigo en lu g ar suyo.

Programacin en Linux

C O N S E JO Como .-eg:a general, depure peero, optimice casp as. No nterprete. sin er-.Dargo. oue opi.'miza? wpuds signifique '^o tener en cuenta la eficiencia {Jurante el acceso de diseo'. La optniizacirt. on oslo contexto, se refiere a las testaciones Que M roiJuce el compilador, comentadas en esto seccin. Un 'jen diseo y algoritmos Ociemos tu;non mucho mayor Impacto en C J dftiOmoe'O global Cu o que pueda lograr cualquier PO < 3 c 'otlmiiacin lograda por el compilatfO. n verdad, si uno so tona el tiempo nece sario raro croar un sisoo adecJBdo y utiltta algoiitmos rpidos, puedo no llegar a .-eslT.v optimizar, aun cuando probar oslo ltimo nunca viene mal.

Extensiones del GNU C


La implo mentacin dot GNU C extiende el ANSI C e stn d ar do dsversan m a neras, Si al lector no lo im porta escribir u n cdigo que ab io o am en te no rosponda al e st n d a r ANS/1S0, algunas do estas extensiones pueden so r m uy tiles P ara en co n trar un tratam ien to completo do los extensiones del pro yecto GNU, el lector con inquietudes puedo referirse a las pijir.aa de infor macin de ce wri upecinlt pruebe el comando i n f o g c c *C e x te n s i o n s " ) . Las extensiones cubiertas en esta seccin son Ihw que se ven frecuentem ente on lo encabezados del lcernol y el cdigo fuente de Linux. P R E C A U C IO N i aroaoma ccn ti co>go lio csimda* os doblo, En cxvner lug', si uno esta utilica-v ex in-aiooas GNU. 3u cdigo solo compilar odeojad#monto, ni o, quo directame-te compi H gcc, 3 otro probleno s qy* loa cdigos no estndar r.o adhieren a Us no/ma* ANSl/iSO. Muertos usuarios utilizan on su compiladores a menor conload posible < Jo espocifcadorea <ie compilacin, do meco qun loa cdigos fuente cue no conforman a os osMnoaros ANSI/ISO ro ampliaran La poltico ms Inteligente, si uno desea Inouir cartenaticat* no star-dar on al csico de su programa, es encerrarlas ontre directivas ffiae para permirr su compilacin condicional. n ei grupo de noticias Como.iang.c o pondran poco menos que en ra nata negra por utilizar cdigo no estanca-. Para proveer unidades de alm acenam iento de 84 bits, por ejemplo, g cc ofre ce h! tipo long long int, utilizado r*n el Listado 1.5. 0rt<j ior.g ;ar_eni5r3_lar>3a; NOTA ico long long in t tv r i j parto oe! borrador del nuevo estnaar 150 para C - Esto ltimo os todava un corraccr. sin srreargo, i- cu*; ttrJi pocos compiladores aceren wc aiora. S n la plataform a x86, e sta definicin da cuino resultado u n a ubicacin de 6-1 bits 6 mem oria denom inada l c n g _ i n t _ v a r . O tra extensin g cc que se e n co n trar en los archivos de encabezado de Linux es el empleo ce funciones inlne. Siem pre que sea lo suficientem ente corta, una funcin inline se ex pande en el cdigo compilado cas: de la m ism a forma en que io hace u n naero. elim inando as el costo de una lla m a d a a 'ana funcin. Las funciones inUne son m ejores que los raseros, sin em bargo, porque ei compilador verifica su tipo d u ran te la compilacin. P ara u tiliza r funciones inline. la s tiene

Cac a lo i : Compilacin de orogramas

23

que com pilar con. por o menos, u n a optim izacin -0 y preceder la definicin de la funcin con la palabra reserv ad a i n l i n e . como se lustra aqu:
UillT'* i-.t VKr&nnz a r ;n t *.'
( C a }-*; >

La p alab ra reservada a t t r i c u t e le su m in istra a g c c m ayor informacin sobre su cdigo y ayuda ol optim izador de cdigo a roaliznr su tarea. P aro utilizar un a trib u to do funcin. la reg la general s aifrygarl*?__a t t r i b u t e __ '3 t t r i D u t e _ r a ^ 9 ) ) desp u s del parnte?tB de cierre de la d ecla ra cin de la funcin en que se lo emplee Por ejemplo, las funciones e stn d a r d e biblioteca, talea como e x i t y a b o r t , nunca retornan, as; que el com pilador puede g en erar un cdigo ejecutable li geram ente m s eficiente s: se le inform a que esas funciones no re to rn an Por supuesto, los program as a nivel de u su ario pueden definir tam bin iuncionws que no reto m en g c c I* perm ite j uno especificar ol a trib u to n o r e t u r n pura dichas funcior.es. que act a como u n a joi\al para que el compiludor op tim ice la funcin. Asi, supongam os que *e tiene una funcin denom inada t e r m i n a r _ S l_ e r r o r . que nunca reto m a Su declaracin ten d ra el siguiente aspecto: roid t*r*i%a.*_i_*<Tor/.ciii _ i t t r l3-j?*__ ||aorturn)) N orm alm ente se la definira as: iota tr-ira.*.SI_rrorlvoi|
i

! ' 1 codujo t i aqu /


)

Tam bin sz pueden aplicar atrib u to s a las variables. El a trib u to a l i g n e d in stru y e al compilador p ara que alin ee la ubicacin en m em oria de u n a va riable sobre u n lm ite de byte especificado. A la inversa, el atrib u to p a c k e d 1c- indica a g cc que utilice la m nim a can tid ad de espacio requerida por va riables convencionales o de tipo s t r u c t . U t a d o con v ariab les de tipo s t" u c * . p a c k e d elim inar cualquier tipo de relleno que g c c norm alm ente in s e rta ra con propsitos de alineacin. U na extensin terriblem ente til es -a de rangos p a ra las sen ten cias c a s e . La sintaxis es sim ilar a :a siguienteYAjW . . . v a l

J- )

>

Program acin en Linux

Obsrvese que se requiere de a i menos u n espacio antes y despus de los puntos suspensivos. Los rangos p a ra c a s e se u tilizan en las sen ten cias s w itc h p a ra especificar valores quo caen en tre v a i o r _ i n f e r o r y v a i o r ^ s u p e r i o r , com? lo ilu stra el siguiente fragm ento de cdigo:
s w i$c h (v a f_ e f> t8 ra) {
C 0 S9 3 . .. 2 :

! s i codicc va aqu 'I break; casa 3 . . . 5:


>

Este fragm ento ca equivulent.e ar


} i* c h ( v 9r_ ite ra > case i:
css 2 :

1 c c lg o v.i a q u /

c re a k ; case i .

caj 4:
u n 5.

O bv.am entc. ol rango do c a s e ea im plem ento uno notacin abre viuda pera la sin tax is tradicional do la sentencia s w i t c h , pero es realm ente conve niente

Ejemplos
( IIM P I.0

l Este ejemplo ilu stra ! empleo do la palabra reservada m l i n e . El progra m a ite ra por un lazo 10 voces, increm entando una variable con cada iteracin. I" onDrn del aroijraiTa en Intornet: m lm c .c /
/
u iIla .c

- U d l i 2 acicn de la calaora reservada m i lne, que per i te

generar furciane axoaraioles durante la concilacton


/

:ncl'ja<* <3tdic..r* inllfle u it increneirari Lnt *3)


C

Captulo 1: Compilacin de programas

25

C a * * :

irr jrr(void| ( iflt i ;


h iie f i < i) {
I T C T fe e flta 't ;

p riitfC S c \
>

ii:

o n ntfC M *);
r t f jr c I. >

En un ejemplo ta n 3imple. es posible que no vea increm entos o dism inucio nes significativo* en lu velocidad o el tam ao dol cdigo, poro el ejemplo s ir ve par ilu stra r cmo u tiliz ar la p a la b ra reservada m i m e . 2. Est* jemplo m uestra como u tiliz a r la palabra reservada a t t r i b u t e y el atributo n o r e t u r n y ta m b in cmo u tiliz a r rnngos para c a s e . /* V3e.** 3*1 cojraiM nort.c /
r

ro_*ttorrto.c - EncUc -3*1 a tr is u to ivrturn


l

voic n r 9 u w _ * r 6 r / ; i d j _ ttrio jt _ _ | ( n o rttu m ) );


m i u :n (v o :3 i

l ir .i i 0 ;

zm

... 5:

p r i a r r i * t * * j\n * . l ) ;

Programacin en Linux

ae^ au lt: t9rai.ia-_aha-ai I


1

r u r n 0;

i
oid t9nn.nar_Blra(void>
<

putsi , :rmanoo aora );


M itin j )

Tenga cuidado, cuando radacto an cdigo que tenga un Ijuo infinito como el lazo f u l e do este program a, que oxs.sfcn un punto d r nalida. tnl como salir dol lazo cuundo el contador del minmo alcance cierto valor. Para nuestros props:tos actuales, sin embargo, el ejemplo ilu stra perfectam ente cmo fu n g ona i\ *xT<rui0n que perm ite especificar el rango do c a s e . La salida dr> es te program a es:

i i
S ALIO A

i 2
i - 3

i * *
1 * 5
tertinaftcc ora

La extensin para la especificacin del rango de case se comporta d t lu mism a m anera en que lo h ara una sentencia case normal. Cuando i alcanza el valor 6. el flujo de; program a liega al bloque def ault, se ejecuta terminar_anora, y el program a termina. 3. El ejemplo final ilu stra el efecto de u tilizar el atrib u to p a c k ed con una estn icru ra . El program a m eram ente im prim e el tam ao de las e stru c tu ra s y sus miembros constitutivos.
* Noncre Gal prograna an In :s rre z : pacxne.c /
r

* c&rsactar.o - -iU M C i> n del atributo m c s c 30 ecc

Captulo 1 Compilacin de programas

27

elud <s:do r>

* /.i st*uetvr r w s M '


S tn jc t CCVPiC'O k {

SAor* > T ir_ irrts lo I3 : loog 1;


c f ir t#svoco_rc*slo[5J;

_I t t r i t u t __ |(P4CrtM ;
/ tffta s tru c ta rj oonwi tin esapteti- / i trust v c a u i < fcOft p r lM '^ t r r v g lo t S l.

I;
Chjr i5 a rta o _jfr;lo lS I;

y, tflt UlrfvOMI (
trjct C3MPACTACA ca:**a;

t r a e : \6Mtu. yfipacttd;

ta p ris ir l tinaco e : - aero p ira propositas a* conuaracian / *pfltft*t3uT s iio o f(c a r) S ); ei t lu A o

t i a u r s*$uM c,*rr$:a{5| - W & ytW \iT,


*1 ta*ar.o ss ion? - se aytesi-i', si;esr(ls<\g)>

f p r i r t f ( jxuact, * fp n fttf(K O O -j, i i M f f s w r : ) 3 ):

t i ! W V o anort Sf uw r_i.'r* g i3 [3 ] Vj oyt*\r*.

rasaros ccficarativcs 2a i fpriir? s :i * oar<a- ) ; prior*(stoaut * *

2os itr-jc turas

! h aytas'.n',

*1 taaaftc aa La estructura conpacTSfla -

. rssa.ic := la astruiiT-ra sin cwoactar * :i Dytes^n",

j n f j'MCte<5|; rerum a,
i

Programacin en Linux

Para utilizar cualquiera de las extensiones de G NU al lenguaje C no se re quiere ningn comando especial de compilacin. Compilada y ejecutada, la salida de este programa es la siguiente:
3 gcc coipacrar.c -o cwcactar 5 ./csflpactjr ?l tarara d* ci-ir 3&gnCo_arrIal5j * 5 Cytes el ta,io do torg * fcyles <1 tw iAo

ie sftoct orifle-.afsglaia! - 6 sytes U estructura sifl jenpactar * 20 bytes

9i t3Mfto de la estructura cor.uactsta = 15 Dyt9$

<1 tanan

Los dos elementos fueron definidos con m iem bros idnticos. La nica dife rencia fuo el agregado del atributo p a c k e d a la estru ctu ra P Como lo deja en claro la estructura del programa, los m iem bros de cada u n a de l3s e stru c turas requieren 1-5 bytes do espacio do alm acenam iento En una a rq u ite c tu ra x86. la estructura normal, ain compactar, UP, aum entu en 3lo 0 bytes, mientras quo el tamao di* la estru ctu ra com pactada, P es sim plem ente la sumo de los tamao:! de sus miembros. Aunque unos sim ples 5 bytes de m e moria ahorrada en este caso puede no parecer dem asiado, im agnese el lec tor que tuviera un arreglo do 1.000.000 de estruct u ras (caso pos-.blo en alg u nas aplicado nos): esto arrojara casi 5 megabytes di* ahorro de m em oris RAM. 1.a memoria ahorrada no nura poca en este cuso, evidentem ente
NOTA
re.-ano or. i.i o n ta c iu m norm ol fuoron p r o o o b le ^ o n t * e l m w i Id o o d e r r j t r y s scOro limites aoocu ocos. rr. Jiu n te fll 3g * g o 3o Oe tro * y d o i b y t e s . re * . octiw yn vte. o ios ac.i'Oi >wasdao<i ANSI p erm ite a io s e u o c rc ^ r sm a n en -n n gu o ; C r e iiw w to s a s 1,13 M tftictura b a s ta n c e n o s a rra n c a r oodo lo s o rlg o n e s n o '.w faies tic lo daten cu y a s lo n jird c s non mHipion d e p a la c r a s * n lu a rq u ite ctu ra q u o toa al la. O l o a -m o. ju i juo ui at/ibiito p a c k e d o f r e c e a lg u n o s b o r.c n c io * o b vio s, 'o s b rin d a a * x p c n is d o a pcytoowdad de- prctfram.n.

Los Uytot do

Utilizacin de eges
eg es es el conjunto experimental {o mejorado) de programas del compilador GNU. Originalmente fae un emprenduniento experimental tendiente a acele rar el desabollo del gcc y a expandir el entorno operativo del gcc. O tros obje tivos del proyecto eges (pronunciado asimismo e g g s, sin la c) fue a ad ir nuevos lenguajes, nuevas optimizaciones y arquitecturas de procesador a g cc E:i abnl de 1999, el proyecto GNU design form alm ente al enmite ejecutivo del e g es como responsable oficial del m antenim iento del g c c E ste ltim o ha sido desde entonces deuominado Coleccin de Compiladores GNU. La cuestin clave de esta cia.se de historia es su g e n r que, en algn momento, eges puede muy bien fusionarse con g c c . E n tretan to , sin embargo, e g e s es un producto separado. Es tambin 1 compilador predeterm inado para C/C++ en por lo menos dos distribuciones, de modo que resu lta im portante comprender sus diferencias y mejoras respecto de gcc. P ara obtener m s in formacin sobre eges, visite su sitio web en h t t p : / / e g e s . c y g n u s . c o m /.

Cas:ul-o 1: Compilacin de programas

2a

N OT A
tT3 Qua a *ers*yi se'-Si a s e g e s , la 1 . 1 . 2 . seria :tim a v e r s a r c e e g e s c o crcg.- 3. - s -jarnomo. 3 S ig u i t e ; 5-r- 9-,w . de acuerdo con la i r fc r r & o r ObtemSie r i e s- J o a = e s e g e s . se-^ ;a '.e -^ cr- 2.35 de g c o .
t o

e g e s to talm en te com patible b a c a a tr s con g c c , de modo que todo o que se dijo en este capitulo sobre g c c tam b in es de aplicacin p a ra e g e s . En verd ad , aunque esto no h a sido oficialm ente establecido por el equipo de desarrollo del k erael. uno puede com pilar el k em el del Linux 2.2.x con e g e s sin ex p erim en tar m ayores problem as y el archivo ejecutable que se ob ten dra debera funcionar bien, e g e s re p re se n ta u n a m ejora significativa sobre ei com pilador e st n d a r g c c . v ersin 2.7 2.3. El prximo punto cubre algunas de estas m ejoras.
M e jo ra s a g c c

La m ayora de las mejora* de e g e s respecto de g c c afecta la operacin del propio com pilador en lu g ar de la de u in terfaz de linea de comandos. de mo do que se h allan mucho m s all del alcance de este libro. Sin em bargo se h an efectuado tam bin algunos cam bios en la interfaz de linca do comandos, los cuales se cubren en este punto. Se aadieron varias advertencias nuevas. -Wundef y -V/no-def generan ad vertencias cuando una directiva *i t*de prcprocesador intoRta evaluar un uinnueador no definido. -W sig n -c o m p are hace que e g e s (y g cc) generen una advertencia cuando el cdigo com para un valor con signo con otro sin signo. El indicador de -W all ha sido extendido do modo de hacer que eges em ita ad v er tencias cuando los valores enteros ?on declarados implcitamente. Do m anera anloga, el indicador de ad v erten cia W .flipltci.t f u n c t i o n - d e c l a r a t i o n s ad%-iert* en loa coaos do declaracin implcita de funcionen. Se han efectuado tam bin m ejoras a la depuracin y a la optimizurin. Por ejemplo, adem s de los argum entos numrico.* del wpecificador de optimiza* a n , -0, se puede ahora utilizar Os p ara asignar prioridad a ius optimizacio nes de tam ao de cdigo sobre las optimizaciones de velocidad. La seleccin entre optimiiaciones en tre tam ao y velocidad depende en su m ayor p arte de si necesita un alto desempeo o conservar espacio en disco. En estoa das, en que tanto el costo de la m em o ra RAM y de los discos rgidos ea relativam ente econmico, resulta tarea rencilla selecdonur velocidad por sobre tamuo. El tam ao de un program a, sin em bargo, debe se r considerado en trm ino de sus requerim ientos de alm acenam iento en disco tanto como la m em oria que re q u e re p ara ^er ejecutado. En situaciones donde, tanto el tam ao de almace nam iento en disco como la m em oria RAM utilizada se deben ad m in istrar p ru dentem ente. seleccione reducir el tam ao en lugar de au m en tar la velocidad porque ei program a ms rpido del mundo .ser intil si no llegase a caber en el disco o no contase con m em oria RAM suficiente en la computadora. Ei espeeieador - f s t a c k -ch ecK com prueba desbordes de piia en sistem as que carecen de u n a prestacin d e ese tipo. P ara m ejorar la capacidad de de puracin o h an agregado nuevos indicadores p ara reseas de desem pee Las rese as de desem peo le p erm iten al program ador d eterm in ar con re-

30

Programacin en Unux

ci3in la rapidez con que se ejecuta su program a, a cules funciones llam a

m s seguido, qu variables u tiliza cnn m ayor frecuencia e identificar seccio nes o variables del cdigo que no sean em pleadas (a menudo denom inadas cdigo m uerto!. Con e3a informacin, uno puedo modificar su cdigo fuente a fin de lograr que s u program a sea m s eficiente, a g e s tam bin incluye apo* yo integrado p ara la h erram ienta de verificacin de mem oria Checker. A continuacin se lista n algunos indicadores < llagad adicinale:, que son espec ficos de cada procesador empleado: - f o r o ? l i e a r e s Perm ite a e g e s contar el nm ero de veces que se je c u ta una funcin. f t e s t - c o v e r a g e Crea archivos de datos p ara la herram ien ta de anlisis de cobertura de cdigo gcov - f a r a n c h - o r o b a b i l i t i e s M ejora la prediccin por parto de e g e s de las ram ificaciones de cdigo.

Finalm ento. la salida que producen las opciones h e lp ha 3ido sum am ente m ejorada.

Lo que viene
F n este capitulo, el lector ha aprendido cmo utilizar el compilador de C de GNU. g c c . y debido a su sim ilitud con g c c , cmo utilizar e g e s. La mayora de los program as que uno construya, au n cuando sean programa* de archivo nico, van a necesitar do largos tiem pos de Compilacin. E sta flexibilidad puede se r por o tra parte cansadora y tediosa de tipear, do modo que el prxi mo capitulo le m o strar cmo au to m atizar el proceso de construccin de softw are utilizando o tra gran h erram ien ta de UNDC/Linux, tnake. Con un entendim iento bsico de am bas h erram ien tas, el lector esta r en condiciones de continu ar hacia los tem as de program acin de sistem as que le perm itan com enzar a program ar en Linux con ejemplos.

>

>

>

>

2
Control del proceso de compilacin: el make de GNU
fiake e s ur.a h e rra m ie n ta u tiliz a d a p a ra co n tro lar los procesos de consinaccin y revisin de so ftw are, ma ke au to m a tiz a el tipo de softw are crea, cmo y cundo se lo d esa rro lla, perm itiendo al program ador concen tra rs e exclusivam ente en la redaccin del cdigo fuente. A dem s perm ite a h o rra r m uchsim o tipeo, ya que co n tien e decisiones lgicas ntegradu que invocan el com pilador de C co a la s opciones y argum ontoa que s e a n
idecuados!

Este capitulo cubre los siguientes tem an: Cmo invocar a stake Las opciones de lnea do com ando y los argum entos de oiako Creacin de m akeles Redaccin de reglas p ara mako U tilizacin de las variables do n ak e A dm inistracin de errores ec siake Todas los program as de este captulo pueden ser encontrados en el sitio Web n t t p : //VAVf.ncp.CGiJi. m f o bajo e l nm ero de ISBN 0789722151.

Programacin en Linux

Qu uso tiene make?


P ara todos los proyectos de softw are excepto Ion m s simples, make resu lta esencial- E d prim er lugar, los proyectos com puestos por m ltiples archivos de cdigo fuente requieren invocaciones del com pilador que sor. largas y complejas, make simplifica esto m ediante la invocacin de estas difciles lineas de comandos en un makefile, un archivo de texto que contiene todos ios comandos requeridos p a ra d esarrollar proyectos de software. m ake resu lta conveniente p ara codo aquol que q u ie ra d esarro llar un pro gram a A m edida que se van haciendo modificaciones al progrnmu, ya sea que se lo agreguen nuevas prestaciones o se incorporen correcciones a errores (bugs) detectados, make le perm ito a uno reconstruir el p r o g T a m u con un nico y brovo comando, re c o n stru ir slo un nico mdulo, ta l como un archivo de biblioteca, o personalizar el Upo de desarrollo que ae desee, segn las circunstancias, make resu lta tam bin conveniente p ara otra gente que podra d esarro llar el program a. En lu g ar de crear docum entacin que explique en penoso d etalle cmo d esarrollarlo, uno sim plem ente les debe indicar quo tipeen make El program ador original apreciar las v e n ta ja s de ten e r quo escribir m enor cantidad de docum entacin, y los dem as colaboradores ap reciarn la conveniencia de com andos de desarrollo que sean simples. Pata aotsn er
mayor informacin

acerca do

lo distrib uci n d e 50ftw w e, ver OiatnbuciO'v to

softw are" pagina 4- 5 .

Finalm ente, amke acelera el proceso de cdicin-compilacin-depuracin. M inimiza los tiempos de recompilacin porque es lo suficientem ente inteligente como p ara d eterm in ar qu archivos han cambindo, y por lo tan to slo reconstruye los archivos cuyos componentes h an cambiado. El m akefile tam bin constituye una base do datos de informacin sobre dependenaus en tre archivos p a ra los proyectos do un program ador, perm itindole verificar autom ticam ente que todos ios archivos necesarias p ara compilar un pro gram a estn disponibles cada vez que uno inicia u n a compilacin. A m edida que el lector vaya ganando experiencia con la program acin en Lmux. a p re ciar e sta caracterstica de make.

Utilizacin de make
E sta p arte explica cmo utilizar m ake. E n particular, explica cmo crear m ake11es, cmo invocar a tnake, cmo d esm en u zar su pltora de opciones, argum entos y especificadores, y cmo a d m in istrar los inevitables errare-, que ocurren por el camino.

C3Cr:-:o 2: Control del proceso de compilacin: el make de GNU

35

C r e a c i n d e m a k e flle s

As que. cmo logra realizar n ak e au s m gicas proeza3n U tilizando un mAkefe que es u n a base do datos en form ato texto que contiene reglas que le indican a 3ke qu construir y cmo construirlo. C ada regla consiste de ln siguiente L'n targ et, ia 'co sa" que en d efinitiva tr a ta de crear.

U na lista de u n a o m3 dependencia, g eneralm ente archivoH, requeri d as p ara co n stru ir el ta r g e t U na lista de comandos a ser ejecutados con el fin de crear al tnrget a p a rtir de las epenctncias e n tre archivos especificadas. Cuando v t lo invoca, el maKe de GN*L* busca un archivo denominado G N U cak eH le, - a < e f l i e . o M a k e 'i i s . on ese orden. Por nl^una razn, lo mayora de los program ado res de Linux utiliza e sta ultim a forma, U a k e flie . Las regla# de un muicefile tienen 1a xiguiontc forma general: sojttlvc :
CSMfiCC

;ao*r.s*ncu! [!
ICOMMO)

1 - t _________________________________________
PR E C A U C I N E yjTK* c*frjK - i comaodo cec g h crtate' o* ucuiacior; ocho espacios no *on -a <n-vj cosa Esto a menooo tama a !s ente desprevenida, y puede resultar un yflDimj si % > j editor sit'ef io eor-ie<?e 'vtrvlealmena' caca taouador en ocfto aspao j S; uno trata ce ripear ssoacios en '.gar 3e taOuiadores, irde exvoira c! nonsare *Wsvr. y se etenOtt. T arget es h abitualm ente e! archivo b inario o el archivo objeto que uno quiere cre ar D e p e n a e n c ia es u n a lista de uno o m is archivos requeridos como rente con el fin de c rear targ et. Loa com andos son los diversos pasos, tales como la invocacin del compilador o los comandos de interfaz, nece sarias p a ra cre a r el targ et. A m eaos q u e se lo especifique de forma expresa, -.aKe realiza todo su trabajo en el directorio corriente de trabajo. Toco muy bien*, debe e sta r pensando probablem ente el lector, pero cmo logra sab er aKe cundo reco n stru ir un archivo?" La resp u esta es sorpren dentem ente simple- si .m ta rg e t especificado no se encuentra presente en algn lugar donde a a k e pueda h allarlo , make lo : reco n stru y e. S; el targ o t no existe, nzv.e com para la fecha y h o ra del objetivo i target) con la fecha y hora de los archivos de los cuales ste depende. Si a l menos una de dichos archivos es ms nueva que el targe:. ma*e reconstruye el target, in te rp re tando cue el hecho de que ese archivo se a m s nuevo es seal de que debe incorporarse ai mismo algn cambio de cdigo.

. i .

>

>

>

Program acin en Linux

E je m p lo

E JE M P L O

Este m akele de m u estra perm itir que la explicacin sea m s concreta. Seria el m akele necesario p a ra desarrollar u n editor de textos ai que. haciendo iaia de im aginacin, hemos denominado e d i t o r . Los signos de num eral #) inician la s lneas de comentarios, tal como se com enta en la pgina 50. g c c es el comando que activa ol compilador, rm (ver ta b la 2.3. pgina 47) es u n a va* riable predefinida que activa un program a de eliminacin de archivos.
*

* wa^ef# da .muestra
#

ed;tcr

e d itor.o pantalla.o teclad'J.o ge: -o iJ:tor editor.o pantalla.o toclado.o

edito*.c : id its r.c editor.h teclado.h pantalla.n gcc -c editor.c C n tlla .o : pantalla.c sanralla.h gcc -c pantalla.c .ciado.o : toclado.c c la c o .n

3:c
o rfllija r ;

c teclado.c

r* ? id iw r *,o Par: com pilar e d i t o r . se debera tipoar sencillam ente make en el directo rio dondo ae encuentro el makefile. Asi de aimplo. Eatr makefile tiene cinco reglas. El primor target, e d i t a r , je denomina target pn-rfctcrmmiido; este es ol archivo que make en definitiva trata de crear e d i t o r tiene cria archivos de loa cuales dependo: e d i t o r . o. p a n t a l l a . o y te c l a d o .o ; ^ t o s tres archivo.1 ! deben oxwtir para quo .*ie pueda construir e d : t o r La linea liguiento consiste en o! comando quo debo ejecutar make p ara crear e d i t o r Como so recordar del capitulo 1, "Compilacin de programas", esta invocacin del compilador constniyo un archivo ejecutable denominado e d i t o r a p artir de los tres mdulos objeto, e d i t o r , o. p a n t a l l a , o y t e c l a d o . o . las tres reglas que vienen despus lo mdiciui mn ak e cmo con-itrair cada uno de los mdulos objeto La ltim a regia le indico a make que hugu limpieza, eliminando todos los archivos objeto que contribuyen a formar editor Aqu es donde el valor de make se lince evidente: norm alm ente, si uno trata se de co n stru ir e d i t o r utilizando el comando de compilador de la lnea 2, si los archivos do los cuales ste dependiera no existiesen g c c producira un tajan te mensajo de erro r y term in ara, m ak e, en cambio, despus de haber determ inado que e d i t o r req u iere esos archivos p ara ser compilado, prim ero verificara que existiesen y, si no fuera as, ejecutara los comandos necesarios p ara crearlos. Luego re to m a ra a la prim era regla y creara del archivo ejecutable de e d i t o r . Por supuesto, si a su vez las respectivas dependencias p ara los com ponentes, t e c l a d o . c o p a n t a l l a . h, no existiesen, m ake ren u n ciara tam bin, porque no dispondra de los ta rg e ts denominados, en e ste caso, t e c l a d o . C y p a n t a l l a .h.

t
Capitulo 2: Control del proceso d e com pilacin: el make de G N U 37

In v o c a c i n d e m a k e

Invocar a m aka slo requiere rip e a r make er. el directorio donde se encuen tre e; m akel?. Por supuesto, iguai que ls m ayora de los program as de GNU. ~ a k e acep ta una considerable cantidad de opciones de lnea de comando.- Las opciones m s com unes ge iistan en la tab la 2.1. Tabla 2 A . O o c o l e s com unes de lnea se comandos <e make.____________________
Opcin_________________Propsito____________________________________________________ - i^ i_ a r c h iv o n I n o = < ir _ d i r
5

Hf i l e
r d i

L i r a el rraksf: * denominado naffl_a.-chivc en lugar de uro e os e nomorc str-dar {GNUmaSeflie. mokefilo o MakefTe). zst-'tx los comandos que ejecutara make 3n en realidad fijecutartos. til cara eomorobgr un makefile -irtaco ncr-bre^tir 3 13 '.sta de directoros Corda bu 3 car$ nake os makefiies incluidos. Ejecucin 5 ! o c to w . sin mcximir los comandos Que va ejecu tando mako monme non%bros de directoras cuando moho camfra de direc torios. Ejecuta maka como 31 n o o _ a r c h lv o hubiese s'rto modificado. iff-oi que -n , muy Obi para ccmorobar makeflies. Deshaoi'ta todas tas reglaa integradas en ma*e. Imorwre gran cant-dad de informacin para depuracin, Normalmente. make so detiene 31 un comando retoma un cdigo de error distinto de caro. Esta opcin deshabita o*te comportamiento. Seguir ocutindose un $ 1 uno de 103 '.argots ro su lograra construir. Normalmente, si uno to loa targets no ne ogrera construir, make tomunarta.

Correr N comondos on paralelo, conde N es un valor entero pequeo i distinto do cero m ake puede g enerar mucha salida, de modo que si el lector no se encuentra interesado *n an alizarla, utilice la opcin 3 pora lim itar In salid a pro ducida por nta><e. Las opciones -W y n ie perm iten a uno h acer un anlisis del tipo qu pasara si el archivo X cambiase?" La opcin - i existe porque ao todos loa program as retornan 0 cuando te rm i nan sin inconvenientes. Si uno u tiliz a ra un comando asi como p a rte de u n a regla de un m akele, n ecesitara um plear - 1 a fin de que el proceso de com pilacin continuara. La opcin -k resu lta p articu larm en te u l cuando uno est construyendo un program a por p n m e ra vez. Dado q u e le indica a n a k e que contine a u n si uno o m s de los targ ets no se p udiesen construir, la opcin -k le perm ite a ano ver cule.*- targ ets se construyen sin problem as y cules no, perm itin dole concentrar su s esfuerzos de depuracin en !oa archivos con problem as. Si se e sta fren te a una compilacin m uy larga, la opcin j N instruye a raake de que ejecute N comandos sim u ltn eam en te. Aunque esto puede reducir el tiem po total de com pilacin, tam bin puede im poner u n a pesada carga obre ei sistem a- E sto probablem ente resu lte tolerable er. un sistem a

jn

38

Programacin en Linux

autnom o o en u n a estacin de trabajo Individual, per es totalm ente in a ceptable en u n sistem a de produccin que requiera rpidos tiempos de respuesta, ta l como por ejemplo en un servidor de red o de base de datos.
E je m p lo s

Estos ejemplos em plean todos ellos el siguiente m akee, que es el makefile p a ra la m ayora de los program as dol captulo 1. El cdigo fuente asociado tam bin e3ta tom ado del capitulo 1. No se preocupe ai d o com prende algunas de las caractersticas do este m akefile, porque las m ism as se cubren ms adelante en esto capitulo. P ara ver u n a explicacin de cada trmino, refirase segn el caso a lu tabla 1.2 de lu pgina 14. a la tabla 2.2 de 1q pgina -16 o a la tab la 2.3 de la pgina 47. Los com entarios van procedidos en osto m akefile por el digno num eral (#). tal como se comenta en la pgino O. Los .gnoj. S u tilizan p ara expandir variables de usuario y p re definidas (vor pginas 42 v ?. respectivam ente). Los trm inos en letrtu. maysculas corresponden todos :i nom bres de variables, on ingls las pre definidas y en espaol las definidas por usuario. El signo * ropresonta asig nacin de valorea a variables de expansin simple (ver pgina 43). P ara .PHONY ver Targeta ficticion", pgina 40. Finnm cnto, el tariret .c.o: o.^ ur.n regla im plcita, es decir que make la em p lear, de se r necesario, osle- ln m ism a presente o no en el listado. Las reglas im plcitas se com entan er: ls pgina 48.
*

* awofiie * LfLtS :
* C ioie a e U n e s a i c a r c te r-

c a n e r^ a rio Qua hay an una da

-SU d o * I m d s s i g u i e n t e s so g u r s e a l a c u e a e s e e o p t o iz s r

C A L A O S : -a SCW FLAS}
*0=1.405 : -02 S(C?PFLASJ
? ftO O A A H A 5 * \

ola \

3ant \
nuavcjiola \ nuevajioia-UD noj-etorr.c \ in ltie \ conpactar
a 11:

.c.o: S(CC) SfCFLAGSl -C JVC .SUFFIXiS: .C .0


ncla: h o la .:
q r c s r . r : p a a a n r .c

Cctuic 2: Control del proceso de compilacin: el make de GNU

39

nutv0_*0la: nostra.-.c **-sa;a5.c


S(CC) S (O TJC S ) So 5?

T.?vc_"3La i3: aos?r*r.c I m ' M ; .

S(CC) iC=U>G5> J -c W
a**a;*.c S(CSi it7-w VK ! -c

-L. -iasr.sjes

-o U e w r u j M . a

S ( | ~ci Ii&ot!-4#*.a iitonai]9i.9


c_rtor^o. -y3_r*to<^o.:

l(C) C2 U

0M

co o t* r: c M j r . c

H0*fr : p ro lita r tie

prolija*: $iSM) I( **0G *.**aSi *.o *.a - '.se r


lie : o o ll ia r i C 2 ?5 talc3 .:e a*fil

1 El p n m er ejemplo ilc3 tra cmo sim u lar u n a compilacin utilizando las opciones -Wy -n .
5 r*r :: f- i- s ije s : m osr-r.c -n m jfl* sJw Ia-IiD -c ss*i>4i5.i -a lia a e r a tiS -C

f
:c

rzi j UdfnM]3.: -5 o s T r ir . c - -I . -i., -ia e n s a j

La o p een -tfn o n _ a rc h iv o le indica a m ak e que acte como si n o m _ a rc h i vo hubiese cambiado, en tan to que -n exhibe los comandos que seran ejecu tados. pero sin ejecutarlos. Como se puede a p reciar a p a rtir de la salida pro ducida, "a:< co nstruira p nm ero el archivo biblioteca, i i o n e n s a j e s . a. luego com pilara - . e s t r a v e y lo lin k saria con la biblioteca p ara crear nue v o _ n o la - l i o . E sta tcnica constituye u n a excelente m an era de comprobar las regias del makefile.

40

Programacin en Linux

2. E ste ejemplo com para la salid a norm al de inake con el resultado que se obtiene cuando se em plea la opcin s p a ra su p rim ir dicha salida s aak? a ll cc -g fcola.c -o ola
-*' cc -3 s e c a n :.c -o podan*

SAUOA

cc -g cc

rc stra r.c nen3a;*?s.c -a mievoJiU

-g -c n*nsajes.c -o U&TWisajS.o
aatn':
: s r.ot ' n t '

ir res lit>nefl$a:ts.a Ii3nens3jes.0


OOdart.c: I.i functiOR cc
cc a s e a n ? .c :B - B rn in g : rs tu r n typ e o r irgin*

-g
g

no_rstorno.c
c c flo a c t a r .c n o it r .v .c

-o oo_retomo
conpac taI. *L . - U M im fe s

cc -02 L f l li p .c -o ln iln s

c< '5

-o m u v o jio la - U

S n i*o -s I I

ptoant.c: In r-jnctlcn na ir/:


p e ila n r.c :^ . w arntr^j: r o t j r n typo o f 'n i n i no? in t

Com o el lector puede ver. s su p rim e to d a lu s a lid a g e n e ra d a p o r r r a k e . El m en saje do a d v e rte n c ia sobre ui v a lo r quo re to rn a m am con stitu y o un d ia g nstico g o n erad o p o r g c c , el cu al m a k e , por su p u esto , no puedo su p rim ir.

Creacin de reglas
E sta seccin analiza con muy or d etalle la redaccin de reglas p a ra m akele. En particular, com enta los targ e ts ficticios, las variable* de makefilo, las va riables de entorno, las variables predefinidas, las regas im plcitas y las re glas de patrn.
T a r g e t s fic tic io s

Adem s de los archivos Uirget norm ales, make perm ito especificar targeta ficticios. Les targ ets ficticios se denom inan a s porque no se corresponden con archivos reales y, al igual que los targ ets norm ales, tienen reglas que lis tan comandos que m ake deber ejecutar. El ltim o targ e t del m akefile del tijemplo antunnr, p r o l i j a r , era u n targ et ficticio. Sin embargo, como o ro i i j a r uo exliibia n in g u n a dependencia, su s correspondientes comandos no fueron ejecutados autom ticam ente. E ste com portam iento de u:ake se desprende de la explicacin sobro su fun cionam iento convencional: cuando encuentra el targ e i prolijar, make de term ina si existen o no dependencias y. como p r o l i ] a r no tiene dependen cias, na.<e in te rp re ta que ese ta rg e t se encuentra actualizado. P ara cor.stru- dicho target. uno tiene que tip e a r -aKe prolijar. En nuestro ca-

s.

Captulo 2: Control del proceso de compilacin: el make de GNU

41

p r o l i ] a r elim inara el archivo ejecutable e d i t o r y los archivos objeto que ie d an origen. Uno podra crear u n carnet ce este tipo i se propusiera crear un zarball (archivo la r de cdigo fuente, que es ol archivo compactado creado utilizando el comando tar. o si quisiese com enzar u n a compilacin y a en m arch a nuevam ente desde cero. Para cc*.**~ r-i w c a c r deta-'-*ia >c- comando t a r , ver tjlizsciOo ce ta r * . ugna
6.

50.

5: efectivam ente ex istiera, sin em bargo, un archivo denom inado p r o l i j a r , ~ ake lo detectara- Pero, como carecera de dependencias, make supondra que el mismo se encuentra y a actualizado y no ejecutara los comandos aso ciados con el targ et p r o l i j a r P a ra a d m in istra r adecuadam ente esta s itu a ran. utilice el :arg?* especial de make . PHONY Todas as dependencias del objetivo (target ) . PHONY sorn ev alu ad as como h ab itualm ente, pero make no tom ar en cuenta la presencia d e u n archivo cuyo nombro coincide con el de u n a de las dependencias de . PHONY y ejecu tar de todos modos los co m andos correspondientes.
E je m p lo s

c j c m p io

I Referirse p ara este ejemplo al m akefile a n terio r Sin el ta rg e t .PHONY, g en al directorio c o m e n te ex istiera u n archivo denom inado p r o l i j a r . el tnrg C t p r o l i j a r no funcionar correctam ente. wwc x o lija* i an oro ii: ir * sroU jaf ; j w O to dat* Como se puede apreciar, sin ol com ando especial .PHONY, make evalu las dopendencos dei targ et p r o i t j a r , vio que ste no ten ia n inguna y que ya exista un archivo denom inado p r o l i j a r en el directorio corriente, dedujo que ei targ e t ya estaba actu alirad o y no hizo ejecutar loa comando* e stab le cidos en la regla. 2. S in embargo, con el comando especial . PHONY, el targ et p r o L i J a r funcio na perfectam ente, como se m u e stra a continuacin; S M<e x e i i j i ^ f noij 9*44itt ntnw jols *>uevc_nola ro_rator-o mime conoactar *.o *.a *-

.4 .* ^

SAl~ A

1 comando especial .PHONY p r o l i ] a r oblig a make a p a sar por alto la presencia del archivo denom inado p r o l i j 3 r. E n circunstancias o rd in arias. lo mejor sera no te n e r estos archivos de nom bres conflictivos e n un rbol de directorio de fuente Como re su lta inevitable, sin embargo, que tengan lugar errores y coincidencias, . PHONY constituye un excelente resguardo.
V a ria b le s

Con el fin de simplificar la edicin y m antenim iento del makefile, make le p er m ite a uno crear y utilizar variables. U n a variable de m ake es sim plem ente un nom bre definido en u n makefile y c u e representa una cadena de texto: este texto se denomina i olor de la respectiva variable, make puede distinguir entra

Programacin en Linux

cuatro tipos de variables: variables dfcnidas por usuano, variables de entor no. variables autom ticas y variables predefinidas. Su empleo es idntico
VARIABLES DEFINIDAS POR USUARIO

Lus variables de un makefile se definen em pleando la forma general


t0U83S.0e_VARWat: valor i . . |

Por convencin, las variables de un m akefile se escriben todas en m ayscu las. pero esa no es una condicin necesaria. P a ra obtener el valor de NOI/ B R E _ 0 E _ V A R IA 3 L E , oncierre el nombro en tro parntesis precedido con un signo S:
5. i-W O SE_C _VA31A8LEI

WVBRE_0E_VARA81E ..xpande de modo de h acer disponible el texto a l m acenado un v a l o r , el valor colocado del lado derecho do la sentencia de asignacin G eneralm ente las v ariables se definen ai comienzo de un m ake file. La utilizacin de variables en un m akefile es an tea que nada una convenien cia Si e! valor cambia, uno debe efectuur slo un cambio en lugar de m u chos. simplificndose <is ol m antenim iunto del makefile.
E je m p lo

Este makefile m u estra como funcionan la s variables definidas por el u su a rio. Utiliza e! comando e c h o de lu in terfa z a fin de dem ostrar cmo se ex panden las variables.
PflOGftAMA * Drogt prog: orcg3 prog4 : volcar

volcar :
ecnc S(PRCGflA<aS) S *a*e - j volcar proQl prcgZ prcg3 prag4
salida

Como se puede ver. cuando fue em pleada con el comando echo, PROGRA MAS se expandi a sus valores como si fuese un macro. Esto ejemplo ilu stra tam bin que los comandos presentes en una regla pueden se r cualquier co m ando vlido de interfaz o utilidad o program a de sistem a, no solam ente in vocaciones de compilador. Resulta necesario u tilizar la opcin -s porque make m u estra en p an talla los comandos a m edida que la5 va ejecutando. En ausencia de s , la saiid a hubiera sido:
S w * velear aere flr&gi cr:g2 prcg3 prog4

Captuo 2: Control del proceso de compilacin: ei ^ake de GNU

43

EXPANSIN RECURSIVA CONTRA EXPANSIN SIM PLE DE VARIA 8 LES

~a:<e en realidad sm piea doa tipos de v ariab les, c u rsiv a m e n te expandidas y sim plem ente expandidas. Las variables -^cursivamente pj.pcnd.idas son ex pandidas tal cual cuando son reeronciadas. o sea. si la expansin contuviese o tra referencia a u n a variable, esta ltim a ser asim ism o expandida. La ex pansin contina h a sta que no queden m 3 v ariables por expandir, a lo que se debe el nombre de e sta m odalidad, expansin recursiva Por ejemplo, con sideremos las variables Dfl_SUPEIG9 y 0[R_FUEISTE, definidas comu si gue:
O*_$U=SiO* * W M . u r t _ s :i. s : j ) r e y K t 9

Oia.PjOfTE * <0iaju?f#l0fl>.run!t* AsL DIR_FUENT w a d r el valor /n o f f le / k u r t _ w a U /n u _ p r o y e c to / u e n t e Esto funciona como se lo esperaba y duseaba. Sin em bargo, uno no puedo agregar texto al final de u n a variable defin id a con an terioridad. C onsidere mos la definicin de la siguiente variable. CC 3C C
cc s(cc) g

C laram ente, lo que en definitiva se detien es obtener CC g ee -g. Eato no es lo que se o'otcndrl. sin embargo. C ada vz quo se la referencia $(CC) es expandida c u rsiv a m e n te . de modo que uno term ina con un lazo infinito; $(CC) in sistir en 'xpandirso u S (C C ), y n unca se llegar a la opcin fl. A fortunadam ente, m ake detecta esto e inform a un error:
S n -.r u v * CC r*?ar*nci i x u l t ( m r t t u a lly ) stop.

La figura 2-1 ilu stra el problema p resen te con la expansin recursiva de v a riables
C C - 9 CC

C C -S (C O -g

1
KCCStCC}

1 "
*CCS.CC>SCC <3

i
Figura 2.1. ls peligros de las .sr,dces d e maka e xp a n d a s recursamem e. Como .-e puede c v e ro r en la figura, c a d a vez que se traca rie a g reg ar ulgo a una variable previam ente definas que se expanda recunsivam ente se da co mienzo a un .azo infinito. i :exto recu ad rad o rep resen ta el resultado de la expansin previa, m ientras que el elem ento recursivo se re p resen ta por el agregado de S CC 'i al comienzo de 5-=a expansin. Como se ve con claridad, la variable CC nunca re su lta r evaluada.

1; )

1, ) . ) , )

). ) J

) N.)

>

Program acin en Linux

P a ra e v ita r este problem a, n a k e cambien u tiliza variables de expansin sim ple. E n lu g a r de se r expandidas cuando se las referencia, la v ariables re ex pansin sim ple son exam inadas u n a vez cuando ae las cene; toda3 la s refe rencias in te rn as a variables son procesadas inm ediatam ente. L a sintaxis de la definicin es ligeram ente diferente: C C := gcc C C *- -g La p rim era definicin u tiliza : = p a ra hacer CC igual a g c c y la se cu n d a em plea p a ra a ad ir -g a la p rim era definicin, de modo que el valor final CC s soa g c c -g (+* opera en n a k e de la m ism a m anera en que lo hace en C). La figura 2-2 ilu stra grficam ente cmu funcionan Sa3 v ariables de ex pansin .simple. Si se p rpsentan problem as cuando utiliza v ariables de m ake o aparece el m ensaje e e rro r < N0M8RE_D6_VARIABLE s e r e f e r e n c i a a S i Hisnia". es tiem po de com enzar a u tiliza r variables de expansin simple. Algunos program adores em plean slo variables de expansin sim ple con el fin de e v ita r problem as no previsto. (Como esto es Linux, no le costara nada elegir por 31 mismol
CC >{gcc, qocj

CC . s tc c i|][------- HKs Gl CC . C Q ----------------F ig u ra 2.2. Lau variable :i de expannin imple ion procesadas com pletam en te la primera vez que. son examinadas. La figura 2-2 m u estra que cada voz quo so referencia por prim era ver. una variable de expansin simple, sta rnaulta totalm ente expandida. Loa asig naciones de variables del iadr> izquierdo del signo igual adoptarn los valo res que io en cu en tran del lado derecho, y dichos valores no contendrn refe rencias a otras variables.
E je m p lo s

L. E ste makefile utiliza variables expandidas recursivam ente. Como se hace referencia repetidam ente a la variable CC. el make no funcionara. El archivo h o l a . c est tomado del captulo l. C C = gcc cc * S(CC) -g tela: hcl.c
SiCC) h o U .c -a ola $ ola

Va.<afiia:5: Rscursivs variable 'CC rersrences .ssif {ventosllyl. Stop.


s a l i d a

Como seria de esperar, make detect ol empleo recursivo de CC y se detuvo.

) . j

) ,

) .

) . ;

>

>

Captulo 2: Control dei proceso de compilacin: el make de GNU

45

2. E ste m a k e n le u tiliz a v a ria b le s c e e x p a n si n him ple en lu g a r de la s v aria-

bles d e e zo a n si n re c u rsiv a del p r im e r ejem plo.


EJ EMPLO s^
CC *= -g

'ola: *cl3.
S{CCi h o U -c -o ncU 5 -i<* hola

s P .\j
S4Ll DA

0 rtl'-s

Esta v e z. el program a compila norm alm ente.


VARIABLES OE ENTORNO

u ta variable* d f eninrr.r. &on lili versiones de -nake de todas las v ariables de entorno de la interfaz. C uando *e inicia, ^ a k e leo todas las venablos defin i das en el entorno ce la interfaz y cro a v ariables con loa mismos nom bres y valores. Sic em bargo, las v ariab les del mismo nom bre presentes en el make f i l e invalidan ius variables de en to rn o , de modo que tenga cuidado
E je m p lo

Este makeBle u tiliza lu variable SHOME que hereda de la in terfa z como p arte de una regia p ara construir el ta rg e t fo o . ( JCMPLO
W . SlHC[/?OO.C JCC $IH0M. fOO.C 0 S{NO*l/fOO

a f c A

*u

xj ri

c m : * * ^

w * tirQ t /noe.'xyr:_#ai:jfao c - , newiad by 'foo . Stop.

El mensaje de error exhibido es un tan to engaoso. Cuando make no pudo en contrar /h o a e , k u r t _ w a l l / f o o . c , Listadocomodependenciadel target rao , interpret que deba de alguna m anera construir primero f 0 0 . C. Sin probargo, no pudo encontrar una regla p ara ello, de modo que exhibi el mensaje de error y termin. Lo que se pretenda, n embargo, era dem ostrar quo make hered la variable SHOME del entorno de la interfaz ( / n o n e /k u r t_ w a ll, un este caso).
VARIABLES AUTOM ATICAS

Las uariabUs autom ticas son v ariab les cuyos valores son evaluados cada ve* que se ejecuta u n a regla, basndose en el ta rg e t y en las dependencias de esa regia. Las variables au to m ticas se em plean p ara crear reglas p a trn. Las reglas patr n son instrucciones genricas, ta3 como u n a regla que indique cmo com pilar un archivo . c a rb itrario a su correspondiente

46

Programacin en Linux

a rch iv o .o . La v a ria b le s a u to m tic a s tie n e n u n aspecto b a s ta n te crptico L a ta b la 2.2 c o n tien e u n a lis ta p a rcial do v a ria b le s a u to m tic a s.
p.ira .r con mayor dtate todo 'o roforido a reglas patrn, v o r "Realas patrn*, pg-ra 9.

Tabla 2.2. Variables automticas __________________________________________


Variable_____________ Descripcin___________________________________________ $9 Reorosenta el nombro de un archivo target presente en una re gla
S* S< Represento ra porettn bslca (o ratz) de un nomoro do archivo Representa el nombre de archivo ce la primero una rogla

opondonua do

S*

So oxeando puro dar lugar a uno lista delimitado por espacio do todas las dependencias do una regia Su p a n d e paro aor lugar a una liste delimitada por csoacios de todas los dopondoncios do una roglo quo soon mft% nuevas quo ol tnrgot SI ol targot designado so ncuonwu en un 3ut>direcloMo. cata var'ohle 'presenta la parte correspondiente a los d.roctorios de a ruta do acceso al miorro Si el target designado so oncuontra on un subdlroctorto. esta variable representa la parte correspondiente al nombre oel ar chivo 30 ;a ruta do acceso ai mismo

5?

S i <>0)

S (3F)

E je m p lo

F.'. frag m e n to de m a k e ie que viene t c o n tin u aci n (del m ak eliie d*l cap itu lo i, *Procesos") u tiliza las v a ria b le s a u to m tic o s $*. $<, y $?.
JSM PL0

C fU G S :> -s

CS 3C C .c.o: S(C) 5(C?UAGS) c S-.c inprsids:


es: 103.s SCC> S iC F U t ) S< -O S
UT or pi ds . c

SCC) 51CFLA GS) S< -C 33

S lafee zsprpids las


ge: -g

iaprpies.c o i*KiCS

gcc -g cs.c o ids


SALID*

E . p rim e r ta r g e t e. u n a regla im p lcita o p red efin id a. (L as re g la s im p lcitas se e x p lican e n d e ta lle m s a d e la n te en e ste m ism o capitulo.). E stab iece que. p a r a c a d a nom bro d e arch iv o que ten g a la e x te n si n . c , s e c re a r u n areki-

Cao-'tulo 2 Control dei proceso de compilacin: el make de GNU

47

vo objeto de extensin . O, utilizando el com ando $(C C ) S(CFLAGS) - c .E i trm ino S " . c . rep resen ta cualquier archivo del directorio corriente que te n ga la extensin . c ; en este caso, o r p i d s . c y i c i s . C. Como lo m ostraron ios comandos volcados ai dispositivo estn d ar de solida (que, salvo advertencia en contrario, considerarem os siem pre la pantalla del monitor), reemplaz S< con la prim era dependencia presente en cada re gla. p r p i d s . c y i d s . c . De m anera similar, La variable autom tica S. presen te en loe comandos destinados a construir p r p i d s y i d s es reem plazada por los nombres de los tarree.-? para estas reglas, o r o i d s y i d s . respectivamente,
VARIABLES PREDEFINIDAS

Ademi5 de las variables autom ticas listad as en la ta b la 2.2, o make de GNU pre-deftne cierta nm ero ce o tras v ariab les que son u tilizadas ya 3 ea como nombres de program as o p a ra tra n sfe rir indicadores y argum entos a esos program as La tabla 2.3 lista tas v ariab les predefinidua do make de em pleo m s frecuente El icctor ya ha visto a lg u n a s de ellan en los m akeliles de ejemplo de este capitulo. Tabla 2.3. Vanabies ctedofinidas paro nom bres de programa e indicadores Variable Descripcin Valor ________________________________________________________ predeterminado AR Homtyt de nrcrivo Cel programa ae ar
mantenimiento oe arcJi.vos compactados AS CC CPP RM ARFLAGS ASFLAGS CFLAG5 CPP^ l AGS
l OF-AGS

Nombre ce arcnivo oei ensamt'acor Nombra de arenivo dei comprador de C Nomore de arenivo del Gowocessdor de C programa para eliminar arcWvos [nc/cadores oera el pregrama de msTtenir*entO -ie innivos compactados Especficacoes de opciones cara el ensarrblM C Especfic8dorBS

as cc cpp rm rv No hay No nay

ce oocores pera el compilador de C

soecr?cacores ce cocones oara c prepracesador Ge C No nay Espea Piadores de coclores cara e linker No nay

El ltim o ejemplo de un makefile utiliz v a ria s de estas variables predefini das. El lector puede re e n ir e stas variables en 5u makefile, aunque en la m ayora de los casos su? valores predeterm inados son razonables. Redefna!as cuando el comportam iento predeterm inado no satisfag a us necesidades, o cuando sep a que un program a p resen te e n un 3stem a determ inado no tie ne la m ism a sintaxis p ara las llam adas.
E je m p lo

El makefile de este ejemplo rescribe la del ejemplo anterior de modo de utilizar solamente variables autom ticas y predefinidas donde sea posible, y no rede tine i.s valores predeterm inados de i as variables predem das que provee make.

Programacin en Linux

p rp :3 s ; p rp lC s .c S(CCJ SCFLAGS) S< -o &? $<LOFUOS)

io s: itfs.c
SCC) $(CrlAGS> 5< -c S3 S flC fU G S I

La salida que genera este m akefiie ta levem ente diferente de 5a dei ejemplo anterior

:c tds.c -o ftls
S A LID A

Esta salida m uestra que make utiliz el valor predeterm inado de CC? c c , en lugar de gcc. En la m ayora de los sistem as de Linux, sin em brago, c c cons tituyo un vinculo simblico con g c c (o s g e s ), de modo que la compilacin funcion correctamente.
Reglas im p lc ita s

Hasta ahora, los makefiles do este captulo h a n utilizado reglas explcitas, reglas que redacto el propio program ador, make incluye un extenso conjunto de rcglaa implcitas. o predefinidas, tam bin. Muchas de ellas son p ara pro psitos especiales y tienen un ompleo lim itado, de modo que esto captulo cubre slo unas pocas de las reglas im plcitas m s com nm ente u tilizadas Las reglas implcitas simplifican el m antenim iento de los makofiles. Supongamos que un makeftlo tuviese ostnv dos reglas: prog 5 pfOfl-O orc<j.o : prcg.c las dos reglas listan dependencias, pero no rug n i para co n stru ir su s targets. En lugar de term inar su ejecucin, sin em bargo, make in tern ar en co n trar y unzar regias implcitas que lo p erm itan construir ios targ ets (el lector pue de verificar que make busca reglas im plcitas observando la .salido generada por el depurador cuando se u tiliza la opcin -d).
Ejem plo

eje m p lo

EMa makolil de aspecto sum am ente breve que viene a continuacin crear p rp ia s utilizando dos de las reglas im plcitas de make. La p rim era define /fono crear un archivo objeto a p a rtir de un archivo de cdigo fuente de C. La segunda define cmo crear un archivo binario 10 ejecutable) a p a rtir de un archivo objeto,
lid ie s : prpios.o

a rp ia s .o : p rp io s .c

l
49

Cactu'o 2: Control del proceso d compilacin: el make de GNU

S Jici
ce -e s r s ic s .c -a cDi4 s.o

c:

prrias.o

-c prpidj

n ak e invoca do regias im plcitas p a ra construir n p rp x d s. La prim era regla establece, er. esenc:3. que p ara cada archivo objeto e s t e _ a r c n i v o . o , se de ber buscar el correspondiente archivo fuente e s t e _ a r c h i v o . c y construir el archivo objeto coa el comando cc - c e s t e _ a r c h i v c . c -o e s t e _ a r c h i v o . o. De modo que make busc u n archivo fuente en C denominado im pr Ci d s . c y io compil para obtener el archivo objeto im p r p i d s . 0. P a ra cons tru ir el ta rg e t predeternunado, im p r p id s , ^ a k e utiliz o tra rega implcita que establece p ara cada archivo objeto cuyo nombre sea e s t e _ a r c h i v o . o, efectuar ei .irJteo necesario para obtener el archivo ejecutable final utilizando el comando c c e s t e _ a r c h i v o . o -o e s t _ a r c h iv o .
R e g la s p a tr n

L*a rvijlu patr n proveen u n a m a n e ra de que uno detina ? U 6 propias reglas im plcitas. Las reglas patrn tien en el aspecto de reglas norm ales, excepto que el ta rg e t contiene exactam ente un ca r c te r (V que rep resen ta cualquier cadena no vaca. Las dependencias d e u n a regla do este tipo tam bin em plean S coa el fin de coincidir con el target. As. por ejemplo, lu reglo:
Va : Ve

Le indica mako que ;o astru y a cu alq u ier archivo objuto 9 S t 9 _ a r c l v o . o n p a rtir de un archivo fuente correspondiente denom inado 9 s t e _ a r c h i v 0 .c . E ata reg la patrn tam bin re su lta s e r u n a de las reglas patrn predefinidas de r.ake pero, igual que lo que sucede con las variables predefinidas, uno puede red e m rlas p ara acom odar s u s propias necesidades.
va i ve

HCC) C I(CTLWS) S(CWfT>CS| S< -o W


E je m p lo

EJEMPLO

El m akele que viene a continuacin es sim ilar al antenor, excepto que u ti liza una regla p atr n p ara crea r u n a regla im plcita personalizada, definida por el usuario, p a ra compilar y link-ear cdigo fuente en C, y em plea u n a re gla im plcita predefinida p ara lirJtenr el archivo objeto a fin de crear el arehivo binario naL
CFUfiS : * -8 03 -e

CC : qcz
t fttdtfir la - tc li ja t n r prtftrai.irta
* va : ve
*

Programacin en Linux

i.o : *.c StCC) $<CFLftGS J< -c 5S

i
E ste e m e n t a r lo va -iuui solo por c o lo c a r un com entario

iap rp td s : in o rp ie s.a tflorpias.o : toprpidS.c

J It4k
5 cc -5

03 c Inprplds.C -c nprpids.o in o ro td j.o o irtprpids

gcc
j a u d a

La regla patr n definida por e l usuario efectu varia cosas: Cambi CC a g cc. Aadi * l espeeifieador dt* depuracin de g c c ' s. g, y el cspccicador de optimixucin, -0 3 , a CFLAGS Utiliz loa variables autom ticas S* y $@ p ara reem p lazar loo nombre-, sucesivos de la prim era dependencia y ol targ e t cada ver que la regla fue aplicada. Como so puede ver a p a rtir fie la salid a de make. la regla personalizada fue aplicada al m akefile tal Como sr* Ih especific, dando origen a un archivo eje cu labio sum am ente Optimizado que contiene, adem s, informacin in teg ra da en ol mismo sobre su depuracin.
C o m e n ta r lo s

Se pueden in serta r comentarion en un makefile precediendo el comentario con el signo de num eral tf) Cuando make encuentra un comentario, no procesa ni el signo <ie num eral i ei resto de la lnea donde ste se encuentra. En un makele los com ntanos pueden ir colocados en cualquier lado. Se debe otorgar especial consideracin a los comentarios que aparecen en los comandos, por que la mayora de las interfaces tra ta n a como m eraesrcter (generalm ente como un delim itador de comentarios). Pt>r ln que concierne a make. una linea que contiene slo un comentario equivale, p ara toda propsito prctico, a ina linea en blanco. 1 ejemplo an terior ilustr el empleo de comentarios. Tiake ig nor totalm ente las cuatro lneas que consistan slo el delim i:ador de comen tarios y las dos lneas que contenan slo texto y no comandos.
T a r g e t s tile s p a ra u n m a k e file

A dem s del ta rg e t p r o l i j a r ilustrado an terio rm en te e:i este captulo, en los m akeies h ab itan generalm ente varios otros targets. U n ta rg et denom i nado i n s t a l l desplaza ei archivo final ejecutable, cualquier biblioteca o icript e interfaz requeridos y la docum entacin que pudiese existir a sus

Cac'tJ^o 2: Control del proceso te compilacin: el make de ONU

alojam ientos finales en el fiU systtm y establece adecuadamente permisos de archivos y de propiedad E l u r g e : in s ta l a r * tam bin tpicam ente compila el programa y puede, ade m s. correr una sencla comprobacin p a ra verificar que el programu se ha ya compilado correctam ente L'n ta rg et un i n s t a 1 1 suprime tos archivos instalados por el ta rg e t i n s t a l l i- n target d i s t es u n a m anera conveniente de preparar 'Jn paquete de dis tribucin. Como mnimo absoluto, ei ta rg e t d i s t elimina archivos antiguos, tan to ejecutables como objeto, del directorio donde se llev a cabo la cons truccin. y crea un archivo comprimido, ta l como un archivo ta r o turoall realizado con gz:p, listo p a ra se r colocado e n pginas de la World Wide Web y en sitios FTP. NOTA
B C fo r a m j o r l o s yn com preso * y a e io m o ro * o r muitcropsito de archivos que en compate.'* cor a utif cao ctoc.1 de cmprM.n da UNIX E i -no ce los programm ~ to 300-^srrt de 04 cro>*can GNU y u o n a a rt/a UUooo*< o va pf4ct>c<jfT*Wo 30* 'OS s-V ervM op*rtyos r, use

E je m p lo

m n 'i o

El siguiente makefile ilu stra cmo cre a r lo* turgeta i n s t a l l . d i s t . y U f l i n s t a l l , utiiisando tl ya sum am ente trillado programa o la c. nou . M lj.c
i n i t i l : n o li

in * i; $< J '- o e j
.PMOHt : a u t u n ir .s tt ll f lis t :
fin * ) n e i*
.o : z n

ta r ; i r f > 3 : j . : r . 'i n c la . us/te:.:* d t s i r t e ia r : S i ) S(H>E;inoIa 5 naics i r s t a l l re h o la .c -o r o is

i n s t a l l i a .-o rjx -m c ip a l;!u r-_ * a ll

* * 0*

SH K 3U :
TJ - IV5I* .O r e *3* c iv ? o l a . t f .qx i c i . ; a xe rile nc'.s.c

)
52

,)

i .)

>

)>

>

Program acin on Linux

a < e f ii

S (J3k9 uninstail

i -f /flir_prirciflai/K urt_w all/hola

-nake i n s t a l l p rim e ra m e n te com pila h o l a y Jo in s ta la e n el d ire c to rio e s pecificado. E sto ilu s tra u n a d e las v e n ta ja s d e u tiliz a r v a ria b le s d e " 3 k e : SHOME e v a l a a l valor correcto e n c u a lq u ie r siste m a e n q u e c o rra m ake. y p o r lo ta n to d o re q u ie re s e r especificada e x p lc itam e n te e n el m ak e fiie . ira k d x s t e lim in a todos los archivos re sid u a le s q u e p u e d a h a b e r d ejado la cons truccin, ta le s como m dulos objeto y o tro s a rch iv o s tem p o rario s, y crea io q u e e q u iv ale a u n a d istrib u c i n d e cdigo fu e n te lis ta p a ra er p u b lic a d a er. In te rn e t. Ei ta r g e t u n i n s t a l l . fin a lm e n te , e lim in a e n seg u n d o p lan o el p ro g ra m a in stalad o .

Administracin de errores
Si el lector llegase a ten er problema* cuando u tiliza make, lo opcin -d le in dica a make que im prim o g ran can tid ad de informacin adicional p a ra depu racin, adem s do m o strar los comandos que se encuentre ejecutando. La sa lida obtenida m ediante e sta opcin puede se r abrum adora porque la informacin volcada m o strar qu es lo que hace make in tern am en te y por qu. La salid a generada por la opcin de depuracin incluye ln siguiente in formacin: Q u archivo evala make p a ra efectuar u n a reconstruccin. Qu archivosestn siendo comparado y cufilos m n los r<-<ultados do !n comparacin. Qu archivo son loa que verdaderam ente necesitan ser reconstruido* Qu reglas im plcitas considera make que va a utilizar. Qu reglas im plcitas decido utilizar n a k e , y los correspondientes co mandos que ejecutar. La siguiente lista contiene los mensaje* de e rro r m s comunes que pueden se r encontrados cuando se utiliza make y sugiere cmo resolverlos P ara obte ner la documentacin completa, referirse ul m anual de m ake o, mejor an. a tas pginas de informacin de mako (utilice el comando in^'o 'GNU m ake" i. Me r u l e to make t a r g e t ' t a r g e t ' S to p -m a k e no pudo encon tra r u n a regla adecuada en el m akefiie que le perm itiera c o n stru ir 1 targ et designado y no puede h a lla r reglas predeterm inadas que le sean ile utilidad. La solueion es ubicar el targ e t causante del problem a y a ad ir una regla que perm ita crearlo, o modificar la regia existen:*1. t a r g e t t s up to d a te . Las dependencias p ara el target designado no han cambiado son m s viejas que el target;. Esto no es realm ente un mensaje de error, pero, si o lector quisiera forzar la reconstruccin del target, sencillam ente usa la utilidad to u c h p ara modificar ta fecha y ho ra del archivo. Esto lograr que naka reconstruya el target en cuestin.

Captulo 2: Control del proceso de compilacin: el raake de GNU

53

" a r g e t t a r g e t n o t 'S a d e b e c a u s s o f e r r o r s . Tuvo-lugar u n erro r m ien tras se c o n stru a el targ e t designado. E ste m ensaje slo aparece cuando se utiliza la opcin - k de make... que obliga a ste a con tin u a r aunque ocurran e rro res v er ta b la 2.1. pgina 37). C uando ap a rece este e rro r exs:en d iv e rsas soluciones posibles. El prim er paso se ria tr a ta r de construir slo el ta rg et en cuestin y. basndose en los errores generados, d e te rm in a re : sig u ien te paso apropiado. j op e<y -*t < Je *'<9 s* UHa cubierta en rr^or de&Oe en !a taco 2.L 'Opciones comu nes Ja comandos 5- saXeV Dgina 37. n<xn_prograr:a: Comiand rro t fo u n d -m a k e qo pudo en co n trar n o _ p t-o g ra r:a . Esto ocurre h ab itu alm en te porque no m _ p rcg ram a ha sido mal ripeado o no se en cu en tra incluido en la variable de en torno SPATH. In d istin tam en te utilice el nom bre completo del program a, in cluyendo su ru ta de acceso, a a d a la ru ta completa de acceso a ncm _ p r o g r a - a a la variable SPATH de maJkcfile. I l e g a l o p t i o n - o p t i o n . La invocacin do maka ncluiu u n a op cin que raake no reconoci. N o utilice la opcin que ocasion el conflic to o verifique su sintaxis.

Lo que viene
Este captulo le present al lector d comando m ake, explicndole por qu rosulta til y cmo utilizarlo El lector cuenta ah o ra con la suficiente buse como pora com enzar a escribir y com pilar program as sim ples en el entorno de doarrollo de Linux. Luego de p rese n ta rle u n a v ista prelim inar del pro^ram u quo h a b r construido cuando haya com pletado este libro (captulo 3. "Acerca del proyecto'), la P arte II le perm ite com enzar a program ar concretam ente al ensearle cmo program ar L inux a nivel de tatema. El lector com enzar con el modelo de proceso de Linux, cubierto en el capitulo 4. Procesos."

Acerca del proyecto


Al final de esto libro se encuentra el cdigo fuente completo re un programa do base de datos p ara CD musicales, to talm en to operativo y funcional. El mismo fue disertado con el n d re u n ir en u n vnico proyecto muchas do las tcnicas que se aprenden en el libro, do modo que el lector pueda ver cun tos do estos tpico*, toles como el m anojo d e archivos, la salida a pantalla en modo texto y la API de base de datos, encaj an entro ai y funcionan como un todo coherente L na dt las limitaciones do muchon libros d* programacin de aivel bAsico os que. aunquo realizan u n trabajo excelento ul mostrarlo *1 lector todo tipo do tcnicas, h erram ien tas y detalles, no m u estra n cmo todos esos elementos encajan entro si. Eso no e i culpa del autor, j i c o del material, que necesaria m ente tiene que c u b n r dem asiado terreno. Tambin refleja el formato del gnero, q u e supone, de forma correcta, que uno quiere aprender cmo hacer X. Y y Z, pero que habitualm ente pasa por alto, debido a ia reatricaoncfi de espac:o y que impnr.e la m d u s tn a editorial, la necesidad de relacionar entro sf todo ese m aterial. Mi esperanza es que e s te proyecto de programacin ofrezca una solucin a ese defecto potencial.

56 Programacin en Linux

El programa de base de datos de CD musicales


proyecto que se com pletar en este libro es u n program a de base de datc> p ara CD musicales. E n realidad, el mismo ya se en cu en tra completo. 1 lec tor ir recorriendo su diseo y creacin mdulo por mdulo, a m enudo blo que por bloque, p ara ir ganando u n a mejor perspectiva acerca de cmo el m aterial que va aprendiendo en e ste libro v a encajando enere si.
1

He tratad o de hacer este program a lo m s m odular que fuese posible, se p a rando por lo tan to la in terfaz do usuario del ad m inistrador de base de dato s y colocando el cdigo que no fuese tran sp o rtab le en ta n pocos mdulos como me result posible. Adems, ol cdigo alojado en bibliotecas, ta l como el de las ncurses y bibliotecas do base de datos, se en cu en tra rodeado por el cdigo de la aplicacin, de modo que aunque la im plem entacin vare la interfaz perm anezca gua!. El proyecto es altam en te personal, al m enos desde m: perspectiva. Ya existen muchos program as sem ejantes dando vueltas por all, algunos de ellos mucho m s ricos en prestaciones y atractivos de ver que ste. Pero ninguno de ellos hace lo que quiero quo h agan y de la m anern en que quiero que lo hagan, O sea. este program o satisface un anhelo, lo cual constituye u n a de las motivaciones que alien tan todos los trabajos de cdigo fuente ubiorto. tal como arg u m en ta E ric Raymond en su excelente artculo, L a catedral y el bacar. P u ra o btener el texto completo de* este trab 3 * jo fundam ental, dirigirse o h t t p : / A m v. tu x e d o . o r g / - e s r / w r i t i n g s /_ c a t h e d r a l - b a z a a r /c a th e d r a l- b a z 3 a r.h tm l
C o m p o n e n t e s y s u b s is te m a s

A au nivel m s simple, ol proyecto com iste de un programa ejecutable desde la lnea de conuindi!), c l l e n (fe_cclm. c, adecuado pura .;or empleado en guiones de interfaz, un cliente intoraotvo do GUI, i n t e r f a z u s u a r io _ c d ir . c. y tre s mdulos de ayuda. c d m _ p a n t a ll a .c . g e s t o r _db_cdni7c y u t i l i d a d 8 S_b_Cdm.c. Lau relaciones en tro cadu uno do esos mdulos e en cuentran ilu strad as en la figura 3-1. peni r royaos

fAyJul F ig u r a :i. 1, Relaciones entre os program as y el cdigo de ayuda. Como se puede apreciar en la figura 3-1, les programas cliente se basan en las rutinas, o servicios, que proveen e d m ^ p a n ta ll a . c. g e s to r_ a b _ c d (r. c y u tilia a d e s _ d b _ c d r n . c.

Captulo 3: Acerca del proyecto

57

C iie r .e _ c d r a . c recorre y sep ara las opciones de ln ea de comandos y su s argum entos asociados ce ag reg ar elim inar, pro cu rar y buscar registros de la baso de datos de CD. La totalidad d e su diseo se h alla cen trad a en que sea u n a utilidad de lnea ce comandos adecuada p a ra su empleo en guiones de in te rta i. No es interactiva y re to rn a cdigos de erro r adecuados que puedan er utilizados en un escrito de inteTfaz. c l i 9 .i t e _ c d m . c llam a ru tin a s definidas en g9S to r_ d fc_ cd m . c p a ra que efecten el trabajo de acceder a la base de datos y desplazarse por la m ism a. Adems de u tilizar ol ad m in istrad o r de base de datos g e s to r_ d b _ C d m . c y las fondones u tilitaria s de _ d d _ c d n :.c , m t e r f a z _ u s u a r io _ c d m .c ta m bin llam a funciones presentes en c d " i _ ? a n ta l la .c . c d r . _ p a n t a l l a . C encapsula la funcionalidad p ro v ista por la biblioteca de ncrses. otorgndole a i n t e r f a z _ u s u a r o _ c d B . c la capacidad de pincelar la p an talla, in te r p re ta r pulsador.?? de tecla y ex h ib ir dato s la ba 3 C de dates. Los mdulos de apoyo, a su vez. se b asan fuertem ente en llam adas a sistem a y otras bibliotecas de referencias. g e stcr_ d b _ _ c d m .c ainieciza, o encapaula. toda la funcionalidad de base de dato s que requiere c l i e n t e _ c d m . c. El m dulo de base de dato s consisto do envoltorios do funciones que internctun con la base do datos Sin embargo, c lie n te _ c d r c .c , fuera de em plear una pocas declaraciones ^ p e d fic a s de baaos do datos, no necesita sab er n ad a so bre l i interfaz la bo de datos pa^ utilizar la API de base de datos. Al implement&r lo detalles m enores do funcionalidad de la base de datos en un mdulo .-eparudo, la mpiementaciflr. principal puede cam biar sin necesidad do modificar el cdigo de la aplicacin Eate tipo de m edularidad re su lta CBencuil pora poder escribir pro^ramna que sean fcilmente m antenibles. El cdigo de adm inistracin de p an talln de c d m _ p a n t a ll a . c Uovn a cabo una funcin sim ilar p ara el cliente G UI, i n t e r f a z j J S u a n o _ c d m . c. Atala el c digo del mdulo principal de ios decalles de la respectivo biblioteca de ncurses de adm inistracin de pantalla, lo que perm ite modificar la implem cntacin do asta diurna sin afectar a la aplicacin. c d n i_ p a n ta lla .c tam bin perm ite a In te r? a z _ u s u a n o _ C d in .c concentrarse en transferir datos desde la base de datos hacia la pantalla, lo que es s u propsito prim ario, en lugar de ten er que ocuparse tam bin de redibujar la p a n ta lla o exhibir un cuadro de dilogo.

Lo que viene
Este capitulo le ha sum inistrado a l lector una breve introduccin al proyecto de program acin que en co n trar a i final de libro.
S aSgo fuerte o crtw tn sara a s a orcyeeto crogramacn. unto con su uwto oxp:catM>. se pjoOs nexx^rar en Pryjeco oe yr^arracn : una base Oo cacos da CD 'Jo rrusica'

E n tre este mom ento y aquel, sin em bargo, le queda al lector mucho terreno por cu b rir La Seccin II. "Program acin de sistem as comienza con u n a n lisis de los procesos de Linux, seguido por u n capitulo sobre seales y su m a nipulacin. Poca 3 aplicaciones pueden o btener algn resultado significativo sin te n e r que adm inistr a r procesos y m an ip u la r seales, de modo que dicho m aterial constituye una buena b a se sobre la cual construir su s conocim ien tos de la program acin en Linux.

Parte II

Programacin de sistemas
4 . P ro c e s o s 5 . S e a le s 6 . L la m a d a s a s is te m a 7 . A d m in is tr a c i n b s ic a d e a rc h iv o s e n Linux 8 . A d m in is t ra c i n a v a n z a d a d e a rc h iv o s en Linux 9. Daem ons

............

Procesos
La com prensin del modelo de los procesos de Linux resu lta esencial p a ra com prender ;a m ayor p a n e de su com portam iento a bajo nivel. La nocin de proceso subyace en la m ayora de los derechos de acceso a archivos, las se a les y el control de tareas. S ste captulo cubro los siguientes tem as: Q u es un proceso Inform acin do procesos IdantiCcadores de procesos Creacin do procesos Supresin (kiU ing) do procesos
M a n ip u la ci n d e procesos

Tbdos los program as de ente capitulo pueden ser encontrados en o sitio Web n t ? p : / / w i v r ^ c p . c c m / i n f o bajo el nm ero do ISBN 0789722151

: / / 'g v / j w J l h x / s x h t d - i

J.

Programacin en Unux

Qu es un proceso
l'n proceso es u n a instenci_de l a ejecucin de.uziprogram a y tam bin la unidad bsica de program acin del sistem a operativo. Un proceso se puede i^ im iia rX u n program a en ejecucin y consiste de los siguientes tam en El contexto del program a en curso, que es ol e sta tu s co m en to de ejecu cin del program a. El directorio co m e n te de trabajo dol program a. Los archivos y directorios a los cuales tiene accoso el program a. Las credenciales o derechos do acceso del program a, tales como su mo do de archivo y propiedad. La cantidad de memoria y otros recursos del sistem a dSjgnurion aJ proceso. Los procosos jon tam bin la unidad b3tcu do program acin do Linux. El kcrnel utiliza procesos p ara controlar pj jjccotfv ja CPU > a otros recursos del sistem a LOS procesos en Linux d eterm in an qu program as corrern en la CPU, por cunto tiompo y con qu caractersticas. E l fijador de tiempos del komul distribuye lo* tiempoejocuchui curg d.- la CPU, denom ina dos cuotas, entro todos Ion procesos, apropindose de coda uno de elloa. suce sivam ente. cuando su cuota de tiompo expira. Las cuota.-, de tiem po son lo suficientem ente peq u eras como p ara que, en un sistem a que cuente con un solo procesador, d la im presin do que vario!, procesos 3e e st n ejecutando sim u ltn eam en te. Cada proceso contiene ta m bin lu .suficiente informacin sobre s mismo como pora que el k em el pueda activarlo y desactivarlo angn sea necesario.

Atributos de un proceso
lo s procesos tien en atributos o caractersticas que loa identificar, y definen su conducta. El k em el tam bin g u a rd a in tern am en te una gran cantidad de informacin acerca de cada proceso y contiene una interfaz o grupo de llam a das a funciones que le perm ican obtener dicha informacin. Las secciones si guientes an alizan qu es esa informacin y las interfaces que le perm iten al k em el obtenerla y m anipularla.
Id e n t lf lc a d o re s d e p ro c e s o s

Los atributo s bsicos de un proceso ann s u identificador o ID. abreviado PID, ... ; : ;.o, PPID. F into el P tt) como d PPED so_cros"posihvo8 y disShtoscle cero. U n PID identifica a un proceso de m anera univoca, y por lo tanto inequvoca. C uando un proceso crea un nue vo proceso se dice que ha creado un proceso hijo. Recprocamente, el proceso que cre un proceso hijo se denom ina proceso padre. Se puede tra z a r la ascendencia de todos los procesos h asta llegar, en ltim a instancia, ai proceso que r.ene el PID 1, que se denom ina proceso i n i t . El^ proceso m i t s l prim er pT5g3 q - Liene lugar despus qu arrp ^a f l kem el. i n i t pone on runcionam iento el sistem a. comienza los d aem o n sy ejecuta la program as que se ceban correr.

Captulo

Procesos

63

A unque los detalles especficos dei proceso d e arran q u e (booO de u n a com pu tadora exceden el alcance de este iibro. es im p o rtan te recalcar que i n i t vie ne a ;e r el padre de todos los dom as procesos. Las funciones oue p e rc u te n que un proceso obtenga su PID y su PPID son q e t s i J v a e t o s i d . E stn declarad a.- en el" archiv,: de ncaoezado de aslena < u n x s td .n > . y s u s prototipo son.
0i3_t s*tai<J{void)

OW_t a*:cc;3(oid); g e t p i d re to m a el PID dul proceso que efectu la llam ada, m isalra que $ e tp p Id retorna el PPID de quien la llam , que vendra a sor el PID del pad ro doi procedo que Hamo a getOC G Por qu razn necesita un proceso conocer su PID o el PID de su podre? Un empleo comn do un PID es crear arch iyoa.o.directorios quo sean nico Luego de u n a llam ada a g e t p l d . por ejem plo, el proceso podra utilizar su PID p ara crear un irehivo tem porar.o. O tra ta re a tipien es escribir el PID en un archivo de registro de actividades de un program a, como p arte de un m ensaje del mismo, p a ra dejar on claro qu proceso fue el que grab el m en saje del registro. L*n proceso puedo u tilira r u PPID p ara enviar una seftal u otro m ensaje a su proceso padre
** E je m p lo

jiLy MHO

Eate breve program a im prim e el PID y < P P I D del mismo:


/ HOBCre <jl r a g r a i j tr J n w r m ; 0<-Dt<Js.C /

i p _ p r a c _ i a s .c

la p .- is * ; * !0 y *

tnciwat <ttcio.*>
tin e lo s * < vu ste .K >
tuieluet <z:liz.r

iflt Mi.' (VOI3>


p e ia tf { * ? 1 0 W ' f , a * to ic (H ;

anat("PFio t-if*.*, getpdUOi: -:.izLtr_-XCCS La salida de este program a, en el sistem a del autor, fue:
5 ./iap_proc_i3s

PIO = 15249

> )

>

Programacin en Linux

Por supuesto, los valores exhibidos sern diferentes en su sistem a.


NOTA
< u ris td . c ia ra mochas funeiofles que son sarte del estndar POSiX. Sucintamen te, P031X. que se deriva do Pcrrepiy Qpenar.iTg Svste/Ti Interface eXtertsicr.s. es una i ar ia de -cr~\%s cue define 'os y ra p a -irta ^ - a provee? un sisteme o-sr-s-o Ofjra Que se lo considero "conform a POSIX". S>n enbargo, PSiX^defino solamente e estrdar inteffar'pero no nlrigunSTiPofsrrer.tacin, Mtchss sistemas operativos no-UNIX. ttfes corro el Windows NT de Microsoft, aducen conforrrar 3 POSIX. 0 acatamiento a POSIX os importante porque, a menos en teora, r-ace que las aplicacic'es escritas para funcionar en un tipo de sistema sean sencillas oe transportar 3 ctro sistema. Al jtillzar a nterfaz POSIX estndar para obtener su 10. por 0;errpio. e < crcgrama no tendra que ser roscrito p*'a correr en otro sistema. Er. cambio, e progra ma eeoeria simplemente 3er recompiiado en el nuevo s-stema. Finalmente, dado cue POSiX es un estanca' generalmente aceptado, muchas emoresas requieren ou e < soft ware que adquieren sea conforma a POSIX.

Id e n tif ic a c io n e s re a le s y e f e c tiv a s

Adpma rfy ans PlDs y sus PPtD s. cada proceso tiene varios otros a tn b u to s de identificacin, que so batan en la ta b la 4.1 ju n to a su tipo on el lenguaje C y las funciono* que los retornan. P a ra u tiliz a r las funciones listad as en la tercera columna de la tab la 4.1 so debe incluir en el cdigo tonto <SyS/ t y p e s .h > como < u n i s td .h > * --------
TabJa 4 .1 . Atributos de procosos. A trib u to
10 do
10 do

T ip o

F u n c i n

proceso

p id _ t p id _ t u<j_tg u id _ l g id _ t
g id _ t

g e tp id ( v o id ) : g e tp p id ( v o id ) ; g e tu id ( v o id ) ; g e te u id (v o ld ) g e tQ id (v o id );
g w t o g id (v o id );

padre dn proceso Ddo usuario real


10 do usuario

afectivo

10

de grupo ro.V grupo ofectlvo

10 do

Cada proceso tiene tres IDs de usuario (LTIDs) y tres ID 3 do grupo GDs). Los mismos son empleados principalm ente por razones de seguridad, tales como asignar permisos de accesos a archivos y lim itar quin puede ejecutar ciertos program as. El ID de usuario real y el ID de grupo real especifican quin es el usuario concreto. Sn ledos de / t c / p assw d cuando uno ingresa al istem arC natituyt'n las representaciones num ricas del nom b red eacceso y l principal pertenencia a un grupo del usuariu que est ingresando. Por ejemplo, en mi sistem o, mi U1D es 500, que corresponde a kw all, mi nombre de acceso. Mi GID es 100, que corresponde ai grupo denom inado usuarios. L is funciones g e t u d y geteuid re to m a n el IID real y el efecti vo, respectivam ente, del proceso desde el cual fueron llam adas. S im ilarm en te, las funciones getgid y getegid retornan los GlDs efectivos del proceso que efectu la llam ada. Los IDs efectivos de u suario v grupo ann nriliaydna -. -nte con pr j;:o-:tn. de Seguridad "i': jjtt c r-

Captulo 4: Procesos

65

_r.ms:anc:ai. coinciden con los Il> reales d usuario y de graos. La diferen cia enera IDs reales y electivos tienen importancia principalmente con pro gramas que son s e tu id o s e t g i d , que representan un tpico a ser comen tado en la prxima seccin.
E je m p lo s

i Utilizando las funciones listadas en la tabla 4.1, este programa muestra los UIDs y GIDs reales y efectivos di proceso
EJEMPLO

>('>rcrj j e l

en :nter''.e: i s . c */

r
a c 't iii le s UICs y lo s GIOs

fiftClvt <JtCi3.*> *ir-c:'5 <yr.i3*3.n #ixiv00 <>tl:0.ft>


ln t M in(vo )
i

'O ae usuario r t i: v j \ o '. g tg i n ) ;

9 : u io ()); 0< -irtf(*:o Ct grupo r l : VJ\n*, gQ*<3());


p rtrt* P I0 * 1j gruco fa c iv c : S c \ n \ go*ogid(|); litlfXST .SU CC ES Si;

p r io t f {*0 < 1 4 usuario fte tiv o : * }\n .

) La salida de este program a, en ei sistem a del autor, es la siguiente:

S ./IM nufttttortt
10 t UMTiO r t i : HO

10 Ce luirle *f?ivo: SW
s a lid * :o O

2 grs r e t : 1 N 9 q h c e f c :iv o : !M

EjeMPLO

. . f .*J@c
^

2. Como so hito notar antes, en circunstancias normales, loa UDn v GTDa rea les y electivo; coinciden, y la salida del programa anterior ilustra eao. Para confirmar que esto es verdaderamente asi, utilice ei comando su substituye usar1para convertirse en otro usuario y luego ejecute el programa. Los UIDs y GIDs seguirn coincidiendo, como lo muestra el siguiente ejemplo: 15 5U B_:CtQr Psssaro:
$

1 C
.n_Iaccar .;U -ia a (U lJ4 -i0 1 ) gi*0UC*=lWlU5uar03>

SALIOA

j . / tte f ttif ic a e e r e i

Programacin en Unux

10 U usuario real: 503 to es uuario afectivo: 503 10 5 grupo real: tW :D 'Je gnjso efectivo: 130 El co m a n d o I d im p rim e lo s U ID s . : ' lo ejec u ta (v er man i d p ara m s in form acin ). C u a n d o e l u su a r io l e c t o r jecu ta i d e n t i f c a d o r e s , la sa lid a co in cid e con la d el com an d o i d d e l s i s tem a . M as im p o r ta n te tod ava, a p e sa r d e la p rop ied ad d el u su a rio y del grupo sobro i d e n t i f c a d o r e s , ta n to lo s U ID s com o los G ID s efe c tiv o s y rea le s 3on los d el u su fln o q u e lo ejecu ta . El tercer co n ju n to d> TDs lo c o n stitu y o ol U ID gu o rd a d o y e l G ID gu ard ad o E sto s identificudorR) je d en o m in a n ID s gu ard ad o porque son gu ard ad o por la funcin e x s c , cu b ierta e n la secci n "M anipulacin de p ro ceso s,' cu a n d o cjucuta p rogram as. G e n e r a lm e n te Ioh p rogram ad ores s lo d eb en t e ner on cu o n ta loa ID s rea les y efectiv o s. P ro g r a m a s s e t u i d y s e t g i d C om o s e co m en t a n te rio rm e n te, u n a situ a c i n en la cu al loa ID s r e a le s y efectiv o s d e u n proceso d ifier en e n tr e s to n e lu g a r cum ulo el p rogram a que ee ea t ejecu ta n d o os s e t u i d o s e t g i d . L os p rogrom aa s e t u i d y s e t g i d :e U flm a a a s p orq u e ! C ID y o l G lD roal y ofo ctivo q q o s e c s ta b ie c e fl s e hac e a ig u a la s a i L'ID y G ID de! arch ivo e n lu g a r di- a ;<*. del p r o p ic ia r o . gi c o n tra ejecu ta n d o ol p rogram a. El propc p rogram as s e t u i d y s e t g i d e s otorgarlo p e r m iso s e s p e c ia le s al v isu a n o q u e e s t ejecu ta n d o el program a. Por ejem plo, co n sid erem o s el p rogram a p a s s w d , u tiliza d o para m odificar c o n tr a se lla s < p a s sw n rd a ) La m ayora d e los s is te m a s d e L in u x a lm a cen a n la s c o n tr a se a s e n / e t c / p a s s w d . E ste arch ivo p u ed e ser led o por to d o s los u su a rio s pero escrito slo por el u su a r io r a z . S e p u ed e a p reciar esto con s u m a cla rid ad cu an d o s e corre i S - i / e t c / p a s s w d , com o sigu e: i i# 1 /otc/oasso r * . r - ^ r i root bin 703 Aug l f l: /tc/passac C om o resu lta d o , el program a p a s s w d d eb e se r p rop ied ad d el u su a rio root. S in em b argo, com o p a ssw d d eb e poder s e r e jecu ta d o por c u a lq u ier u su a rio , e n co n d icio n es n o rm a les no p od ra a c tu a liz a r el a rch iv o / e t c / p a s s w d . La so lu ci n a e s te d ilem a e s q u e p a s s w d s e a u n program a con s e t u i d r o o t ; e s decir, quo cu an d o s e ejecu te, s u U ID e fe c tiv o s e a el U ID d e u su a rio root, p erm itin d o le por lo ta n to a c tu a liz a r / e t c / p a s s w d . NOTA En readao. 5 rrayona cc es sistemas Unux m oocnos utilizar, contraseas oe.itds (sOacc* passworas), PC' 10 Que la contrasea se encuenda altnacenada en / e t c / snadc-#. cuo puode ser ielaa y e$c.-'t slo por les usuarios root. D campo correspon diente a a contrasea en /a te.'p a ssw d e s is.etra x. U n p ro g ra m a con s e t u i d tie n e u n a s e n lu g a r d e u n a x en el b it d e ejecu cin para el p rop ietario, cm o lo m u e str a e l sig u ie n te listad o:

Capitulo 4: Procesos

67

S Ls - i / u s r o ip /m s j c

- r s

r -*

r -x

t root

ir.

2<S'~

/usr/ain0a$3v*d

D e m a n e ra sim ila r, u n program a con s e t g i d tie n e u n a s e n g n b it d e e je c u c i n p ara ei gru p o. P ara h a cer q u e u n p ro g ra m a su a con s e t u i d s e d eb er ejecu ta r e l s ig u ie n t e com ando:

_or--ari3

El siguiente comando hace que u n program a ea s e t g i d : _ 1 zn&yi 2*s ri^cirario P R E C A U C I N


tos cntrvrr-a s nrr. cor a etuid o s e tg id ccftsvtuven riesgos pem lu seguridad oorove. ayrtcv* -av *,cv*.a2 >es <yy i m > M usuarios di comn ce tos morrales. los n\vno* soo contoos con ortvi*>os de suoer.-s. arlos y oor lo tanto M W totol acceso al n w m ^-j^asr Kocce' 3 oarto Cei listema. Eje*?, wtromo curiado cuan do oj*c-.te o c-- u r orifirama Oc root con s o tu id .

In f o rm a c i n d e u s u a rio A u n q u e la* co m p u ta d o ra s se d ese m p e a r, m u y b ien can los n m eros, toa a e re* h u m an o* trab ajan m u ch o m ejor con n om b re* A fortu n ad am en U j. e x is te n d o s m a n e r a s d e coQ ver r lo s C ID s en n om b ren lo#ilile.i prn los u su a rio s Lu fu n c i n 3 t i o g i r retorn a ol nom b re d e a c c e s o del u su a rio q u e e je c u ta un proceso. C u a n d o u n o su m in istr a su n om b ra do a cceso , s e lo p u ed e p a sa r a la q u e co rre sp o n d a a s e n om b re d e acceso. E i otro m tod o c o n s i s t e n tr a n sfe rir e l L I D d e u n p roceso d ad o a la fu n d n g e t p w u id , q u e an im ism o reto rn a el d a to a d ecu a d o p r e s e n te e n / e t c / p a s s w d . Getlc-on s e en cu en tra d eclarad a on < u m s t d . h> y nu prototipo e s el sigu ien to: CP*r ;

> E sta funr.on to m a un puntero .a unocodena que contiene el nombre 4fc. acceso del uauar.o que- se encuentra corriendo eVprtaCB o NtJLL si ! inrmadn no se encuentra disponible, getpwnam o s tc c la ra d a n <pwd. h>. Su prototipo es.
s trje t p a n e $et9^"-s*(cor>st crar r v \ ;

na"-e (n o m b re - d eb e s e r u n p u n tero a u n a c a d e n a q u e c o n ten g a el nom b re d e acceso e n c u e sti n , getp w n a m reto rn a a n p u n ter o a u n a e s m ic t u ra d e p a tr n p a s s w p E l p u n tero h a c ia la s r u c tu r a p a s s w d q u e fu e r e to m a d a a p u n ta h a cia u n 3 p o s id n d e m em o ria a sig n a d a e s t tic a m e n te q u e ser s o b rescrita por la p rxim a lla m a d a a g e t p w n a c , d e m odo q u e si se n e c e sita d isp o n er d e e s t a in fo r tn a o n m a s adelante: s e d eb er juardar la in form acin d e la e str u c tu r a a n te s d e lla m a r d e n u e v o a getp w n am . 3 * / E je m p lo am e:
s jc m p lo

y - E s t e ejemplo ilu stra ei com portam iento ta n to de g e t l o g i n s como de getpw* del ; - : =i er. : - c i - * r t : gecnsK.c accasa

c o t ^ i c t ' i . c - Ofctr'cicr es r o e c m

*/

f
&3

.1

,t

Programacin en Linux

in d u c e <stdi:-.n> in c lu a s <s:<Jii0.h> n c lu d c <3y3tyc23.ri> incluts =:nclu 06

<

(pmi.t&f

in r *aln(vid)

(
:nar *nor._3cce30.

s trjc t 53S5d auntecoj?'


/ Obtencin d e l nonbro de lf((rv3R.acceso * ceso /

getloginnl) == w u .) <
>

r Cuidado: */

a e rro rrg e T lo g in -) ;

mt<&ur_FAiiufl6>;
/
a rtn tfC g itia g in r w r n o <\n'i pcmicgisoI ;

) 0Ctnclon 3(1 la c o i'ti] rta san uso nonbro do jo c o so / l^ K o u n t o r o jJa t o * (jo:pon.vi{non_.jc:<na)) prrorf*{ tp w n M i*); 4 *tt(Ex:T_FAlUfl); n u lL ) {

/ Mostrar <1 nc.no,-o sonploco / o r in tl< 'w c a ): \a\n*, pw n :aro _38to > p _cu co i>;

e x I t <EXIT_SCC8SSJ;

/oor_ronorns
5 i 0 5 in 'orno kwa l

3cos: Xurt wali


A U O A

Las sentencias i f resguardan co n tra la posibilidad de que g e t l o g i n o getpw nam retornen NULL. S: a lg u n a de las do 3 funciones reto rn ase NULL, p e r-"o r im prim ir un m ensaje de erro r y el program n te rm in a r . Prim ero, el program a utiliza g e t l o g i n p a ra recuperar y exhibir el nom bre de acceso del u suario que corro o program a. Luego, u sa ese nombre p ara recu p erar el - \ d sto de la contraserta y exhibo el nom bre completo del usuario (alm acenado en el campo GECQS de / e t c / p a s s wd: v e r man 5 p assw d p a ra a c e e o e rir ms informacin)

I Captulo 4: Procesos 69

In fo rm a c i n a d ic io n a l s o b re p ro c e s o s

inform acin sobre los procesos, adem s de sencillam ente los LDs e proceso, de usuario y de grupo, talcojB fljiu.u: ii^iLdeJS-rtcursi-dul r.stem a y la-? ripmpfts da p j^ n cir.. S le s e que he puesto tiempos do ejecu cin y r.o solam ente tiempo. E sto se debe a que el.isem el dft .im ix nim aruna tres valores d isa n to s de tiem po j a r a ..los procesos, a saben - - El tiempo n o rm d el que m edira un cronm etro1es el tiempo transcurrido. El tiem po de CPU de usuario es la can tid ad de tiempo que el procesadflnvrte"Jecut5H3o~I cdigo de modo usuario (no de kerncl). _a E l tiem po de CPU de sistema e s la can tid ad de tiempo in vertida en la ejecucin de cdigo de Jtemel. _3 z'erene>-j otra -oco usuaria y mo<Jo a *' se 9*>ca en ma*. oa* 120.
Qu

es una llamada 3 siste

El lector puede obtener esta informacin haciendo una llamada i tim e s o g e ocursos del prooesadofrstn emburro, puede ser obtenido so lamente con una llam ada a g e tr u s a g e . Estos recunsrw tienen todo 3 que ver con las estadsticas do acceso a memoria. E ta seccin comenta primero la obtencin de informacin referida a tiempos, y luvijo cubre la utilizacin de recursos. C O N S E JO
Cu* 2 c r t i B am at. 4 ( C i n * s o l a d # $ f tr u a M e ,.5 de&ertaemplear para J . - - . . '. v . " m hcrodaco . uncic lidao lano 09 8S0 m o de SV*U UNIX, y aneos cuentan cor amoas funtcoe*. POSlX. i ostirvai cuaJ Unut trata o* contornar, soto especifica tim e s . Sin embargo.
tary-ytra a !ai y a {r y ? a < iy ti una daaenpan m a compteu e a utilizacin re ro tunos por parta o un oroc<nc7 ir'rtW b n E n .enca porquo UftuX (n partir do su .*erin 2.2.10: rrpementa vo c>nce de 'o dieciseis recursos ceinlos on la os uuetua r u t i g e Rnai/nanw a informacin -toere tiempos que retorna tim es es ms a*t*3*3a qua la ratomaoa per g e tr u s a g e . Oe modo cuo. st e< lector slo 'ecesitnse rJormaoPn soor* oampos o aseara acnonr st estndar POSlX. eDcrd utilizar tla a s .

S< no - t preocupa mantener re conormicat con POSlX o ai "cortasa la nformne-n attoon# provista por g e t r u s a g e . uonceata Ottlma.
TIEMPOS DE PROCESO y

La ru n c i n tii e s 'i e encuentra p ro tatip ad a en < 3 y s / i m e s . h > como so in dica a continuacin: cioc>t_t tiM is trjc t tas auflj tim e s re to rn a el nm ero de tica de reloj que h ayan transcurrido desde quu TsStBHgraffAcca. lo q u e ta m b i a conoce rom o tiempo de reloj, bu? es un puntero a una e stru c tu ra (un espacio en m em oria o buffer) que responde al p atr n t ~ s w e r pg in a 71) y que alm acena lo5 tiempos del proceso en ejecuciSaT f l o c C t es el tipo d efv alo r reto m ad o .
E je m p lo

El siguiente program a utiliza la fu n d n sy s te m p a ra ejecu tar un comando externo el proceso er. cuestin), y luego llam a a ti m e s p a ra o b ^ n e ria R formacin deseada.

<

70

Programacin en Linux

/ Negare da i pr^grana an Inte*r: et: rssospi.C V

/*
utii_-e cu-so s?.c - detiene tieuoos da prouoso y u tiliza ci n 3 recursos * La tarninoiogia enplaada se explica 9n las sahnas quo sigvei al orogra;a

I
inclu* <*tdio.h> ncludo < s :d lib .h

incido ll y / t w s .f t^
in c lu <tUM.h> includo uniste.R> /;

aio calcuiar_sot^ndo*()*r \ In t MUifvoWl

clccK _ti;

H f'*'

/
/

cloc*_t c o n u c o , fin a l, tics_lnsutildos; s tr ic t tasrtic_conl#nzo, t lc .f ln a l;

'H 'i

1 * * 6 '

JU.
ce*im c tiM s(Juc_co<ienzoj; / l prccoso ot*rro lo constituyo on sto c a 'g rp GioDal Rojular c*prsion P n n t; conando de UNIX para buwUr raemos do ditos o oat.-ofios do torno p a c if ic o (on asto co ia oalbra ol* en un jrcntvo. la salida do gr#p jo rudirluu a f in do -'vitar quo la aantalla ie atlttorre c datos /

_
f i n a l com onzo

i y it M < 'g r p o l / u * r / d o c / * r > 'a * v / n u li, 2 > / a e v / n u l l 'l i r i n a i - c in o s iA t ic | _ i, m # i) ; t ic j .in s u B id o s

calcular_seoi-''dosCTioi!(>o transcurrido . tics_ir,suiuos); put3{*Tonoos de prccoso padri*); cauu;ar_s4oupdose\tujo de CPU por usuario*, tle _fln a l.tB i_u ti e ); calfcjiar^sesuftaost Uuso oe CPU por s u r e ra , tu r ir .a l tcs _jtL * ); pu:s(*::aapos de proceso m jo * ); calcuIir_segtndos(*Vtuso ae CPU por usuario , tic_final.t*s_cutLne>; cal:ular_s95undosi Vtuso de CP'J por sistema1, tic _ ir .a i. ts_C 3tino);
xit-:E xrr_S yC C E S S !;

)
oio :alcular_sequndoa(eftar *caoena; do ck_t *cs_nsuriaas)

{ r OOtMti* tos d roloj/sepunoo '/


long tissjxsr_eg . sysconf< SC CLX TCKJ; p rin tfC V s ; w .2 segundas\n*, escena, (flo s t! tic s insumidos -)

M
,

:ics_3or_s35.; i

Captulo -5: Procesos

71

E n ax. sistem a, una corrida de p rueba del pro g ram a cre la siguinte salida:
S u t U .r -c ir jc s '

Tetofl Mttorf'MJo: 9.9i H U ^ J


tisesc 3# p-OCSO pedr

usa

ds C P U(Kricario: se C*J ocf( i s t i a : 2* :.-oc50 ltjo jo di CPU K - i-jjrip: jsc * ZP'J pori m t u :
ljo

a.M s*5u*ao* 3.08 g u r e s Z.3 * seguraos


t t seguros

La prim era cuestin a observar es que nn parece h ab er acumulacin de tiempos en e: proceso padre Aunque esto s-e cubro con mucho m ayor detalle en la seccin Creacin do procesos* que ap arece m s adelante en este m is mo capitulo, lo que ha ocurrido es que cu an d o el program a llam a la fun cin s y s t e n , gener un proceso hijo y fue ente ltim o, no el padre, el que realiz toda la tare a y acum ul ol tiem po d e CPU. La M gunda.observacin digna de mencin es que el tiem po invertido por el proceso. 19,91 sexuados, no * guui a la su m a.d e loa tiem pos de g P U do usuario y sistem a, 3,44jsegundf. L u n u n de esta ap aran te discrepancia s que la operacin de r g p que tyecut ol procedo hijo, req u iri muchos mfcTrcurso de E/S que de CPU Tuyo que reco rrer 2 331 archivos dC-cncubwado. m s de lu mgaEyts texto, en el sistem a e n cuestin. Loa 16 segundos eostantex estuvieron to fo s dedicados a leer el_dco rgido. Por supuesto, los tiem pos s a r n difcre tw T rt O Tl S^Sm aHl lector. E l v a l o r r e t o r n a d o p o r t l a ie s ea tiem po relativo, no absoluto (el nqjero de tica Ha r^loj desde qug el tatem a ae inici), de modo que p a ra quo resulte til se deben efectuar dos mediciones y u tilizar su diferencia. Esto da como resultad o el tiem po transcurrido, o de reloj. u t i l _ r e c u r s a s 1 logra esto alm acenando los nm eros de tics de reloj correspondientes al comienzo y al final del proceso en tiC _ C O n ie n zo y t i c _ f i n a l , respectivam ente. Loa otros tiempos correspondi_enfi5 a l proceso so n tom ados de la estru ctu ra tjns definida en el encabezado < s y s / t u n e s . h>. L a e stru c tu ra tm s alm acena el tiem po corriente de CPU utilizado por u n proceso y su s descendientes. E st definida asi: st*uc: ta { cel procoso psore (u-usar}/ clodt_t tt * .u tt* ; r Tlenco a* JSC oe
clock_t tes s t i ; ls=systoT / t= s_c-jtit; (c=dulflfen) *

r rieapc 3e uso ce
/ *le o < 3 9 UM a* / Tieoco Ca a$0 de

zlockjc CsefcUsraj.*/

>; Ins*o. estos vs'.ores on cs de reloj, no e l nm ero de segundo.-:. Pa ra conv ertir ios des de reloj a segundos se d eb er utilizar Ja funcin s y s c o rr, o.ue convierte su s =r;^uinetsen vsi& rssque definen lm ites de sistem a u opcio

Programacin en Linux

nes en tiempo ce ejecucin. _SC_ClK_7CK (literalm ente, SEGUMPOS_~ICSJ1E L 0J) s u n macrp que deilne cuntos tics*3e reloj h ay por segundo ^eacn sistem a determ in ado; s y s c o n f re to rn a ese valor como u n a v ariable de tipo lo n g , y el program a la utiliza p a ra calcular cuntos segundos se req u irie ron p a ra correr el proceso. El verdadero caballito de b atalla de este progra m a es ia funcin c a i c u i a r _ s e g u n d o s . Acepta una cadena y u n valor, de ta po c l o c k _ t en esto caso, y luego calcula e im prim e la informacin de tiem pos correspondiente a cada porte del proceso.
UTILIZACIN OE RECURSOS

El empleo de recur 305_ppr_parte.de uuproccao. rep resen ta m q u e sq lam en te tiem po de CPU. S dobo considerar tam bin la huella que produce el pro ces en la'm em oria: cmo est e stru c tu ra d a la m em oria, los r.pos de acceso de m em oria que efecta ol proceso, la cantidad y tipo de E/S que lleva a cabo y la cantidad de acti%'idad de red, en caso de existir, quo enera. El k em el re g istra coda e sta informacin, y m ucha ms todava, p ara cad a proceso. Por lo menos, tiene la capacidad n ecesaria p ara hacerlo. La e stru c tu ra en la cual : c denom ina r u s ag e lo or ratourcc i. < rchivo de etfcbezado < s y s / r e s o u r c e .h > , E sta e stru c tu ra e st definida como sigue:
struct .-jaage (

stnifit tlitval ru_u*.:ne;


Itn C t tinoval ru_s?iB* long n jt8 x rjt; long ru_naxlxrss; long ru_naxjorja; Lon-g

r tioopo es usuario eraieaw /


/* tlenpo flo ustena pioado / / namo ranaco ostaDloddo para roidontca

l tannfto de n o n a corpartlda /
/ tataflo do datos no conpartidoa */

-u.MXiarj*;

long r u _ * l n f l t ;

I ' toiraAo do p ila 00 coapartlda V f rocanos do paginai /


/ fa lla s do pagina / / pornutaciones / / operador,os oe entrada on 0103.10 /

Isng r u j i a j f l ; ; long rujmwap; long ru_tr.oiock; long u jjyb lo ck ; long 'u_g9j; ieng r u jijg rc v j long ni_nsignaii; .ong runvc*; long "ujUvcsw;

l m operaciones co u l : o i on oloque / nansa jos enviados 'I


y nensajes rjciDiaou /

r iertalus rocioidas / r ospaciflc3dore3 voluntarios ce contexto v


.* aspocifcadores involuntarios do contexto /

V;
La estru c tu ra tim eval, a su vez, responde al siguiente modelo:
tmct tinieval { ieng lortfl tv_soc; tv jis o c ; / saconas / / and nlcroseconds /

>; L inux, lam entablem ente, scSlo efecta seguim iento de ios recursos lisu d o s en la ta b la 4.2.

'

.*

'

#' 73

Caaulo 4: Procesos

Ta&a 4.2. -g-.-j'gc5 er s:s:srra s c v e :c$ ave Linux > -ranv'enc seguimienio Recurso____________ Descripcin_______________________________________
'j _ u ~ = fu _ $ - i" e n j_ e n * r u _ o a J 'l t ru^rvsirac T e meo nvertifio ejecutando cdigo Ce mcdC usuario {no-kcrnel! * e n ? o invertido ejecutarlo cdigo de kamet (roouerimientos por z a r e de cigc da usuario oor servicios ce sistemo) N-jr-ero de fallas menores {accesos ce memoria que no gene ran accesos a c^sco) Nmero de fallas importantes accesos da memoria q:;e Origirar. accesos a d-sco) .Vjmero de pginas de memoria ledas desde disco debido 6 fa"-3 S importantes

Como lo indica la tab la 4 2. existen des tipos de fallas de mem oria: ios m eno res v las im portantes. Las fa llo s m enores tienen lu g ar cuando I CJpjj debe acceder* i* pnpdfiaH R A M L E ste tipo de aDa ocurre porque ei c digo o los datos que necesita la CPtT no estAn en su s registros o cacho. Las fallas im portantes aparecen cuando un proceso debe leer datos desde el disco miem bro ru_n$w ap de la e stru c tu ra alm acena el nm ero de pginas de m e m o r a que so deben leer desde disco como resultado do tallas im portantes. Para o bten er e sta informacin 3e debe u tiliz ar la llamarla gt? ti'U S aqe, d e clarada en < s y s / r e s o u r c e s .f i > Los miembros ru _ u ti? n e y ru s tim e do la e stru c tu ra alm acenan el tiem po do CPU de usuario y sistem a que a c u m u la el proceso. La nica informacin n u ev a que getrusage le b rin d a al p ro g ra m ador *: nm ero de fallas de m em oria y de accesos de disco relacionados con failaa de m em ona. A diferencia d e la funcin tim e s , g e t r u s a g e debo ser invocada dos v.-cs* -ti e quiru ubtenec informacin U nto sobre el proco* ifi p ad re como sobre el hjjo. El prototipo do g e t r u s a g e es el siguiente: ir* fio. itr-jct n j g t *uige|. u s a g e es un puntero a una estru ctu ra de tipo ru s a g e donde la funcin vuelca La informacin. El parm etro wfio f qu in ) determ ina que utilizaciones de recu r ro son retom a das . si la del p ro c e r q u e efectu 1a llamada o las de sua descen dientes. quien puede ser solamente igu al a RUSAGE_SELF o RUSAGE_CHIl ORE1 , g e tr u s a g e retom a O s: todo sale bien, o -1 si ocurre algn error.
E je m p lo

Este program a es u n a segunda versin del ejemplo anterior, !a cual utiliza getrusage en lugar de tim es. El trm in o tv_sec que aparece en el listado p e r tenece o U e stru c tu ra de patrn tim eval (pag. 72) la cual es a s u vez p arte in teg ran te de la estru c tu ra rusage. / *oec*i Irm r-: / * uTiI_*ecu.*so$2.c - Ootisrs Tifleos as orccsao y utilizacin ce recursos I fioclut stio.r
# iaeluec < sta lia .n >

#icela Sy/tiBss -v

Programacin en Unux

^ c h i f l e

s y s /r s s o u '- c e .h

# l C lu d e <*:ii>9.h> in d u c e i r i s t d .l p

#a:d s 9 l l r _ s i _ e r r o r ( c n 3 r ); o l e c .i lc u l ,i- _ 5 u n d 0 3 i :h a r *. i s n g ) ;

w t a if l( v o id )

(
s t r u c t r ^ a a - j * e c u r s o s _ u tl liM d 0 3 ;

/ E i p r o c e s o * x ts r n o Id c o n s t i t u y e an e s t e c o so reo G lo b a l R e c u la r * f x p r c s i o f l P r l n t ; co itard o de UNIX p a - a o u s c a r r a c i n o s d o d a to o * p a t r o n a l d a to x t o e p e c i f i c o {en e s t o c a s a l a p a l a o r a 'e l * n un a r c n tv d ) * La s a l i d a do g r* p se r i d i r i g f l a f i n d e e v i t a r quo lu a a n t a l l a t e a t i o o r r e da d a tc a

I
t y i ' n ( - g r p o! / u i r / d o c / * / * > /d c v /n u i.L 2 / d o v / n u l l * ) ;

00 t r r l a e s t r u c t u r a do r e c u r s o * p a r a e l p r o c e s o p a d ra / 1}

lf((0 0 !ru s a ;a(frJS A 5c.S E L f, & re c u r- o a _ u U lln C O s )) s a l l r _ s l _ e r r o r {* g e : r u s a g e >; a -jts C T iiw p o o c e p ro c a s o p a d re * j

:a lc c l a r _ s a g u n a o s |* ',iC P u p o r u s u a r io * , r c u r s o s _ u t i i i x a d o . n j , u t : a e . tv _ e c ) . c a lc u la ^ s a g u n c o s rN tC fU p o r a m t u * , re c u rs o s _ u tiln a a o a .r u _ 5 tio e .;v _ s ) ;

p u t s t ' S i t a d u t i c a s d a a e ito rj# J e t p ro c e s o p a d re on je g u r d a e } * ) : c a lc u la r_ s e g u n d o s < * \ t o a l l a s n a n o r e s * , r o c u r s o s _ u t : l i . i a d o 5 . r u j a i n f l t I ; c a lc u ia r_ s e g jn o o s (* V tF a lla i a p o r t a n t e s * , r e c u r s o s _ u tl lu a d o s .r u _ a ] f l ii; s a lc u la r _ 5 & g u n a 0 S ( '\t? r n iita c i0 M S do p a g in a s * , r 9 c u r s o a _ u ti l ? a o o s .r u _ is a p |;

o o ta n e r l a e s t r u c t u r a ce r e c u r s o s c a r a e l p r o c e s o H ijo (e n se g u n c o s) /

i<(getriisage(RV SA G E_CH !LM EN , i r e c u r s o s . u t i l i z a a o s ^ ** - t j s a l i r _ s i _ a r - a r | g e t r u s s o e ) ; p u t s l * ? i n p o s de a r o e s s o n i j o * ) ; c a l:jl5 r_ s e c u rd 0 3 (* V tC P 'w po* u s u a r io * , r e : u r s o s _ t U i 2 3 d 3 S - . 'i ; _ j t : : c . - v _ j 5 c ,

c a lc u la r_ 3 e g u n d o s < "V tC W p o r s i s t e n a * . r e c u r s o s _ u t i l u s < 0 3 . r u j u t i . '* e . t v _ s e c i ;

O a t s ( E s t a d s t i c a s d n o r i a a o l p ro c o s o n i ; o * ) ; c a l c u l a r _ i e g u n o o s |* \ t o a l l a s n c n c r e s 1, r 9 c j r s c s _ u t i 'i i a a a s . r j _ n i / i f l t > ; c a ic u L 3 r _ s e g u n 3 0 S |* \t F a iS ;n p c r ? a r : $ * . r t c u r s o s j j t i l a z a o o s . r u j t t j f l t j ;

Captulo 4: Procesos

75

a l 7 j l a \ s i g u - i " ^ s n r tiC M M l a* paguas*. rKursos_ytilU4<JOJ.rj_nswo)


i t ' E<I?_5-CCc$31.

}
vais o icu lir_j40unoos(dur cact^a. l<y< valorjjotr'M oi

(
prirtf(*% s: Hl2\n*. ;aca. vIoc_ofeefllOo);

i
vaifl aalir_al_*rrr(c tw

(
parrar icae**.;

litiexir.rA itt* ), i
E te p ro g ram a e je c u ta ol m u m o com ando g r e p que el anterior. S in om bnrgo. a d e m s do la inform acin sobro tiem pos, tam bin exhiba ol em pluo do m i-m ona. ta n to del proevao p adre como 1 procedo hijo. U na corrida del m is m o g e n er la sig u ien te salida: J ./ jtil_r*r^rM 2 'ita c c i ; * 3 sacra (*- *esu*Jos) CPu per usuario:
CPU
90r

tiltiu :

a t t e U t i c u u f e n * t*'. src c e u ssr F ilia s s w p i ; t


P a i l a s l a o o r t a n t r s : 65

?futcio^M se sabina: o
t ; m > c s ae p ro c e s o r*iJO (*r. sa;unao*}

C"J ?3r usuario: 2 &>J 5or i . t t w : 2


tic litifu a* a e n o - i a a e i s r c e e s o p a d r a ; .

Fallas Mnor*s: 2S9S F i'.iJ 2>2 srtiT cicres C sagina:

, <

ji v i

' .f

> '3/^

T ai como lo d eia a z claro la alid a de *ca corr-da de m uestra. la inform acin p . s q u e g e n e ra g e t r u s a g g .. gg orecacom oila ; p r m r e r . ATcambio. can~3 s t r u 5a g e s g j;b 3 c j;s a ife a g p ,m u y jja r a -d o -la u tiliza ci n o c m em o ria p o r p a rto d e u n proceso. De aecho. el n m ero de ra lla s Im p o rta n te s re v elad a s por la c o rrid a de prueba confirma as a p re c ia d o '

76

Programacin en Linux

nes anteriores acerca de !a can tid a d de E/S de disco que requiere el p rogra ma. El proceso ley desde el disco 21.412 veces porque los datos requeridos no se encontraban en mem oria. No ocurrieron perm utaciones de pginas, sin embargo.
S e s io n e s y g ru p o s d e p r o c e s o s

E xisten situaciones on las cuales.elsencillo modelo padxe/3ii;o.no-describe lo suScienta Ja s reTacionesjentre procesos. Consideremos, por ejemplo, una v en tan a x t s m abierta. Supongam os tam bin que se ejecutan en la x ts r.n tro s comandos de UNTX/Linux de m an era individual: l s sim ilar a d i r de DOS), c a t (sim ilar a ty p e de DOS), y v i (un editor de texto). C ul es el proceso padre; la x te rm o la in terfa z que corro en la x ts rm ? O bviam ente, los tres comandos estn relacionados e n tre s, pero no como pad re e hijo. En cambio, son todos p arte de la m ism a sesin. Otro ejemplo es el conjunto de comandos ejecutados en una pipeline, tal como por ejemplo l s -1 s o r t more. De nuevo. esto3 comandos estn relacionados entre 5 no como padre e hyo sino como miembros del mismo grupo de proceso La figura 4-1 ilustra las relaciones entre procesos, sesiones y grupos de procesos.

F ig u r a 4 .1. Procesos, sesiones y grupos de procesos.


G rupos oe procesos

U.n grupo de procesos ls un.conjunto de procesos relarionndos, generalm ente u n a ccuencia de comandos en u n a pipeline. Todos los procesos incluidos en un grupo de procesos tienen el mismo ID de grupo de proceso, o sea el PGTD E propsito d un grupo de p r ice . , f.u- as. Supongamos, por ejemplo, que el lector c m e s e la pipeline (secuencia"de pipes) de co mandos l s -1 / u s r / i n c l u d e S O rt | W C 1. Si, m ientras esa pipeline est an en ejecucin, uno la aborta (utilizando Ctrl+C), la interfaz debe poder term in ar todos los procesos. Esa accin la lleva a cobo abortando directam ente el grupo de procesos en lugar de hacerlo con cada proceso individual S esio n e s LT na sesin consiste de uno o m s grupos de proces<a,.U n lder de sesin es - .. ....... juc croa la sesin sta tiene un tnico idcntificadotT, a S S S S n D de sesiiL.el cual es m eram en te el PID del ld er da sesin L as sesiones cum plen el mismo propsito p a ra los grupos de procesos'uue estos ltim os p ara los procesos individuales.

/ / . /

j 77

.i

Captulo 4: Procesos

Digamos que si lector ejecutase el m ism o comando de pipeline mencionado re cin os decir, i s - i / u s r / i n c l u d e s o r t ; wc - I & 'j en segundo plano y ejecutara otros comandos en prim er plano. Ahora, si estos comandos se estuv i e n corriendo en u n a term inal X Window y se cerrase la v e n tan a del term i nal m ientras las mismas estuviesen an corriendo, el k e rre l le en viara una seal al proceso que tiene a su cargo el control (el lder de sesin), el cual a su 'ez m ata a cada grupo de proceso como se lo describi en el pargrafo anterior La m anipulacin ce grupos de procesos y de sesiones es un tem a a v a d a d o que ?e en cu en tra fuera del alcance d e este libro. R esulta im portante, sin em bargo. com prender los conceptos y La term inologa em pleados porque los mism os tien en im portantes repercusiones p ara las seales, que se cubren en el captulo 5. Seales."

Manipulacin de procesos
E ste punto an aliza la creacin de procesos nuevos, la eliminacin (k illin g ) de procesos ex isten tes y la espera y supervisin de procesos Las llam adas s y s te m , f o rk y e x e c crean nuevo*? procesos, p a ra liquidar otros procesos V puede em plear la tu n c i rfK llT 'm a ta r), y un proceso pueda ya een e x i t '*alir\ o a d o r : (aforta^T para proceder a liq u id arse a s mismo. Lhb p rcti cas recom endadas de d(lm in3tradn de recurso.1 requieren que lo procsoa padres aguarden h a sta que term in e n sus hijos E ate requerim iento es implem entado por las diversas funciones w a it.
C r e a c i n d e p ro c e s o s

Loe program adores necesitan a m enudo cre a r nuevos proceso desde den tro de mu* program as. Por ejemplo, aupongaraos que usted ere as o un program a que adm in istre u n a base de dato s d e ttulos de CD-ROMs. En lugar do ten er que cre ar su propia ru tin a de ordenam iento, proferirlu que ol trabajo lo re a lizara el program a s o r t . Linux ofrece tres m aneras de lograr eato. La lla m ada a s y s t e , provista por la biblioteca C estndar, os uno de los mtodos. Las llam adas a f o r k y e x e c , sin em bargo, constituyon el estilo Linux". Es ta seccin analiza las tres llam adas.
u t il iz a c i n d e

s y s te m

La funcin sy s te c i ejecuta un com ando de interfaz que se le tran sfiere. Su prototipo, declarado en < s t d i i o . h > , es ir iyiwico**: sn- Mtrtrtg); s y s t e s ejecuta el comando de in terfa z s t n n g transfirindoselo a / b i n / s f i y retornando despus de h ab er term in ad o de ejecutarse dicho comando. Ejemplos an terio res ya h an dem ostrado el uso de la mism a. Si, por alguna razn, s y s te m no lo ^ ara-in v o car / 5 i n / $ h , reto m a d eedig l2 7 . Si ocurrie ra a~egmbio a l g d ^ t r o dpo ~ ?e^ffor, system ~re to m a ra -1. E l valor orfil d re to r o ^ e s y s 1 5ir.esetcoargo'de sal'derco'indo"transferido en s t r i n g Si s t r i n g fuese NIJLL, s y s t e n re to m a ra 0 si / o i n / s h se encon trase disponible o u n valor distinto de cero en caso contrario.

Programacin en Linux

EMPLEO DE f O r k

La llam ad a a f o r k crea un proceso nuevo. E ste proceso nuevo, o proceso h i jo. ser u n a copia d e l proceso que efectu la llam ada, o proceso padre. La funcin f o r k est declarada en < u n i s t( J . h> y su sintaxis es
p ia _ t ro r* < v o ld );

Si la llam ada tiene xito, f or_k.retorna ol PID dol proceso hijo a l proceso padre. y reto rn a Q_ai proceso hijo. Esto significa que a n si uno llam a ra a f o r k una sola vez, la m ism a re to m a dos vece. El nuevo proceso que crea f o rx es una copia exacta del proceso p ad re, ;.-xcepto por su PID y su PPID, f o r k realiza u n a copia'complet.a del proceso p a dre, incluyendo los UIDs y GlDs reales y efectivos y los IDs de grupo de pro coso y de sesin, ol encorno, los lm ites de los recursos, archivos abiertos y segmentos do mem oria com partida, Lus diferencian e n tre lu.s prucusos padre o hijo son escasas. El proceso hijo no horeda la alarm an program adas en ol proceso padre (efectuados m edian te una llam ada u a la rm ), loa bloqueas do archivos creado por el proceso pa dre y la nertales pondiontos. El concepto clavo quo deb* sor comprendido e*. que f o r k croa un nuevo proceso que es un duplicado exacto del proceso p a dres, a excepcin de lo indicado.
E je m p lo

1 que sigue es un ejemplo sencillo dclom pjeo de fo rk ;


onora <Jel ororjriaa en In x trn tt: c tu id .c /
e it M i* v o

l i j o . c - Ejtplto s e n c illo tln ro rk tn cIu C e < unintd.h> tn c iu d e < s ia ia .h > n n c iu M < s td liD .n
i n t naia<voi<i)

<
p ie _ t c flii ; tf i;c i l< i = fo rk (> i ~ p e rra p ("fo rk j; } - i) (

a*itlXIT_?AlLLa6K else if ( c n iid { out3( 'En ei preses-: n ijo * );


p r iiit f C X w it = \d\n*. g etp id ()} p ru ic r(* \tp p io W in * , g tp p id ()i; oxi-{EXIT_SUCCS8);

h s is e i

Captulo

Procesos

79

Jts (' n i proceso M re * ); p r ir t ? ( * \ i d = srincf(*\tpott *


vj\s*.

g etsid.'H ; g e to c : O l;

wi*iix"_succss): } La salid a de este program a s e r l sim ilar a la siguiente

co:fl :I nijc 1 u g

Como se puede apreciar a p a rtir de la salid a, el PPID del proo ; ,10 hijo (el ID del proceso padre) es ol m am o quo el PID dol padre. 1149. La aalida tumbin ilustra una cuestin critica referente n la utilizacin de fo rk : no so puede prederir i i un proceso padre se ejecuta r a n te s o despus de u hijo. E sto puede inferirse a p a rtir de la ex tra a apariencia de la sulida. La prime ra linea de dicha alida proviene del proceso padre, laa lineas desde lu se gunda h a s ta la cu arta provienen del proceso hijo, y la q u in ta y sexta lneas provienen nuevam ente del proceso padre. E l program a ae h a ojecutado fuera de secuencia; es deo r, asincrnicamente. La n a tu raleza asincrona de la conducta de f o r k significa que no se debera e*ecutar cdigo perteneciente ol proceso hijo que dependa de la ejecucin de cdigo del proceso padre, n: viceversa. H acerlo as crea potencialm ento una condicin de com petencia (race condilion), que tiene lugar cuando varios procesos quieren u tilizar u n recurso com partido pero dicha accin dependa del orden en el cual se ejecutan los m ism os Las condiciones de competencia pueden ser difciles de localizar porque el cdigo que las crea funciona 'la m ayor p a rte del tiem po.' R esulta dic p red ecir los resultados que arrojar u n a condicin de competencia, pero sus sn to m as pueden incluir el compor tam iento im predecible del program a, u n a p a re n te congelamiento del siste m a. resp u esta len ta de- un sistem a por lo d em s poco cargado, o directamen te la cada del sistam a. LT n a llam ada 3 f o r k puede fra ca sa r porque h a y demasiados, procesos cnrrien d o en ese m cmsr.t en el siste m a o porque ei proceso que tr a ta de gene ra r procesos descendientes h a excedido e'. nm ero de procesos que est per mitido ejecutar. Si ia llam ad a fracasa, f o r k retorna -1 al proceso padre y no crea n ingn proceso hijo.

/ '
80

>

Programacin en Linux

N O TA
0 proceso de efectuar un f o r k involucra el copiado c e tc c a le imagen ce memoria del xo c eso p=-5 a proceso hijo. Este e s un proceso lento por n a t u r i o , de -vo t o . e e s dise adores de -NIX crearon la llam ada v f c r k . E sta a r r a ^ ta ~ E c*oa un a c c e s o nuevo. pero re efecta una copia dol proceso padre, en su :u g a\ h asta 3 u e s e i =~>= a e x e c o e x i t . c m ovo proceso corro c r e- e s p a c o c e a r e o o n e s cei y o c e s o pdre. s. accede a ig jn a po ro r c e la memoria ocupado oor e ste -ifcmo. tfeh a po-c-.Oc ce m em ora o s copiada ai proceso hijo. Esta c a r a c te r s r o s e denomina copiado durante escritura. La 'zxc'y fursamental de la existencia de v f o r k e s acelerar 13 c r t a c n, de p ro ce se s 'u e v e s . A dem s, v f o r k p o se e la caracterstica adicional de garantizar que el p roceso ^jo s o ciocute antes que el p roceso padre, por o tanto e m ra r& > 18 posibilidad de ana condicin d e com petencia. Bajo Linux, sin em bargo, v f o r k e s sim plem ente una envoltura en tom o d e f o r k , poroue lir.ux siem pre ha utilizado el rreca-.ism o do copia do durante escritura. La f o r k te Unux. por lo tonto, e s tsn repica com o la vfork de UNIX a. cero en cambio 'a v f o r k de Linux, com o e s sim plem ente un alias de f o r k . no puedo garant'zar c t e e l proceso hijo s e eiecutsrfl jn t e s c - e e- y o c t s o padre

UT1UZACIN

OE exec

I-i funcin e x e c e3 en realidad unu am ia-de seis funciones, en la que cada ua do las cuales exliibecbnvoncioneg de llam ada y emplco3 levem ente dife rentes. A p esar de la m ultiplicidad de funciones, las mi3tnas son conocidas convencionalm ente en bloque como "la fruicin e x e c . Lo misino qu f orK. e x e c est declarada en < u n i s t d . n > . Los prototipos son los siguientes:

m t e*ocl|cont cnar *path, conat char *arg, ;nt e*eclo<con3t char rile , const char *arg, . . . j

ln : o*od(coi8t char *pa:h, somt cnar *arg. criar constnvp|); tnt 4<cv(cor.s; char *path, char *cont argv[||; tnr *x*cv*(const cnt *iiacvplconsi char char satn, char cons: jr g v J ], char conitnvp||i; char 'const *rgv(}>;

e x e c reem plaza com pletam ente la im agen dol proceso que efectu la llam a da con la del program a iniciado por e x e c . En tan to que f o r k crea un procv so nuuvo. y por o tan to genra una nueva PID, e x e c inicia un nuevo pro gram a que reem plaza al proceso origina:. Por lo tanto, la PID de u n proceso iniciado m ediante e x e c no vara. ex ecv e acepta tres argumentos: p a th , a rg v y e n v p . p a tn es la ru ta completa de acceso al archivo binario ejecutable o al $cripc que se de.^ea ejecutar, a rg v e= la lista completa da argumentos que se lo desea transferir al programa, inclu yendo a rg v [0 ) . que ha sido cradicionalmente el nombre del program a 3 ser s e cutado. envp es un puntero a un entorno especializado, si lo hubiera, para el programa que debe iniciar ex ec (ue NUIL en el programa de muestra).

ix e c v * ..: [ l u s t r a e . sn p io de execve

Caoftulo 4: Procesos

81

#.TCluCt anista.fi linCigO# <sttflib.h>


m ciCf < stdio.n int *ain(<oi3]

{
a*ir 's r j s l ] * { Ibuillt* , VAL>;

f ( * * * C r e < * /6 U t/lS * , 4*3S, * J U )

-1J {

w rrari'tAcve*);

xlC(EKTFAIURS) t
> putlfDo e c ru u j q u t *);

*:(ct :t_ 5 > jccc$S);


U na corrida de prueba de este p rogram a (recordemos quo ae tra ta de un lis tado de dirvetonoj gener la sig u ien te salida dos nom bres do lo3 archivos co rresponden a los presentes en la p g in a de este libro en Intom et):

r
p

s /*Kt
M k if U tH * r > t g*tnM.C s r p r i d i .c r*su 0 2 .C

nilfl.c iK v t.e ils .c L' *

''tiv tti.C

Comoi*e p uede *preciar_de_ejta A j | d e n t c a c i a OUtS no se ejecut. Por qu ra t n ? Si e x e c tiene xit i .;i liimt y por lo u n to las Ttim.s dos Lno d eteste program a ju n n ae ejecutarn. Esto tiene cutido porque,com o aeco m cn t a n te riorm ente, e x e c reem plaza i p r i u>: !. llam ada .. * ! nuevo program a. :: :: 1 . . y u n proceso que h u biera efectuado la llam ada al cual reto m ar. i e x e c fracasa, aui em bargo, re to m a -1 e m ia a liz a la variable global e r r n o . El valor ingresado a e r r n a puede er convertido en un m ensaje de erro r inteligible utilizando s t r e r r o r , p a rte de la biblioteca e st n d a r de E S {ver man e r r n o p a ra obtener detalles sobre el empleo de e sta variable).

exec EN DETALLE
D ada la confusa sim ilitud e n tre las eis funciones de la fam ilia oxee, se ofre ce a continuacin un anlisis com pleto de s u sintaxis, com portam iento, sim i litudes y diferencias. C uatro de las funciones - e x e c i , e x e c v , e x e c l e , y e x e c v e - aceptan r a ta s de acceso como prim er argum ento, e x e c l p y e x e c v p aceptan nom bres de archivo y, si estas r.o condenen la b a rr a oblicua, im itarn la conducta de la interfaz y recu rrirn a SPATK p a ra localizar el archivo binario a ejecutar

Programacin en Linux

Las tres funciones que condenen u n a 1 esp eran an a lista de argum entos se parados por comas, term inada por un p u n tero NULL, que ser tran sferid a al program a que ejecutar e x e c . Las funciones que contienen una v en su nombre, sin embargo, adm iten un vector, o sea, un arreglo do punteros a ca denas term inadas en \0 (cero binario). 1 arreglo deba e sta r term inado con un puntero NULL Por ejemplo, supongam os que el lector de^ee exec el co mando / b i n / c a t /e t c / p a s s w d / e t c / g r o u p . U tilizando una de las fun ciones 1. sim plem ente deber tra n sfe rir cada uno de estos valores como un argum ento, term inando la lista con NULL, como se ilu stra a continuacin: d i'/O ln /s a t'. /etc/aasswo*, /eto/grottp*, MUl-j; Si profiero u tiliz a r una do laa funcione v, sin embargo, prim ero deber cons tru ir el arreglo a rg v array, y luego tra n sfe rir ese arreglo a la funcin exec. Su cdigo sera 3im :lar ai siguiente: cfiar *rgv[J /tc/paswo*, V c / 0 r o u p \ NUIL);
ifx(fcv|*/3in/caf, orgvi;

PinalmnnU, las do/? funcione! que term in an en e -e x e c v e y e x e c l o - le perm iten o uno crear un entorno especializado p ara el program a u se r ejecu tado por cxec. La ubicacin de ese enlom o se alm acena en e n v p , que ta m bin un puntero a un arreglo term inado en \0 de cadenas term inadas en \0 C ada cadena tiene la forma de pnr nom bre-valor, donde nombre ob el numbr* do una variable de entorno y oalor os su respectivo valor. Por ejemplo, enar *nvp(] PATM-/0ln:/ysri,i>in\ USUAAKKJIMfl P # rn f, VULL); En este ojemplo. PATH y USUARIO son los nom bres y / b : n : / u s r / b i n y J u a n P e r e z son los valores. Las otras cuatro funciones reciben sus entornos de m anera im plcita a tr a vs de u n a variable global denom inada e n v ir o n que contiene la direccin de un arreglo de eadon aa quo contienen el entorno del proceso que efectu la Uamada. P a ra m anipular el entorno que heredan estas funciones, utilice las funciones o u te n v y g e te n v , declaradas en < s t d l i b . r y prototipadas asi:
iftt OuteiMcons: char Strifig) cfcar 'getanvfcanst char *05119 );

g e te n v busca u n a variable de entorno denom inada ame y retorna u n p u n tero a su valor, o retorna NULL si no existe correspondencia, p u te n v a ad e o modifica ol p ar nombre=valor especificado en S t r i n g . Si tiene xito, retorna cero. Si fracaso, reto m a -1. El cdigo que u tiliza g e te n v y p u te n v se m ues tr a en el siguiente program a.

Captulo i : Procesos

83

T 'v w

E je m p lo

l'J 1 [ i /

1 sig u ie n te p ro g ra m a i lu s tr a e l com sortaip iH ta de g e t e n v :

E------lEMPwO , .

* kzecr* ;c ' orog-';n= Sn

testeffv.c /

V
'

zonon9b3joxomo.z - C aw rvtoa corno ssrg y nj v a ria b le ae er itomo

*inclu* <wW.'*
inclufi* t i i i a . n jncluo* <sW .o.f>

m t M ir iw id l

<
/ u*va r i o/ i 4 1/ *lg vs i_J a c c ion / j ct, t j D 11}; if!eu:nv(v*r:a6I*_3_*nwma)>
e u u {* 0u tM fallo* c lu put>(*pat#nv tuvo u t a * ); cnr v ir u D l* - 5.*-tarr.oi| * { tlIJWTA

i'.'5ete^vCtf!_WTA*)) prlfltf( 'MI_WTA\s vn*. jeter.v {U IJV T K ' ) | 1


$vt*('u:_fiUTA iLn a j l j n i r J;

lftSetW^SU.flUTA'JI

print*: *Su_afTA=*rt \ n \ jscer.v{SUJUT**)); H it


PVC3( SU_SUTA lifi 2 J i g . W ) ;

e x i t ( x :T _ a x C c S S :;

>

La ejecucin dei programa produce la siguiente salida:


s ./corcnoi_5'uom c

eo:e-'.v ru-.c i*:o HIJW7A tis srio /ic l ilou-^ipU M C lon, sjacu tab l
salid *

Sj_ U^ -.^ signa*

Programacin en Linux

E s p e ra s e n p ro c e s o s

Luego que uno g en era {m ediante ^ o rk ) o ejecuta (utilizando e x e c ) u n proce* so nuevo. eTprces'n'dre debe a g u a rd a r pa ra que ste finalice a fin de reco ger su conHTaon deT alid a y e v ita r la creacin de zorabie?. Igual que con e x e c , uno dispone de una v a ried ad de funciones p ara poder utilizar. P a ra ev itar g en erar u n a total confusin, sin embargo, esta seccin se concentra slo en la s funciones w a i t y w a i t p i d . Qu es u n zombie? n p ro c e s o z or.& .ea..un proceso-huio- s u o - ^ n a m a sin que su proceso pa^rg_ispqngajecoger. Ja-CGndin.de-saida_del m ismo con wa t t o w i i t p i d . Un proceso p ad re recoge la condicin de salid a de un proceso hijo utilizando una de la s funciones w a it a fin do rec u p erar la con dicin de salid a desde la ta b la de procesos del kem el. Este tipo de proceso se denom ina zornbio porque o st efectivam ente m uerto pero sigue todava p re sen te on la cabla de procesos. El proceso hijo h a term inado, han sido libera dos la m em oria y dem s r e c u lo s asignados al mismo, pero aun ocupa u n lu gar en la tab la de procesos del kern el. El kem el alm acena la condicin de salida del proceso hijo h a sta que el proceso padre la retire de all Tener uno o dos zombics no re p re se n ta un problema, pero si un program a eje cuta constan tm ente comandos f o r k y e x ec no recoge sus condicione* de sa lida. la tab la do procesos ovontualm ento se llena, lo que deteriora el desem peo y obliga a volver a a rra n c a r ol sistem a, lo que obviam ente no ea una situacin desoablo en un entorno do produccin con requerim ientos cntico3. U n proceso hurfano, por o ira Ja d o . ea. u n proceso hiio.cuyo padre larm inu a n te s (te 1 1 ' > : * o w a i t o l d E n e ste caso el proceso i n i t asu m ejsl papol del p ad re Bel proceso hijo y recoge su cftdCln do salida, evitando cr eo na ecueciu Tu aparicin do omblos P ara recoger la condicin de sa lid a de un proceso hyo se deber efectuar una llam ada a w a it o a w a i t p i d . P a ra ellos se debe incluir los archivos de e n cabezado < s y s / t y p e s . h> y < s y s / w a i t . h>. Los prototipos do os ta s funcio nes son los siguientes: pid_ waittlnt status); p:c_t pid, lit ita tu s, Lnt optiona). El p a r m e tra s t a t u s alm acena la condicin de salida del proceso hijo, p id es la PID del proceso pos el cual se q u iere aguardar. La mism a puede adop ta r uno de cuatro valores, listados en la tab la 4.3. Tabla 4.3. Valores posibles d e od
Valor < -1 -1 0 > 0 Descripcin Aguardar por cualquier proceso nljocuya PG0 sea igual al va-or 30soiu;o de PIO Aguardar por cualquier proceso Aguardar por cualquier proceso cuya PGID sea iguat a a del proceso que efectu ia Mamada Aguardar por e procesa ruja cuya PIO sea <gj.il a 2 1 2

>

// 85

Cap-.ulo 4: Procesos

o p tjjsa^ esp ecifica cmo se deber com portar la llam ada a w a i . Puede ser iWCHA'Q . que hace que waitpid retorne inm ediatam ente si ningn proceso hio'ES^rrninado. MJNTRACED, qu* significa que deber reto rn ar la condicin de ios procescs hijos cuyo estatus no h a sido informado, o se puede efectuar con ambos parm etros un 0 lgico p a ra obtener ambas conducas al mismo tiempo es decir, poner iVSOHANG ; ! MJNTRACEO como argum ento de o p tio n s ) .
E je m p lo

El program a a g u a rd a re ilu stra $1 u so de A T tip ic .


/ dI yrcsn m er, Irrtern^: r t l t e r . c / y

CJCMPUO

* JOwnwr.c - twiso 3 9 rctiio ce w lt


/ 3yi-'ty5s.h> *mciuo ircivrt* <*tCia.n>
t-'C lS* S tc its .f

lBt ciin(voiC )

( o is .t m : o;
in t cocdicioc;
fsricO ) I) (

p r ro r(, o r(, >;

*it|x:T_fAIUB6); > tii* i#(nijo ) (

puM( n KOCtM rujo:*);


r n r f ; ' \ t p K J a* e ro c * o m j e s c \ r t \ g * tp i O ( U ; s r i - i r f : * t e o u t . M :p p tp ! p r o c e s o r u j o * \ d \ n * , g e t p p i u n i ;

tiL:(Ei:T_9XCSSi;

X *coiv3lci6rt, 0JT
"& jts [* E r proceso pCre:*);

lA

J.

y-tx'

C~

. r r-c

p r if l t ( * \ :p je procoso oapra = Sd\n\ g e tp d (H ; a 'i - t f i * :ppic -3 proceso pacre * h c . v , se:ppn JO ); p r ir t f ' \t l c*oceao rujo r*torno Vnrt*. condicion);

>
jo

*.:0CT_SUCCSS);

Programacin en Unux

U na corrida de prueba de este program a produjo la siguiente salida:


5 ./aguardar
n proceso H ijo : 3id ce 3roceso h ijo * <502 BOid Se arocQso h ijo * 505 En oracoao jadrn:

0;0 < J 0 jfOCOSO paflr.> * *50*


031d He orocaao padre - <U29 1 p re ciso h ijo rutorno 0

Esto program a os am ular al an terior h i j o . C, oxcopto que aado una se n te n cia w a lp i d Especficamente ag u ard a poro! proceso h i j o especificado por hijo p ara re to m a r y tam bin exhibo la condicin do solida del mismo. O bsr veso que las salidas do los procesos pudre hijo no estn entrem ezcladas co mo suceda en h i j o . c . La ejecucin del pnn.'i'W> Padre w detiene bas to que finalice al proceso hijo w a l t p i d y w a it) rotorna la PID del proceso hijo que nHtlMrO i se eapocHc WNOHANG e n o p t l o n s , o - l mi o cum un error
E lim in a c i n ( k l l l l n g ) d e p ro c e s o s

Un proceso puede term in ar por una do cinco razones Su fu u a n m am llam a a r e t u r n Llam a a ex t v/ Llam a a _ e x it Llam a a a b o r t Ea finalizado por u n a seal. Las prim eras tres razones constituyen term inaciones norm ales, y las doa l tim as term inaciones anorm ales. Independientem ente de por qu r 2 n fina liza un proceso, sin embargo, se ejecuta finalm ente el miamo cdigo de kernel, que cierra archivos abiertos, libera recursos de mem oria y lleva a cabo cualquier o tra ta rea de lim pieza que sea requerida. Como este libro supone que sus lectores poseen conocimientos de C, consideramos que la funcin r e r u r n no necesita de m ayores explicaciones.
LAS FUNCIONES 6 X t

Ya se ha \n 3 t 0 u tilizar la funcin e x i t (salida), que es p arte de la biblioteca e stn d a r de C, en diversos program as a lo largo de este capitulo. E n lu g ar de su m in istrar otro ejemplo, listarem os su prototipo, ta l como est declarado en < s t d l i b . h > :
Lnt e x it{in t statu s);

s x i t da lugar a la term inacin norm al de un program a y re to m a S ta ~ j s al prc-ceso padre. Se ejecutan en esa ocasin todas la s funciones que se h allan registrad as con a t e x i t (a la salida).

Capitule

Procesos

87

La funcin _ 9 X lt, que e s t declarada en < u n i s t d . h > . term ina in m ed iata m ente el proceso que ia '.ama. En este caso d o se ejecutar. las Sanciones que se en cu en tran reg istrad as con a t e x i t .
utiuzacin de

a b o rt

U tilice la funcin a b o r t si se ve en la necesidad de te rm in a r un program a anorm alm ente. Bajo Linux. a D o rt tiene el efecto adicional de hacer que un program a vuelque la mem oria, que la m ayora de los depuradores u tilizan pora an alizar el estado de un program a cuando 4te so bloque. Aunque pro cede a c e rra r todos lo archivos abiertos, a b o r t es u n a llam ada d u ra" y d e bera :-er em pleada silo como ltim o recurso, ta l como por ejemplo, cuando el program a encuentra que no eat en condiciones de adm inistrar, como u n a aguda falta de memoria, a b o r t es tam bin u n a funcin incluida en la biblio teca e st n d a r declarada en < s td ll b .h > ) . S u prototipo os: voia iscrtvoKJ};
E je m p lo

D
CiCMfLO

El siguiente program a m uestra el com portam iento de la funcin a b o r t * Hctizn l jr jjfiM o in t^ K f abort.c ^
f
iw t ir .c > a -,s :fa l i t t M i i u i : o a iSort

1
i-oclud# <*t<Ji0 .n>

nt ati-nhoiSl < itxjrto;


El 3r 5.*ia2 na c s M 'ia c4r ti:tE*:'_5JjCCcSS>; /

> p i t K r ' ' ^ sabida La salid a de eyte program a se n a como sigue: 3 ./aso.': Observe que su sistem a tal vez no genere o n vuelco de memoria (core dum p). Si no lo hiciera, utilice el comando de interfaz u l i r a i t cal como se m uestra en ia nueva c o m d a siguiente. E l archivo donde se vuelca la memo ria re sa lta til cuando se depura un program a.
S '. li a i t -c u r.llairr:

S ./Sort
^CPtSlj (CSM C 'JC rC)

/
8S

j.

.1

,/

Programacin en Linux

Para mayor informacin sobro epuracin con un archivo ce vofcaco i* -gmorta. ve' Ini cio 3 gdb.* pfitfna 123.

EMPLEO DE LA FUNCIN k l l
Los dos pargrafos anteriores se concentraron en la m anera en que u n pro ceso puede elim inarse a si m3mo. Cmo, entonces, puede un proceso d ar trmino a otro? U tilizando la funcin k i l l , cuyo prototipo es el que sigue p.t k iiiltc _ : pie, in: slgj; Para utilizarla, ei lector deber incluir en el cdigo fuente de su program a ta n to < s y s /ty p e s .h > como < s ig n a l.h > . El parm etro pidespecifica el proceso que *e desea elim inar y sig es la seal que se desea enviar para ello. Como es ta parte cubro la eliminacin de un proceso, y no tra ta sobre seales, la nica seal que consideraremos por el momento es SIGKILL Ei capitulo 5 am pla el tratam iento de las seales. Por ahora, slo d lo siguiente por cierto.
E je m p lo

Este programa m uestra cmo elim inar un proceso ' so o a r* a e l prograna n [n t * r n o t : k ille-.c t
* iK tx rjrjjrc c e s o .c eum nucion ao otros proeeBos

t
Mnciud* <*yj/:yp.i*>

includ*
includ# <:gna.n>

ilnclud* itdlib.ti>
in c tu c # l i d i o .

Wt am lvcld)

<
Bid_: h ijo;

Wt sondician, valarrarornaao;
tfU M JO - *or(>| < ) ( o e r.-o rlTo rx i;

*xit|Xir_FAllUAE);
if in ijo = C < / Sajarlo inactivo lo suricienw cano para pa-aer ei-uunario * 3iee3< a<l0}; S*IX{EXIT_SUCCSS|;

> *Ui r U t i U n r ftNOHANG w a nacer retornar a wait nrediatajrsnta /

Caoituio 4: Procesos

89

i - ( i a i t p i ( n i j o . iCOrtCiCion, WOHAWQ)) S) {

alo '.-c '-'a jc = ^iU.;r.:io, SiOCiLl); l* {v*l5r_r :**) { // i puts(*iull fracasc\n*]; p rro r|* iir); aitpid^ijo, toxxcaon, a); ) fli ^
5 " i n t f | 'V i l i a i r a d o V r * , h l J o |

~ ~ ~~ 1

* M i l f r s c a s o , :a =odc ;u e sp er-jr qu < p roceso r u f i n a l i c e

&

> \ **tt(Exir_SCCtssj: > La salida de este program a d eb era ser sim ilar a la siguiente:
S . / lia in a r_ ? c > OCMO

*5T1 liR ln rto

Luego de verificar que la funcin fo rK baya cumplido con su cometido, el pro ceso hijo 'dorm ir* d u ran te 1.000 segundos y luego saldr. El proceso padro, entretanto, llam a a w a it p l d p ara que acto^obre! proceso hijo pero utiliza
AY ; !.- ir:i i .i::::: >j*.u.v*.l-.xil!.' l.uo;o e liim -

a el proces'Ijo. s i k H I Trcsa. :iu funcin reto m ar -L. en caso contraro retornara 0. Si K i l i fracasa, o proceso padre llam a a w a tp d una segundu vez, asegurndose que la ejecucin se d etenga h asta que el proceso hijo finali ce. En caso contrario, el proceso p ad re exhibe un mensaje de xito y finaliza, c i l l se utiliza habituaim ente pura term in ar un proceso o grupo de procesos, pero puede se r em pleada tam bin p u ra enviar cualquier seal a un proceso o grupo de procesos. El capitulo 5 cubn* lo referente a seales en detalle.

Cundo manipular procesos


cQu situaciones requieren el em pleo de las m anipulaciones de procesos vis tas en este capitulo ) U na de ellas ya h a sido mencionada: cuando uno q u ie re o necesita u tilizar las prestaciones de un program a externo en su propio cdigo. Supongam os que el lector e st creando un (otro ms) ad m in istrad o r de archivos. A unque seria ideal re d a c ta r au propia im plem entacin del pro gram a l s , sera mucho m s rpido en trm inos de tiem po de desarrollo u ti lizar ei comando l s existente y co n cen trar su s esfuerzos de program acin en utilizar la salida de i s en su program a. Si uno eres nuevos procesos utilizando f e r k o e x e c . resu lta vital aprove char sus cdigos de salida utilizando u n a de las funciones w a i t p ara m an te n e r u n sistem a que funcione sin fisu ras. De modo similar, el lector debera siem pre asegu rarse que su s program as llam en a r e t u r r o a e x i t a n te s de salir de modo que los dem s pro g ram as puedan recoger los correspondientes

Programacin on Linux

cdigos de salida. La cuestin es que u n a adm inistracin responsable de pro cesos necesita u tilizar algunas de las tcnicas com entadas on este captulo. Finalm ente, a m edida que el lector vaya desarrollando program as, y a sea pura su empleo personal o p ara terceros, inevitablem ente enco n trar proble m as. U na de las mejores herram ien tas p a ra resolver problemas de cdigo es el archivo de volcado de mem oria, la im agen de u n program a en ejecucin que se escribe a disco. Por lo tanto, 3 uno puede circunscribir un problema a una seccin especfica de su program a, el empico juicioso de a b o r t gene rar un archivo do volcado de m em oria que puede ser empleado p ara la de puracin del mismo (la depuracin se cubro en ol captulo *20, U n toolkit de depuracin'). Sin duda alguna, cuando ol lector se convierta en un progra mador experim entado de Linux, en co n trar m uchos situaciones en las cu a les la adm inistracin de procesos em pleando las tcnicas com entadas on este captulo le re su lta r esencial.

Lo que viene
Eate captulo hu echado una prolongada m irada sobre los procesos do Linux El prximo capitulo cubre un tem a com plem entario, ia3 seales, y profundi za su comprensin de los procesos y do la proram acin en Linux on general

Seales
L as seales constituyen la form a m s sim ple de comunicacin e n tre proce sos de que se dispone en Linux. Los procesos I3 3 u tilizan p ara com unicarse e n tre si. y el kernel las em pica a su vez p ara com unicarse con cada uno de loo procesos. La* seales son tam bin el mecanism o clave p ara el control de las tareas, que es la capacidad de co rrer aplicaciones en 3egundo plano o d e ten erlas provisoriam ente. Si uno tuviese que escribir u n program a do aplica cin de cierta envergadura, n ecesitara em plear aenaies. Esto captulo cubre l< siguiente* temos; Qu m u n a seal? Terminologa de las seales Las prim eras API de seales y san problem as Las API de seales POSD y Linux Envo y recepcin de seales A dm inistracin de conjuntos de seales Tbdos les program as de este captulo pueden se r encontrados en ol sitio Wob n t t p : / / www.m c p .c o m /i n o bajo e l nm ero de ISBN 0789722151.

94

Programacin en Linux

Conceptos sobre seales


Cuando se h ab la de seales, surgen continuam ente trm inos y conceptos di versos- E sta porte del libro define dichos trm inos y explica tales conceptos A e sta a ltu ra del an lisis nos b a sta r con u n a comprensin bsica de la te r minologa y de loa conceptos empleados, el resto del captulo I03 explicar en m ayor detalle.
Q u e s u n a s e a l?

U na se a le s u n a pieza de softw are anloga a una interrupcin do h ard w a re, un suceso que tiene lugar en caa cualquier momento duran to la ejecu cin de un proceso. Eata im previsibilidud significa quti las seales son asmcrnicas. No solam ente puede ten e r lu g ar u n a wjal oa cualquier momento, sino que adem s el proceso que recibe la seal no tiene ningn control sobro el momento on que la m ism a es en riad a. Cada seal tiene un nombre, que comienza con SIC . como por ejemplo SIGTERM o SIGHUP Esos nom bres co rresponden a constantes en teras positiva, donominud'ui nm ero de seul, definidas en ol encabezado del archivo de sistem a < s ig n a l.h > . L oa seales aparecen on muchas situaciones. U na excepcin de hardw are, tal como una referencia ilegal a la m em oria, genera una seal. Tambin ge ora una seal (SIGPIPE) u n a excepcin de software; por ejemplo, tr a ta r de escribir a un pipe cuando el mismo no dispone de lectores (procesos que se encuentren presentes del otro lado del conducto). La funcin kiU (m atar) que e com enta en el captulo 4. Procesos", enva una seal al proceso a ser m a tado (finalizado), lo mismo que lo hace el comando kill. Finalm ente, las ac ciones generadas desde una term inal, como por ejemplo tip ear C trl+Z en el teclado p ara suspender ol proceso q u e se est ejecutando en prim er plano, tam bin generan seales.
Para --r.a exposicin comoleta scfcre cmo escribir a ooes. ver "Pipes oe lectura y escritu ra*. pagina 325.

Cuan d o un proceso recibe una seal, puede hacer con olla u n a de tres cosas: Puede ignorar (p asar por alto) la seal. Puede perm itir que ocurra la accin predeterm inada asociada a la seal Puede_ccipturar o intercep ta r la seal, lo que hace que se ejecute una seccin especial e codig. denom inada handier (m anipulador) de se al. E sto se denom ina precisam ente m an ip u lar !a seal E ste captulo exam ina cada u n a de e sta s opciones en detalle.
T e rm in o lo g a d e las s e a le s

Se genera una seal determ inada para un proceso cada vez que ocurre algn suceso que d lugar a esa seal, como por ejemplo una excepcin de hardw are. A ia inversa, =e dice que una seal es entregada cuando el proceso al cual sta h a sido enviada toma accin sobre la misma. D urante el intervalo que transcu rre entre -a generacin de u n a seal y su posterior entrega, se la considera pen diente. La entrega de una seal se puede bloquear, o sea demorar. La seal es ta r demorada hasta que sea desbloqueada o hasta que el proceso receptor

C aptulo 5: S e a le s

95

decida ignorarla. La m anera en que ur. proces responde a una seal se deno m ina disposicin de la seai. Un proceso puede altcrnacr-.-arr.ente p asar por al to una seal, perm itir que tenga lugar su accin predeterm inada, o m anipular la, donde esto ltimo significa ejecutar, en resp u esta a la misma, un trozo de cdigo personalizado. U na seal bloqueada tam bin es considerada pendiente. Un conjunto de seales os un tipo de datos de C. s i g s e t _ t , definido en < s i g n a i .n > . que es capaz de re p resen tar m ltiples seales. Finalm ente, la mscara de teles de u n proceso es el con;unto de seales cuya en treg a al mismo tiene bloqueado en un momento dado. Una y otra vez zo IccrA on este libro que Linux, aunque haya sido diseado siguien do los especificaciones POSLX. ha incorporado liberal mente caractersticas de las <J r a c principales de su antecesora, los LTNDC de AT&T y BSD. Esta herencia se hace evidente en las seales Lo que ocurro es que tanto en el UNIX do AT&T coa en el de BSD m ha adobado tambin u n a API de a l compatible con POSCC de medo que las dienencas entre ambas A PI no resultan demasiado significa tiva i siempre y cuando todo el mundo esenba su cdigo para la API compatible a POSIX. por supuesto). A continuacin mostramos, luego de un rpido repodo del desarrollo de la API do seal, como enviar, interceptar y mompulur sealas.
H is to r ia d o la s s e a le s

Las seales h an sido parte de UNIX casi dsde el principio, pero a los creadores del UNIX les requiri no obstante un p ar de intentos lograr hacerlas funcionar correctamente. Sin en trar a considerar de lleno todos los detalles intrincados de su desarrollo, con la apancuin de las prim eras iraplcmentaciones de seales surgieron tros problema. pr.ncipales. El prim er problema fue que los m anipula dores de seal tenan que volver a ser instalados cada ve., que su los utilizaba, lo que daba lugar a una posible (o probable^ condicin de competencia. Si se en tregaba una segunda seal m ientras la p rim era estaba siendo manipulada, y ante? de que se pudiese volver a instalar el m anipulador de seales, o bien esta egunda seal se perd-.a u, oltraativamunUr. ei proceso perm ita que tuviera lu gar la accin original de la seal, sin ningn procesamiento. El segundo problema ocurrido con las im piem entaciones iniciales de las' se a les re que stas no provean una m anera sencilla de suspender tem poraria m ente un proceso h a sta que arribase una SaL Como resultado, poda darse e! caso de que se entregase una sea: a un proceso y ste no cayese en cuenta de su arribo. Finalm ente, las llamadas ai sistem a no se remiciaban au to m ti cam ente cuando eran interrum pidas por u n a seal. En consecuencia, se im pona u n a enorme carga sobre los program adores Despus de cada llam ada al sistem a, stos ten an que verificar la variable errno y reem itir dicha llam ada si el valor obtenido p a ra e r r n o m era EINTR. Las implementaciones de se a les que adolecen de estos defectos se denom inan seales no confiables. La API de sea es POSIX que cubre este captulo es considerada confiable perqu h a subsanado e stas limitaciones. Bajo POSIX, los m anipuladores de seal perm anecen instalados, evitndose a s la condicin de com petencia y sus consecuencias posteriores. C iertas llam ad as a', sistem a se reinician a u to m ticam ente, aliviando asi la tarea del program ador, y POSDC tam bin pro-

/ 96

>

'

>

'

'

Programacin en Unux

vee u n a m a n e ra confiable de d eten er un proceso h a s ta que se le en tregue u n a sea:, elim inando as el problem a de las seales perdidas.
S e a le s d is p o n ib le s

La tabia 5. i enum era todas las seales que adm ite Linn* Tabla 5.1. Seaies de Linux Seal Descripcin
S IG ABR T SIGALRM Generada por la runcn a b o r t de sistema (POSlX) Una seal ce 3portad ara {ttmr signad gororada por la funcin a ia rm del sistema (POSlX) E' proceso trat de utilizar memoria mal alineada o sin alinear (4.2 BSC) Un proceso hijo se ha detenido El orocoso debe continuar 5l est detenido (POSIX) Error to bus

Accin predeterminada
Proceso termina y graba una imagen de a memor-a (core dump) ^rocoso termina

SIG8US

Proceso termina y graba una imagon de la memona (core domp) Ignorara 0 terminado (POSlX) Continuar (ignorar si el proceso no est detenido! Proceso termina y graoa una Imagflrt de la memono (coro dumpi Procoso termina y graba una imagen de i mamona (core dump) Proceso tormma

SIGCHLO SIGC0N7 SIGEMT SIG FPE SIGHUP

{HafdVraro)

Excepcin de punto flotante (POSlX) Proceso recibid un corto de linea on su terminal de control o su procoso de control mu Comnndo nogal (POSlX) _o mismo que SIGPWR 3uario gonor una ntorrupcr. de teclado (POSIXJ Se recibi E/S asincrnica (4.2 BSD) Error de E/S. Igufll aue SIGABRT (4.2 BSD} Terminar procaso (POSlXl Proceso perdi la eraos de un arch/va Procoso trat do escribir a un conducto sfn lectores (POSIXJ Ocurri suceso encuestaole (Sistema VI

S IQ t L L S IG IN F O S IG IN T S IG IG

Procoso termina y vuelca (graba) una imogen ce lo memoria (cona aumo: Ignorara Proceso termino Ignorarla Proceso termina y groba imagen do la memoria (core

siGior
S I G K IL l SIG LOST S IG P IP E SIGPOLL SIGPROF

(Junio)

Proceso termina, no se puede inter ceptar o Ignorar Procoso termina Proceso termina Procoso termina

Alarma ae contorno asignada sobre Proceso termina un Segmento de cdigo expir (4.2 3SO)

contina

i 97

C aptulo 5: S e 3 le s

Tabla 5.1. Se-'ses de - p j j lcortJ.-iuacir..' Seal -D e sc rip c i n


SI& W R S istem a detect un p rc^ e o -a de suministro elctrico ( S is te m a '/)

Accin predeterminada
Ignorarla Proceso termina y graba una imagen de a memoria (cora dume) Proceso termina y graba ura msgen de 13 memora (core ump) msccesi&ie (POSIX)

SIX U17
SI&S5GV

Usuario ge-em ung sai^a


ceses e tsd a d o ;P03IX)
Proceso trat e reereroar memona Proceso una falla n 13 p-'a e r n jr r la piia*) S e t o 00 ceteoon !.POS? Argumento incorrecto pasado a njtina Proceso recibi una P'ocesc 'leg a jn ponto Ce detencin generalmente Curarte una depuracin de cd'goj (POSJX) Usuano gener una detencin desde ei teclado tPOSiX) Proceso trat d*'eer desde s t d i n mientras corra en seguido >4no (POS>X) Proceso intent eseno^r a S td O u t mientra corra en segundo piano (POSIX) Sertai no utJtiaca Conoon de urgencia en un s ocK e t (4 2 asoi Se*a< I definida por ei -suano (P O S ; SV-aJ 2 dtftnla por el osuaro (POSIX) Alarma de ntarvaios expiro (4.2 3S0) 3 tamao de una ventana tem mal cambi (4.3 3S0, Sun) Proceso excec. a cancdad re ampo ce CPU Que COtfa utilizar (4.2 5S0)

S IG S T K -L T S IG S TC P S IG S YS S IO TEB U SIGTP.AP

Proceso termina
Detencin, ignorar

ro se puede nterceotar o

Proceso termina y graba una imagen de ia memona (core 'Jamo) Proceso fermma sertai de terminacin POSiX) Proceso termina y graba una imagen de ia memona [cora /htnio)

S IG TS TP S IG T T IN

Detencin Detencin

S IG TTG U

Detencin

SIGUNUSED SIGUfiG SIGtiSfiT SIGUSA2 SIGVTALM S I Srt I NCM SIGXCPU

roceso termma lgporrla Proceso termino Proceso termina Proceso termina Ignorara Proceso termina y graba una magen de :a memona fcore dump)

contina

98

Programacin en Linux

Tabla 5.1. Seales ce Unux (continuacin)


S e al_______ D escrip ci n A ccin p re d e te rm in a da

SI3XFS2

Proceso trat ce acceder o


m a n ic u ia r u n a rch iv o m a y o r q u e ei lm ite c e ta m a o de arch iv o del s is te m a ( 4 .2 BSO)

Proceso cernina y grab3 una imagen de !a memoria (core dump)

Corao se puedo ver a p a rtir de la tabla 5.1. las seales que Linux reconoce son una mezcolanza de seales dorivadas do BSD, do Sistem a V o de AT&T y. por supuesto, de POSIX. Varias de los seales listadas, sin embargo, incluyundo SIGEMT. SIGCLD. SIGINFO y SIGLOST. no e st n im plem entadas (por lo que ol hecho de que no obBtanto so en cuentren docum entadas on la pgina 7 (seales) dol m anual constituyo un misterio!). Los siguientes pArrafbs tra ta n la m ayora de oatas seales m s dctxdlurinmonto. SGABRT es generada por la funcin abort que se comento en ol captulo 4. SIGALRM y SIGVTALRM se generan cuando los tem porizadoros firocrs) confi gurados utilizando loa Uamadun a la rm y s e t i t i m o r . respectivam ente, las disparan. Lu llam ada alarm se comenta m s ad ela n te en esto mismo c ap itu lo en !a part "Establecim iento de una a larm a. SIGBUS do hecho no tiene lu g sr en los sistema.-* Linux; cuando un proceso tra tu de utilizar una memo ria desalineada. el kem el, en lugar do g en erar SIGBUS, repara l mismo el problem a de iineacin y luego contina. SIGCHLD se envo a un procoso pa dre cuando uno de sus procosos hijos term in a o se detiene, lo que perm ite al padre llam ar a una de laa funciones w oit p a ra obtener el estado de salida.
v' u funciones w s it so qjolican rtotaltaamento on Esperas on procesos*, pagina 84.

SIGMUP tiene lugar cuando termina un lder de sesin o cuando se cierra una ter minal de control. SIGFPE se enva cuando ocurre cualquier excepcin aritmtica, tal como o<.*-r?!ows (desbordes), un/lcrflows (desbordes por la derecha) o divisiones por cero. SIGILL es generada por otra oxcepcin de hardware, la ejecucin de un comando ilegal. SIGINT hace quo todos los procesos presentes en el grupo de pro cesos que est ejecutndose en primer plano terminen porque el usuario gener una interrupcin desde el teclado, generalmente ripeando Ctrl+C. SIGGUIT. de m anera aimiiar. se genera cuando se ti pea desde el teclado el ca rcter de salida, generalm ente C trl+ \. O tra seal generada desde el teclado. C tri-Z , genera SIGTS7P. Las funciones SIGKILL y SIGTERM son generadas por !a funcin k i l l . Obsrvese que SIGKILL no puede ser interceptada ni ig norada; esta configuracin perm ite disponer al superusuario de un mtodo no ambiguo para m a tar un proceso que no se est comportando adecuadam ente. SIGSTOP detiene cualquier proceso y. lo mismo que SIGKILL, no puede ser interceptada ni ignorada. Sin embargo, a diferencia de SIGKILL, SIGSTOP m eram ente detiene un proceso que se est ejecutando. La ejecucin del m is mo puede continuarse envindole SIGCONT. Lam entablem ente, no existe a l go as como SIGRESURRGCT p a ra los procesos eliminados. SIGTTIN y SIGT TOU tienen lugar cuando un proceso que se e sta ejecutando en segundo piano in te n ta obtener en tra d a desde su tennina' de control o escribir a la m ism a. C uando u n a v en tan a de term inal cam bia de tam ao, todos ios proce

Capitulo 5: Seales

99

sos que se e st n ejecutando on prim er plano reciben la seal 3IGWINCH. Las seales SIGUSfi 1 y SIGUSR2 estn reservadaa p ara uso particular de cada proceso SIGXCPU y SIGXFS, finalm ente, se gen eran cuando un proceso se excede de su tiem po asignado de CPU o de su mximo tam ao permitido de orciuvos. respectivam ente.

Envo de seales
Deaie_un program a, existen dos m anaras de e n v ia r u n a aeal a un proceso en ejecucin utilizando el comando k i l l ( k i l l ( l ) j o emplgar.30 la funcin El comando k i l l es er. realidad una interfaz de usuario hacia la funcin k i l l .
P a ra s * r o r w ra G n c r v c n - i l i a c a <S 'a uncttfn H i , v*r *lm ir.aon do

sxoc*4Gt\ OM- 86
E m p le o d e l c o m a n d o k i l l

P ara poder u tiliz ar ol comando k i l l e n un program a, so debe llam ar a un.i de estas tres funciones: syste.-n. f o r k o ex ec Como se ha visto en ol cap tu lo anterior, las llam adas a s y s t e n o a fo r k g en eran un nuevo proceso que tend r a su cargo la ejecucin de K i l l . m ien tras que xcc reemplaza al pro ceso que efectu la llam ada antes de ejecutar k i l i . El resultado, su i em bar go. es el mismo: el proceso correspondiente q u ed a terminado.
E je m p lo

E ste ejemplo prim ero g en era un nuevo proceso que no hace otra cosa que perm anecer inactivo Luego una llam ada a exec elim ina el proceso hijo antes de que el program a finalice
/ v n r * s e l {r c $ rir.a sn [->:rr.et: o f c l l i.c V

--------------

I ia ir a .- _ e r o 4 C .c - i t u l i r # i r c i a i < s y s / t y p e j.n >

s e r a e c io da j- l lll )

delude iir . c i. o e <unisra.n>


*nclufl K t Jio .n * t i a z l M < s : 2 l;s .rv >

inr asm<voi5) { ois_t U]o; tsnurasion */


r'-a* : K r a 5 ; C irc o to s <M un a ID n j jr. d ifllc o para s i ca ro 2a

? U M je - fc rx (J ) < t) l
O r r o r t f o r * . ') : e x '.z : = X lt jA X lF \ ;

; i l * f*.:;o = =3
sI= 5 B (S * } ;

i : srogniea ccaentra er s i oroetse " i j c

} sis* {

100

Programacin en Linux

! ' l p rc g ra 3 s e en cuen tra en e l p ro ce sa p a d re , l ! ae r3<30 5ue a ta r a a l p rc c e s o HL]o / s s r m tf|S 3 d e ia . * W , h ijo ) ; p r i n t | SLijalngnlo H Vrt", c a d e n a };

if( ( fM c l( * / o D / U U * , V C in / k i l l* , cadena, V -iL J) < Ci {


/ 1 ex e c - a c a s o , de nodo su e e s p e r a r / r y c S t e r e r l a c o M ic o n s a l i d a /

oerror{, >X9Cl|
a ito id (h ijo , NUIL, 0 ); e*ltlSXiT_?*iL'jftEl;

l )
t x t { 6 X i r _ f A : u E ) ; / E l orograr.a no c r t e r i a l l e g a r n a sta aqu /

) D espus do vorificar que e f o r k tuvo efectivam ente lugar, ei proceso hijo queda inacttvo (duerm e") d u ran to 30 segundos, tiem po m s que suficiente p ara que ul padre lo elim ine. Si, por a lg u n a razn, ia llam ad a a o x e e fr a casara. re su lta im portante a g u a rd a r h a sta que el proceso hijo finalice, de modo de poder o btener su condicin de -jalida, Recurdese del capitulo a n terior que las funcionc de e x e c n u n ca reg resan un edigo de salid a al pro gram a que las llam, a monos que tenga lu g ar u n error. El program a ta m bin utiliza ia funcin 3 p n n t f p a ra convertir ol PID num rico del hijo en una cadena alfan u m n ca term in a d a con un coro que pueda se r p a sa d a sin problem as a la funcin e x e c l . C uando se corre ei program a, la salid a implm ente indica quo ol padre e s t elim inando a au hijo:
S J I i m i 'a r j jr o c a a o E liH inando 759

S A II0 4

Por supuesto, el PID indicado sea probablem ente distin to p ara el sistem a con que cuente el lector,
E m p le o de la fu n c i n k l l

El empleo de la funcin k i l l es m s sencillo que la ejecucin del comando k i l l , porque no se deben realizar los pasos adicionales p ara p re p a ra r una cadena p ara ex ec. Tbdo lo que se requiere es el PID y la seal que se desea utilizar. La razn p a ra u tilizar a x e c l en el ejemplo an terio r fue sim plem en te poder ilu stra r el uso de / b i n / k i l l en un program u en ejecucin. Se hab r notado que ninguna seal ciee el valor 3 La nica que tiene este valor es lev serlahtua, que tiene un propsito especial. Si uno le tran sfiere a k i l l la seal nula, k i l l no enva ninguna seal, sino que se rem ite a reali zar su verificacin ru tin a ria de errores. E sto ltim o puede ser til si se de sea comprobar si un proceso d eterm inado se encuentra todava ejecutndo se, empleando su PID p ara buscarlo. Tngase en cuenta, sin embargo, que los PIDs se routilizan peridicam ente, de modo que, en u n a m quina a ta re a da. ste no constituye u n mtodo confiable de comprobar la existencia de un determ inado proceso.

Captulo 5: Seales

101

E je m p lo

Ei siguiente ejemplo utiliza a funcin k i l l p ara enviar dos 3ecdes a un proceso hija inactivo, u n a de la s oxaies ser, ignorada y la otra elim in ar di cho proceso. *3tcrt s l progrvu / 4tnja.C - =nv-.4r a- 5 itfttl ir IMIO C klU2) */ irclvU <syi typ..'. locIikm <i:.f> >
L'Klut* <!ni5*2.!*>

nciufi* <s:gnai.ft>
*UKluC < Jtaio.h>

irclyCe <swi:0.h>
in t *3 ln(voi 4 )

( pifl.t nijc:
i-*t CSC15 c_ 0_rttorno ;

l u m i o fq rk ()J < 4) ( c * r r c r ( , ? c n t, ) t

*itix:r_fA:Lvaci;
) ilh ijo ( / SL proqran 1 w c u * rtra en 1 prcc*jo n ijo '/

tlM srW j;
} #1 ( 1 flrog.-afli a* #ncuentrj n 1 procoio

maro"/

/ E nvU r ufta

iail cu ia iSrvjrad* /
m jo j:

p rln rf '& w a f to a SICCHLD * W f t ', tf(codo__rtorflo < *) p*rro r{cilliSIG O tU )'j;

cdio_5*_r*:crnc k iin m jc , ^TOOaj);~~

'

i
p r m t r f 'E l prccssa w todava sx isw sn * , n ijo ;
/ w s r-acar 'ra te a r a l >roesic n ijo V

____

sar-orcyiU-.SlGT&M');
; ri& e rir para :c t e r r : j cor-aicior a iip id (h * ]o , JJU, < J J;

ae salida 'I

102

Programacin en Umix

y
9xit!tX rr_3X Cc33);

) E st es la salida que se obtiene de un p a r de ejecuciones de este programa: i Joatitiij


.ivianco S:>0<'.0 a a n
1 proceso 071 toavia x s h

M I____
ja u o a

E lin ir jn d o 871 ,/oatafii.)o Enviado SIGCW.0 a 979 El {irocuso V9 todavt* <ixt E lin iPU n lO 879

L a prim era cosa que se debe advertir os quo. aunque parezca u x tra n , k i l l (en ingls, m atar) puede sor utilizada p ara onviar sdalo difere n te s a las ue son nocesariS p ara tHgTSr u procosoJSlGKILL, SIG7ERM. SGQUIT). Segund, o proceso lujo ignor, i > hecho, a SIGOHl.D, Finalm ente, dado que mi sistem a se encontraba relativam ente inactivo, pude u tiliz a rla nenl nula para confirm ar que el proceso ni quu ai* li* unvi la nerta! todava exista, Ve rificado esto ltimo, SIGTERM term in esto proceso hijo La llam ada a w a itp id . insisto, conutiluye uxm medida de segundad para el caso de que la funcin k i l l no tenga xito. Como se observ en el capitulo a n terior. no existe m anera de sab er por anticipado .ii > l proceso hijo term inara antes o donpus del proceso padre. Si el que term inase primero fuera el proce so padre, ul proceso hijo se convertira en un hurfano adoptado por i n i t , e i n i t obtendra la condicin de salida del mismo. Si fuera el proceso hijo el que tonm nase primero, sin embargo, debe se r el proceso padre quien obtenga su condicin de salida para evitar qun aquel se convierta en u n proceso zombic que ocupe innecesariam ente un lugar en la tabla de procesos del kem el.

Intercepcin de seales
SI aspecto engorroso del envo de seales lo constituye la intercepcin y la m anipulacin de las mism as. C ada proceso puede decidir cmo responder a todas las seales excepto SIGSTOP y SIGKILw. las cu.iL-s. tahia -> r.o pueden ser ni in te rc e p ta o s ni'ignom d a s. La m anera m S s siroplT de intercep tar seales no consiste de hecho en in terceptarlas sino en sim plem ente esp erar a que sear. enviadas. La funcin a la r m pone en funcio nam iento u n tem porizador (tim er) que enva la seal SIGALRM cuando el in tervalo de tiem po a que fue ajustado este ltim o expira. La funcin p a u s e se comporta de m anera similar, excepto porque lo que hace es suspender lu eje cucin de ur. proceso h a sta que el mismo reciba alguna seal.
P ro g r a m a c i n d e u n a a la rm a

La funcin alarm a, cuyo prototipo se en cu en tra en <unistd.h>, activa un :erapcrizadcr en el proceso que efecta la llam ada. Cuando el tiem po asig nado al temporizado? expira, se enva SIGALRM al proceso que efectu la lla m ada y, a menos que este ltim o in tercepte la seal, -a accin pred eterm in a d a p a ra SIGALRM consiste en d a r fin a dicho proceso.

Cao:tui0 5: Soaies

103

El prototipo p a ra a l a r a es.
a n jlg n et in * a i s r a i a n j i j f l ^ f l i r t sa c o n tsj;

s e c c r.o s es el nm ero de segundos se reloj desp u s do los cuales el temporita d c r expira. El vaior que recom a e sta funcin es 0 r,\ no so ha program adu i i.i'ii.2 . o - " .2 : r-rX-Ki-r*...- ,t. mn aUinna program ada previam ente . si laT^ubisra. Un proceso pueda coner slo una aTnrmu. E stab ie c ec d o el nm ero de segundos en 0 se cancela cualquier alarm a previam ente program ada
E je m p lo s

itllf
n rM H

1. E ste program a establece una alarm a de cinco segundos, despus de lo cual term ina.
/ s o rz'* * i progriaa en J n t* m tV .o y ii 6 . ' /

.0

/
* l a r w . c - : s p l * m a c i f l o sa n c -.lla il p | )

/
in c lu d * < u n i tc .n >

*\r<lw4* MtCiO.f*
I f K lu it < Jt3iia.fi>
: <u;n(voxa

C
/ * ju tar la a l a r o ,
l ? ( ( a l a r s { S l ) > 0) p y tlV * y a r L ir tu flr c - jfiiu - ia * ) ;

0* ja r rscziic t i procasc al : i w ! toao par* la alarva i p i r * /


fli P (3 9 );
/ 1 p rc^ am O u zH 'C c e a r a

s u fic ie n te /

no a 5 * r ia Ufrga'- a c u l / a i s f s g r u u l .s g o q u 1 7 >;

umjUT.paiu**); > La salida de e ste program a es la siguiente:


./ a ia m

A la ra clack

^ SAU^

' 1' l " j,T l -= !


ejemplo

E ste program a establece una alarm a de cinco segundos, observa si ya su haoa establecido alguna otra alarm a, y luego queda inactivo d u ra n te 30 se gundes p ara proveer a la alarm a de una razonable canr.dud de tiem po p ara expirar. E n sistem as atareados puede tra n sc u rrir un tiempo adicional e n tre la generacin de 3IGALRU y s u llegada au n q u e no 25 segundos, por supues:o). Cuando a rrib a La seal SIGALRM, a la r m a term in a. E l.ruensajfiJA larm c l c ck* (.reloj despertador/ lo gener el k e m e l. no el program a a la r is a . Por a razn el mismo aparees en ingls. 2. Este ejemplo establece dos alarm as, llam ando a a la r m una tercera vez p a ra cancelar la segunda alarm a.

104

Programacin en Linux

---------- -v
r NO-i&rg d e l j.-o gran a en lr.x9 rr\9 ^2a lzrr..c

r
c i_ 3 la rt3 5 .c - Cancelacin do alsrn3s

*/
inclua sys.'tyoes.n induce <jnijtd.tv vineiud* <3tdia.h> Jfinclude <stOliti.h

:n t Mtn<voidl

lcng u n cocigo_de_retorno;

/* a ta O le ce r l a la m a *.' t f <( a la r n c 1 S ) | > 0}

autsi'Ya so *ncuntra estaolecida un* a l a r m '); /* Estaolacar una n<jva alarma / Jl04p(3); ccdlgo_d_rwrna a la r(5 ) if(codiQ oj:aj*torno 0 | a rln tf ('R u ta n M d legundoa on la aminora alanu\n*. codjgo_dj- eiorno>; / Cancalnr lu MQWIda alama / ll*tp<2) g r in t f l- aitan Ha laounda* n U 3egunoa aUmaHn*, alar*(0>i:

mt(6Xir_FAII.UW); > La salida de este program a es la siguiente $ ./2alaro


12 Jg u n c c s n la p rtn e ru alar.na Sesear 3 aagundoa n la sogunea 3 lartia

Como el program a cancel la segunda alarm a a n te s de que sta tu v iera la oportunidad de expirar, ol tran sferirle 0 como argum ento correspondiente a segundas, el program a no exhibi el m ensaje 4A la rn c l o c k " R eitero, en un sistem a muy cargado, las a larm as pueden a rrib a r m s tard e de lo previs to Una razn pur la cual uno podra llegar a u tilizar alarm as e3 p a ra e sta blecer un lm ite de tiempo p a ra los program as potenciaim ente largos, tales como los que deben clasificar un archivo m uy largo o e sp erar que un usuario

>

J
105

Captulo 5: S eales

responda a ur. m ensaje. La m ay o ra do los program as que establecen a la r m as tam bin las interceptan, en lu g a r de p erm itirles te rm in a r el proceso.
U t iliz a c i n d e la fu n c i n p a u s e

La far.cin p a u s e suspende el proceso que la Uama h a sta que arrib e alguna s e a l E prcceso que efecta la lla m a d a debe de e sta r en condiciones de m a nip u lar '.a sedal que recibe, o e c caso contrario te n d r lugar la accin p red e term in a d a de la m ism a, p a u s e se e n c u e n tra prototipada en < u n is tti.h > :
ir.t pM se(void);

c a u s e reto rn a al proceso que la llam slo si el proceso intercepta una seal. St la seal que se recibe invoca u n h au d ler. 3te 3e ejecutar an tes de que pause retorne, p a u s e siem pre re to m a -1 y asigna a e r r n o el valor EINTR
E je m p lo

Este sencillo program a slo espera e l arribo de u n a seal y luego finaliza.


/ \o et- 3*1 pro ^riM r In w rri : pause.c V >* CJ t MPLO

/
0 M I .C - Efecta ana sauia y iu*$o terui*

/
KluO e <w>UM.h> m c lu it <1t0U0.N>

tflt M lflvoid)

(
9tvSt{)

#*lT{GCT_syCCSS);
> La salid a de este profnuna e* ta sig u ien te
S ./ N u

M ____
SALIDA

(1 |

tN 5

./p a u

./9*uSe
[C tfl-V |

(core
S ..' -j s *

Ji<- 4 in w

En la p n m era corrida, p a u s e slo produce u n a suspensin indefinida. P ri mero. Ctrl-^Z ingresada desde el teclado;, suspende el program a; el com an do f g lo vuelve a tra e r al prim er plano, p a ra que entonces C tr l - \ (SIGGUIT)

Programacin en Linux

lo elim ine y ocasione un vuelco de mem oria. Si no se lo hubiese eliminado, hubiera continuado en pausa h a sta que recibiera o tra seal o h a sta que ei sistem a se reiniciara. D urante la segunda corrida, el programa corri en una ventana. S u PID 3e ob tuvo en una segunda ventana por medio de p s , y luego se emiti k i l l -USR1 <PID> Como no se estableci un handler de seal para la seal SIGUSR1. sta '.lev a cabo su accin predeterm inada de terminacin
D e fin ic i n d e u n h a n d le r d e s e a le s

En alguno caso, el com portam iento deseado de la seal es ju sta m e n te su accin predeterm inada. En otras, probablem ente la mayora de las veces, se desea modificar ese com portam iento, o llevar a cabo tareas adicionales. En estos casos, se debe definir e in sta lar un h an d ler personalizado de seal que modifique ol com portam iento predeterm inad. ConaideromoH el caso de un procoso padre que engendra varios proceso? hyos. Cuando los proceso hijos term inan, ol proceso padre recibe ln seal SIGCHLD. P ara efectuar un aeguimiunto ndocundo do su s procesos hijos y supervisar su condicin de salida, el proceso pudre puede ya sea llam ar a w a i t , inm ediata m ente despus de engendrar cada proceso hijo o. do m anera ms eficiente, es tablecer un h andler de seal que llame a w ait (o n w a itp id ) cada vez que al mismo le llegue SIGCHLD. POSX detino un conjunto do Junciones p ara cre ar y m anipular seales. El procedim iento general consisto en crear un conjunto de seales, establecer las seales que se desea interceptar, re g istra r un h an d ler de seales on el kem el y ag u a rd a r a in terceptar la seal.
LA API OE ADMINISTRACION DE SEALES

P ara crear, establecer e interrogar a un conjunto do seales, utilice las cinco funciones siguientes, todas ellas definidas en < s i g n a l .h>
i n t aigem py36C<s. Q se c_ t * s e t j; in t s ig i'i.ll.$ < it($ io s e t_ t *s et ) ; i n t 3 ig a a d s e t s ig s a t _ t 's e t , i n t s ig n u n j; nt s ig a e la e t ia ig s e t ^ t 's e t , i n t s ig n u n ); i n t s iQ isn c n b < ir(c o n st $ ig s 8 t_ t * s e t, m t sig n a n );

s e t es un conjunto de seales de tipo s i g s e t _ t , como se explic al comienzo del capitulo, s ig e m p ty s e t inicializa el conjunto de seales s e t de modo que queden excluidas del mismo todas las seales, s i g f i l l s e t , a la inversa, inicializa s e t de m anera tal que estn incluidas en l todas las seales, s i g a c a s e t aade a s e t la seal signum. s i g d e l s e t elimina signum de s e t E stas cuatro fundones retornan 0 cuando tienen xito o -1 si ocurre un error. Finalm ente, s i g i s n e r b e r comprueba si signura se encuentra en s e t , retor nando 1 (verdadero) si ia mism a se encuentra presente o 0 ' falso) si no lo st.

Captulo 5: Seales

107

CREACSON DE UN CONJUNTO DE SEALES

P a ra crear u n conjunto de seales, pues, utilice s ig e m p t y s e t o S ig f i l l s e t para in id a liz a r u n conjunto de seales. Si c rea u n conjunto de seales vaco, necesitar em plear sigaddset p ara agregarle la s seales en las que se encuen tro interesado. Si por el contrario crea un conjunto que com prenda todas ias seales, utilico s i g d e l s e t p a ra elim inar del mismo las seales que no desee.
E je m p lo s

1 E ste program a a ad e u n a seal a un conjunto de seales vaco, y luetfo utiliza s ig is n - .e - P e r p ara confirm ar que tu se al se en cu entra p resente er. el conjunto.
!*ca t t 5 i ; r c $ T i s a tA I f t t t f t ! 8 < i t.e /

r
cr#a'_cc}i*.i:5_A:#.c 310QU8 un co n ju n to < 1 #

*/ irclvc# <sl9Ml.h>
# lrcl4* <0li .h>
i f e l u * <*t<lio.r> v c :a M i r _ i _ r r o r ( c r u r * j ;

in t u i/ l( v O * J

< ^aro_cc^!Jjnto;
C-**ar t i co n ju n to / ifl!s io e n p :> t { 4 r u v o _ c o n ] u n t c | | < 9)

5 * iir_ 5 i_ a rro r{ *t l g n c t y s a t ); / A A i ir S2GO*iP i l conjunta / l f | siea63t{JiH ivo_ccnjuflt3, SISCWJ5)) < #) s a lir _ a i_ r r o r ( * ii 5M 2sat* ;
- V e r i f i c a r 1 nuevo con ju n to a e sartales r e s u lt a n t e ' /

:* jigisa*cer(jPovo_con;r;tc. SIGCHIOI)
OuCJ S1 51 } i t i c re s A t ia e l con jrvto ae s e a le s * ) .

il
p j x s ( SIGChLD ro e t t a a r a s e n :* en e l co n ju n to c * s n a le s * ) ; SST Ea na c a c e r a e r p a rte 5a a i c r s co n ju n to / i ? f5 i3 iS 3 e T 0 4 * ,.lneYO _cor.;uittaI S1GTEP.Y;;

putsi 'SIGTsRM estJ ;'S :-'.t? er. conjunta de serta-es *i :


a is * ? - t s i S H r s S K -o e s t s 5 re se n t9 * e l co n ju n to e s e a l e s * ;;

i
108

Programacin en Linux

e*it(EXir_3UCCESS};

v o id 3 a I : r _ s i _ 4 r r o r ( c i i 3 r -o n o re _ se 3 it

0rror<nc*l>r9_s9ai|
*xt<EXIT_?AlLUfi>;

S .;c r 9 a r _ c Q f lju n :o _ i 'a l s SIGC-LO t a t a p r e s e n t e n o l c o n ju n to c e s e a l e s S IG T au na e s t a a r e i e n t e an e l c o n ju n to d e s e a l e s

salida

c f* e a r_ c o n ju n to _ s e a ie s primero eren un conjunto do seales vaco, transfi rindolo a s i g e n p t y s e t la direccin de una estructura s i g s e t _ t Luego a a d SIGCHLO dicho conjunto do seales. Finalmente utilizando s ig is m e n b e r, confirma que SIGCHLD es efectivamente parte del coryunto do seales y que SIGTEHM no m pari del mismo. 2. Este ejemplo ilu stra el proceso do remocin de una seal desde u n conjun to do tortnles.
I * s-Oftti.- d e l p ro g rn n a tn I n t e r n o t : r m v j t . c

C JC M P LO

a lm in a r u a l e v c

E l in in a s e a l a s o e un c o n ju n to O* s e a le

/
in c lu c e < s l(jn a l.n >

in d u c e <stdlib..n> m d u d e <s?dlo.n>

v o io s a i t r . s i _ e r r o r c n a r ) ;

t f l t n a w |v o i o |

<
s ig s e t_ x n u e v a _ c o n Ju n to ;

) C ra a r e l c o n ju n te */ n , ( ( s i g r i . i l m ( 4 n u e '/ a _ c c n j u n t o } | < 8} s a lir_ s i_ a rro r( 9 i g f l l i s e f ) ; / E l u u n a r SIGAiau d e l c o n ju n to /

. fK S iJ d o ls e tin je v o ^ o n J u n to , SGA;.aM:i < 0|


s a I i r _ 3 l_ e r r o r { * s lfla i3 c se t* ) ;

>
109

C aptulo 5: S e a le s

/* SISALA = u ri 3 Tacar s i c iin ira d a /


i* ( 5 j ;* 9 c q .-; 4"u?vc-_corjunto, SI3ALAW) pti$(*SG.Ul est3 oressnta e r <1 conjunto :s sartales*!; s ise 3ut3{*S:3AL=M -O sta presente jn S i conjunto O* sertalas'J; * SI6TE3M tfepsrta le g u ir estando presente /

*'

l'sifli*8**fcc!fcvjevo_co<ijunto, SIGTS?H)) p u:i(*SIGTO esta presente en a l ccnlunto de seales- );

cisc
W t i SiGtSM -c esta c o s e r t e en e l ceflj-jflto 59 ssf-aies*);

ttEXIT_SCCES$;

W Q C ('oeo'*_**rt*l j ;
t{E X P _ F A :u * S );

>
$ ./ * ll* tra r_ M rti:e

S<4.At --o tt s r e t a r t t n i ccfljunto * artali


3 IGTW t a e n t l f l t n ! conjunto i*rtal

s a lid a

e l i Q i n a r _ s e r t a l e s * com porta a la inversa dei program a del ejemplo an* tenor, creando un conjunto que incluye la totalid ad de laa wortuleu. Luego eli m ina SIGALRM. De nuevo, la llam ad a a S igism em D er confirm a que la seal elim inada ha s:do efectivam ente su p rim id a y que las dem s seales siguen estando presentes. REGISTRO DEL HANDLER El mero hecho de cre a r un conjunto de seales y luogo agrogar o elim in ar s e ales del mismo, sin embargo, r.o re p re se n ta crear un h an d ler de seales ni perm ite in tercep tar o bloquear se ales. Hay otros pasos adicionales que su deben ad o p tar Prim ero, se debe u tiliz a r s ig p ro c n ia s k p ara establecer o m odificar 'o am bas cosas a la vez) la respectiva m scara de seales corrien te; si no se hubiese an establecido u n a m ascara de seales, todas las s e a les a ra n lu g ar a u n a accin p red eterm in ad a. U na vez que se establezca una m scara de seal, se deber re g is tra r u n h an d ler p a ra la seal o seales que se desea interceptar, por medio de S i g a c t o n . Como seria de e sp erar a e sta a ltu ra del texto, s i g a c t i o n y sig p ro c m a s k 3e en cu en tran p rotohpadas en < s i g n a l . ft>. S us respectivos prototipos son los siguientes:
Et n s p r o w u i t -*, cor.it s ig s a r r set, 3ig5er_t 'O lO se t);

>

>

110

Programacin on Linux

sig p ro c m a sK establece o exam ina la m scara de seales en vigencia, y lo haco segn el valor de how, el cual puede ser uno de los tres siguientes: SIG_BL0CK - s e t contiene seales adicinalos a ser bloqueadas. SIG_UNBlOCK s e t contiene seales quo debern ser desbloqueadas. SIG^SETWASK-set contiene la nueva m scara de seal. Si how equivale a N U L L , se r ignurado. Si s e t vale N U L L , la m scara co m n te se alm acena en o l d s e t ; i oldsot equivale a N U L L . ser ignorada sig p ro c m a s k re to m a O 3 tiene xito y I si encuentra algn error, uu iQCttQ/i(tnt signuir, ccntt atruct tigacuon *act, struct ngocticn 'oiaoct); s i g a c t Lon activa ol haj&dler de w rtal p a ra la seal especificada en signum La estructura s t r u c t s ig a c tiO rt describe la m anera de diaponer de la .seal. Su definicin completa, prestente on (tal cunl) < s i g r a l . h > , ea*:ruc: ugacuon (
vo xa r n _ n r a t r ) ( t n t ) ;

ttQ M t.t so_ru4k; in t ii .f l ig i ;


v o io | * * a _ r s t o r o r ) ( v o id ) ;

t;
s a _ h a n d i e r ea un puntero a una ftincin que especifica el handler, u fun cin. a .sr invocados cuando sea generada la seal enpecificada en sig n u m La funcin dou do esta r definida con un valor de retorno de tipo v o id (es decir, no re to rn a r ningn valor) y debe de acep tar un argum ento de upo I n t . A lternativam ente, el argum ento de s a _ h a n d l e r puede se r tam bin SIG_OFL, lo que hace que tenga lugar la accin prodeterm inada de signuffl, o SIG_IGN, lo que ocasionar que e sta seal sea ignorada M ientras un h andler de seal se encuentra en ejecucin, ia seal que lo activ queda bloqueada, s a j r a s k define la m scara de un conjunto de seales adi cionales que deberan quedar bloqueadas d u ran te la ejecucin dei handler. s a _ f la g s es una m scara que modifica e! comportamiento de s a j i a n d i e r s. Puede ser una o ms de las siguientes alternativas: SA_NOCLDSTOP. El proceso ignorar cualquier seal SIGSTOP, SIGTSTP, SIGTTIN y SIGTTOU generada por el proceso hijo,
S A _ 0 N E S H 0 T o S A _ R E S E T H A N Q . El h andler de seales personal 2 ado se ejecutar 3lo una vez. Luego de que se ejecute, se re sta u ra r la accin p redeterm inada de la seal.

SA_RESTA.RT. H abilita Ja posibilidad de efectuar llam adas a sistem a reini d ables. SA_NOMASK o SA_NODEFSR. No se opone a que la seal se a recibida en el interior de su propio handler.
i

CapfvUio

Snates

111

. o e prest* atencin al elem ento s a _ r e s t c r e r ; eI ausao -yt obsoleto y no ^ eoe sor ep p iead o . Tenga en cuenta cambien que !a expresin s l g a c t i o r .orrsspocae ta n to al nom bre de una fundn como a! del patrn e una es tru c tu ra asociada a la m ism a
t n re su m en . 3 ig p r c c ~ ,a s * m anipula el conjunto de saies que se desea blo q u e a r 9 p ro rro g a a la m sca ra de sedales en vigencia. La (uncia S i g a c t i o n n e u t r a e n el k e m e l u n hancer d e una o m s seale? y configura el comportam iento exacto dei mismo.
E je m p lo s

1. El p n m e r ejemplo M n ollam eote bloquea SIOAU^ 7 SGTHflU sin proceer a in s ta la r un h an d ler que adopte alguna accin sspedal. >cs* Oel oroQrB4 n blocft.c. 1 .iitv x ti lortiicla *! \joor- m^r-ado : :rogrj.n u K f & i y ) 0* U tion V r Slcotir_i*Aai,,.c */ ircltffl# <S43rai,.t>
*lAc!utf <jMU6.n> ircluO* <ttOiO.fi>

8iocy* un coo'ufl se

voi ttl4r_si_*rror(cfur
in t Min(v 0i 0>

(
s i;i t_ r 'v.'rfO_caft]tfi*o;
' C r# a r 1 c o n ju g o m j n I r_ ji_ # rro r|

'* A$r*;ar s:GTE*v y sjoaum /


^ (($ ifito e u t(ix v o .co a ]u n to , srarisiu

<41

i : - s i - * r ' 0 < "C si;aoct:S G T c?Jtf* J; - ' * iQaiit i i.'oo_cortJ unto, < t) s a l i - _ j i _ j r r a r ( ' * i 9 a<35 t : S : 5 A U M ');

31oo--eir lis iK*ais sfl unicuU-iai / ^ ( I ii5 ;r * a 1!s:a_3?.00<1 tattovejaniWIW. *UU.U <11 M lir_si_*rror| Sigp-ocwj**;"
* A ju t- s a .- : a r r i s e ; * una 59* 3 ; /

oay;();
1 1 : = x r S2.CCSSS

' 112

)'

>

>

Programacin en Unux

f
void salL-_si_>rrorfcnar aensajs)

(
Dsr^orfcsnsaje); exlt(SXIT_FAILURE)J

> U na corrida de prueba de ente program a produjo la siguiente salida. El pro gram a se ejecut e n u n a v en tan a y se le enviaron 3eales por medio del co m ando k i 11 desde otra vencana (los comandos, enviados desde la secunda v en tan a so m uestran e n tre corchetes).
5 ./D lo q u s n r_ 5 * j a l9 s

: s H ii; fS K l U

rflw s ic t d o * J0 l0 q u e a r _ 3 e i\ a le s ) ] IRW $ ( 3 id o /b laq u ear_so A alfl# ) |

[S K l i l OUT S tp iflc r ./filo q u o 3 r_ 3 e A a le 3 )|

Oiiit (cor* ouiriod} Com o se puedo observar a p artir d e d ich a sa lid a , el en vi d e los procesos SIG TERM y SIGALRM no produjo ningtfn efecto, au n q ue b accin p red eterm inad a d e a m b as s o n d e s es term in ar ol proceso q u o la s recibe. El com an do p id o ? . / b l o q u e a r _ s e a l e s r o to m a e l PIO asociado con . / b l o q u e a r s e a l e s , m ien tra s q u e loa resu ltad os d e l com an do son su stitu id o s por la construccin 5 ( . . ) y transferido a l com ando k i l l q u e, por lo U n to , no produce efecto. En cam bio cu an d o el proceso recibe SIGGUIT term in a, com o lo m u e stra la s a li da. N mm q u e dado q u e ol program a bloquea a SIGTERM y SIGALRM. p a u s e n u n ca recom a jorque el proceso no recibo la sertal. 2. E sto programa- e s ta b le c e un h a n d le r p ara S IG U SR t. La accin p r e d e te r m in a d a d e SIGUSR1 e s te r m in a r ol procoso El h a n d le r p erso n a liza d o z - lo in d ica q u e h a sid o llam ado.
C IC M P IO

Honor* sol program on Internet: blkusr.c */

oloqu

lo c Ha;idLflf p e rso n a liz a d o para SIGUSfti

*/
m clu o <uni.std.r.> in cL w s sl<jnal.li> :nctud* <stdio.n>
tfirtelude < 3 to lit> .r

voxa ia iir _ s i_ a r r c r lc h a r ); / funcin de e r r a r ') void h a n d ie r _ u u ir ia !( in t) ; m t caln (v id ) / lanQ lu r de seales

<

>

>

C aptulo 5: S e a le s

113

s tr v c t sigaccicfl accin;

* C o n f ig u r a .- i i

'r t f l e '

a o c io n .ia jW C lV = r.3n<31er_u3uariot i siaeflOtyM1 : &acciao.*_M**);

jccior.3i_*H5S = SAJI0CU8T0P; ae-gist-ir anHr /


if({*SactooiS:GU$fi1, U c t io r , MJLLl < 9)

3a:r_j;_#rrof Csisactior. | ; P*ritir l 3*?icint titoco c o k oari enviar una sartal ) laeS 'M : .
iit(Ex:r_5jCCS5;

>
rt;a M l;r_;_irrar(cftar *s<r,wj#|

< prrori**)*); n itiG C T M iiu K ); i


oi3 funalr_ujw*riol(m t :rtu)

i
** SXQUSftt) SgtC lnw rcaptaoa U3ftt*J

isa
(*Inttrc*otaa Hc\n*, tignun);

)
n a n d i e r _ u s u a n o t e s u n s e n c illo h a n d le r d o s e a l, c u o no h a c e m s quu in form ar ei h ech o d e q u e in te rcep t a 3IG U S R 1. C om o ol m iem b ro s a _ m a s k d e a c c i n , la e str u c tu r a d e p atrn S i g a c t i o n . d eb era c o n ten er se a le s a d ic io n a le s a la s c u a le s o lo q u ea r m ie n tr a s s e e je c u ta el h a n d le r d e s e a l, u n o s im p le m e n te lo in ic ia liz a con u n co n ju n to vaco d e se a le s tr a n sfir i n d olo d ir e c ta m e n te a s i g f i T i p t y s e t . U n a v o 2 q u e e l h a n d le r s e en c u e n tr a co n figu rad o, s i g a c t i o n lo r e g is tr a p a r a SIG U SR 1. C om o e n e s te c a so no in te r e s a ia r e s p u e sta a n terior d e l h a n d le r , s e a sig n a N U L L com o v a lo r d e o s e t F in a lm e n te , e l p rogram a q u e d a in a c tiv o d u ra n te 6 0 se g u n d o s enm o p a ra d isp o n e r d e l su fic ie n te e m p o com o p a ra e n v ia r le u n a s e a l. C orra el p ro g ram a e n u n a v en ta n a , y e n v e le SIGUSR 1 d e sd e otra, com o s e ilu stra:

Programacin en Unux

i ./b la q u a a rjisu a rio [<111 -USB- S(pldo? $(pldo? [<111 tntercsotasa S10USS1
S A L ID A

.1 01c<j'jear_usuaro| |

La salida m uestra que el h an d ler fue registrado exitosam ente. Luego de eje cutarse el handler. el program a term ina.

CONSEJO
SIGUSR: / SI0US32 hoa sido especialmente 'eservadas como seales den- 33$ o< y ei yegramado' Se 183 debe emplear cuanto se desoa habitar algn Upo de comporta miento escecial. tal cono volver 3 ee? archivo do configuracin, en lugar de uti lra-* un hartlor o s^r.ai a fin de redofinir una las sortee* estndar. cuya semntca ya su incuont/0 bion definida

Deteccin de seales pendientes


s i g p e n d in g hace posible que un proceso dotocte seales pendientes (seale que fueron generadas m ientras la? mtamns se encontraban bloqueadas) y luego decidir si ignorarlas o p erm itir que lleven o cabo 8U accin. P ara que se dobe vorificar qu seales estn pendientes? Supongam os que el lector desea escn b ir :i un archivo, y dicha operacin no debe ser interrum pida a fin de preservar la integridad del archivo. D u ran te el proceso do e se n tu ra al disco, pues, uno deseara m an ten er bloqueadas SIGTERM y SIGOUIT, pero fuera de esta circunstancia las desea a d m in istra r o perm itirles que lleven a cabo su accin predeterm inada. De modo que, a n tes de d ar comienzo a la operacin de escritura, uno bloquear a SIGTERM y SIGQUIT. U na vez que !a escritura a archivo se haya completado satisfactoriam ente, se d eb e n a ve rificar la existencia de seales pendientes y, si SIGTERM o SIGQUIT se e n contrasen pendiente;), se necesitan.- desbloquearlas. O, sencillam ente se las podr desbloquear sin m olestarse en verificar si se encuentran pendientes o no. V enficar la presencia de seales pendientes o no os opcional. Si se desea ejecutar un bloque especial de cdigo si se en cu en tra presente cierta seal, verifiquis. En otro caso, sim plem ente desbloquelas. Igual que las dem s funciones de seales, sigpending se encuentra protonpada en < s lg n a l.h > . El prototipo de s i g p e n d in g s es: tn u-j8endi.ig(sigdt_t * m i; Ei conjunto de las seales pendientes se reto rn a en s e t . La Llamada en si reto m a 0 si result exitosa o - I si se registr algn error. Utilice sig ism e m o e r a fin de d eterm in ar si las seales en las que se encuentra interesado e s tn pendientes, es decir, si se encuentran presentes en s e t .
E je m p lo

P ara propsitos de demostracin, este program a bloquea a SIGTERM, luego determ ina si se encuentra pendiente y finalm ente la ienora y term ina nor m alm ente.
Noofcro dai srograna an Internet: aeraing.c '/

/
v e n fic a r js e n d le n t e j.c D lv e r t ir ^ n to con sigp en d in g

V
me la e <sys/typfts,h>

Caoi c 5: Seales

115

#L xIuo* < o cist 0 .li> #iflC3de < si 9 ftai.i> i3C30f <StClO-ft> # in cl 3 l < S tU D . m t su fl(v o t4 )

(
jiS 9 t_ t coniurto_sA alts, w r)un:o_M JH tte 5 ; a tru c t sta a c tio o aeclen;

ugtBptytat'.aconjuri^JtAilf*);
/ AA*tflr la ti*al a L itara* / tig ad o tt[* :cnjw i:o_ii*. 4 lB, SICTB3 I ) ; / S locuair la M al / :;procax;S;S_3L0CX, leor.Juflto.M rtalaa, V fl.li; / Enviar SZGrtflM naca 1 or&oio procaw V lU lflitp W O . SIOftM); Oo?inr tartalea c*v 3 u n te a V

aiap*ii{4eonjyf.to_pwaUfita>;
Si SI5TZM 54 ancirtAtra p u d e n t e , ig n o rarla ) i , ;jl5UB6C'-(lC3'*.Jt;rTc_p4 i 'i ; s s 1 SIG^EPa/J | { s i f a t a t y w ' t m ccic -i l a . u s k ) ;
accin.Si_ftaft9ler - S!G_IG; !gr*<yrar SISTEI /

s:gactiOfl{SraTai, laccion, mull;

D ew lw ear S!5TRU /
iigppocsit(SrG_lK8L0CX. 4ee.-ijunto_sirtal.as,
nll);

ixlTtciTJtCCESS}; > E n becef.do de ia brevedad se h a om itido ls verificacin <ie errores. El cdi go re su lta sencillo e interpretar. El m ism o crea u n a m scara que bloquea a SI3753U y luego u tiliza k i l l p a ra e n v ia r SIGTSM h a d a s mismo. Como es: bloqueada, ia seal no llega a destino. Se u tiliza s ig p e n d in g y s i g i s -

>

>

'I

)
u n u x

>

>

5)

rULv

r, ro & ra m * c i n e n

m e-iber p a ra d eterm in ar si SIGTERM se e n cu en tra pendiente y. si fuese asi. p a ra configurar su accin a SIG_IGN. C uando la s seales se desbloquean. SIGTERM se ignora y el program a term in a norm alm ente.

Lo que viene
H abiendo adquirido u n conocimiento bsico de la adm inistracin de procesos y el procesam iento de seales, el lector ae en cu en tra iisto p a ra desplazarse h ac ia tem as m s avanzados, tales como E/S sencilla de archivos y a ad m i nistraci n m as sofisticada de archivos, ta l como m ultiplexxng y bloqueo do archivos. E l m u itiplexing de E / S , que os el proceso de leer y escribir sim u l tn ea m en te desde y hacia m ltiples fuentes de en tra d a y 3alida. requiere te ner un buen conocimiento sobre seales. Los daem ons, procesos que corren on segundo plano sir. intervencin del usuario, dependen tan to de la capaci dad de realizar fo r k t (generar procesos descendientes) y de verificar m lti ples procesos de e n tra d a y salid a como de la intercepcin de seales que 3ean de in te r s y que provengan do los procesos hijos, y de a c tu a r en conse cuencia. Prim ero, sin embargo, el prximo captulo explica las llam adas a .UAtema. lu in terfa z program tica en tro los program as de aplicacin y los servicios provistos por el Iwrncl.

Llamadas a sistema
E n este capitulo al lector conocer las lla m a d a s a sistem a, la interfaz cnt.ro su program a y el kerr.ei. E ste capitulo cubre los siguientes teman: Qu es una llam ada a sistem a Por qu raxn y cundo u tilizar llam ad as a sistem a Llam ada* a sistem a habituales E rrare* que g eneran las llam adas a sistem a E rrores de adm inistracin de llam ad as a sistem a Todos Ion program as de este capitulo pueden se r encontrado un al sitio Web r t t t o : //*v**. c p . e o n / Lnfo bajo el n m ero de ISBN 0739722151.

'

'

'

'

120

Programacin en Unux

Generalidades sobre llamadas a sistema


En esta parte i lector aprender .o que son las llam adas a sistem a, p a ra qu son empleadas cul es la razn para emplearlas.
Q u es una amada a sistem a

l ... . . , 1. - ^

Obviamente, un sistema operativo Linux ost compuesto de m uchos cientos de porciones do cdigo, tales como utilidades y program as de aplicacin, bi bliotecas, controladores de dispositivos. Iiiesy3teras, compiladores, interfaces GUI 'grsphica user inizrfacs), administradores de ventanas y, por supuesto, el propio kernel. Sin embargo, codo esto cdigo se ejecuta en slo uno de dos modos posibles, modo usuario o modokernsl. A menos que el iectr se convierta en un hacker del kernel o escriba contro ladores de dispositivos, todo el cdigo qjueJlegue.a^cribir_cqm r e n modo usuario. Les probamos que corron en modo usuario sacan partido do ios ca ractersticas, tanto el software como el procesador p ara protegerse do otras aplicaciones que funcionen mal: generalmente, la memoria y los recursos asignados a la aplicacin A no pueden sorem edidos por la aplicacin 3 . Ai mismo tiempo, los programas que corren en modo usuario no tienen m anera de do llar aLsiatema en sT ^ r- -. El cdigo de moda kenwl aunque so encuentra protegido de los efectos pottmci al monto devastadores de loa programas de modo usuario mnl osen tos, tie nen total acceso a todo el linterna. Puede ut ilizar, o inutilizar, cualquier coso. EjomploH de cdigo en mudo leme! iucluyon loa conUoladom; d* disp o n tivos, lftsyatcmft y, natundmente, el propio kernel, Consideremos un controlador de dispcaltlvos, por ejemplo. A fin da funcionar adecuadamente, necesita contar con total acceso al dispositivo fsico que debe controlar, tal como una un-.dnd du di&co, lo mismo que ; 1 cdigo y datos asociados con ese dispositivo. AI mis mo tiempo, sin embargo, el dispositivo tsico debe ser protegido de programas deatructivoij que puedan potencialmente corromper el cdigo y los dato.- del controlador, o induaive llegar a daar de alguna m anera id dispositivo fsico. Por lo tanto, ios controladores de dispositivos deben correr en modo em e!. Expresado en nniaw simples, la funcin del kernel do Linux consiste en proveer na serie de servicios a los programas de aplicacin man teniendo al m3mo tiempo la integridad del sistema. Explicado do otra m acera, el cdigo para modo usuario (las aplicaciones) debe requerir diverana scr/icios-iclol digo que se jecuta en moflo kernel (admin istradores de memoria, controla dores delBspoaitivos y as siguiendo). LaslIam aSas a sistem a son el mtodo
. ;i o! dgO d< - ;U tr:0 t dol pmtifc.

gido que corre en modo kernel. Por a forma en que fueron disoadas, las llamadas a sistem a tienen el aspec to de fimcior.es ordinarias de C. Debido a la barrera erigida enere los modos kernel y de usuario, la interfaz que permite ai cdigo de usuario comunicarse con el cdigo do modo kernel es bastante rida. P ara m origerar este proble ma. dicho contacto es administrado por funciones presentes en la biblioteca C estndar. El cdigo de usuario llama a estas funciones presentes en la biblio teca, que funcionan como envolturas de la verdadera llam ada a sistem a.

Captulo 6: Llamadas a sistema

121

L im ita c io n e s d e la s lla m a d a s a s is te m a

Los llam adas a sistem a e a si m ism as se encu en tran optim izadas en cuanto 3 velocidad y. con el a de m a n te n e r la in teg rid ad del cdigo de modo kem el, tien en tres restricciones significativas: Cad3 argum ento transferido de modo usuario a modo k em el es de la m ism a longitud, g en eralm en te el tam ao norm al de p alab ra que co rresponde a la a rq u itec tu ra d e l procesador a cargo del sistem a. L as llam adas a sistem a siem p re re to rn an valorea enteros con signo. A fin de m inim izar ei tam a o del k em el y p ara lograr que el mismo se comporte de m anera velos, todos los datos transferidos al mudo kem el lo son por referencia, es decir, se tran sfiere su direccin en m em oria y no m eram ente su valor. E sto resu lta particu larm en te im portante cuan do se tr a ta de e stru c tu ra s de datos de tam ao potencialm ente grande. E n realidad, tas prim eras da? lim itaciones tienen poco efecto significativo en los program as que uno escribe. L a tercera restriccin significa sim plem ente que uno tiene que u tilizar p u n tero s a estru ctu ras, en lugar de laa propiaa es tru c tu ra s, cuando efecta llam ad as a sistem a.
Q u e m p le o t ie n e u n a lla m a d a a s is te m a

Como lo sugiri el pargrafo an terio r, la principal razn para u tilizar llam a das a sistem a os p ara requerir un servicio por part? del kem el al cual el c digo de usuario no puede acceder Qu tipo do net-vicioa de sistem a se e n cu en tran disponibles? A p a rtir del kem el verr-in 2.2.5. existen 190 llam ados a sistem a enum eradas on ol archivo / u s r / i n c l u d e / a s m / u n i s t d .h , quo contiene todas las Uamadaa a sistem a y define laa llam adas relevantes a fijr.CTones y a m acras p ara poder itilizarlos. La lista de servicios disponibles incluye ios siguientes: A dm inistracin de procesos, tales como f o r k , e x a c , 3 o g u id , g e t u i d y as siguiendo. La interfaz com pleta de adm inistracin de seales, como por ejemplo s i g 3 C t io n . s i g s u s p e n d . s ig p r o c r a a s k y s i g r e t u r n . Servicios de fileayatem. tales como m k d ir. c h d l r , f s t a t , r e a d . v /r ite .o p e n y c i s e A dm inistracin de m em ona ta l como mmap, raunmap, sD rk, m lock y a u n lo c k . Servicios de red, incluyendo s e th o s tn a m e y setd o ir.ain n am e. Program acin de procesos, que el comn de los program adores nunca ten d ria necesidad de llevar a cabo. U na razn por ia cual alguien necesitara utilizar llam adas a sistem a es para mplcmentar su propio mtodo de adm inistracin de m em ona p ara su aplicacin. Como sab r el lector, la biblioteca C estn d ar provee ra a llo c para reque rirle mem ona - sistem a operativo. De lo que no se debe haber dudo cuonta. rin embargo, es que uno puede cre ar su propia m al lo e a travs del empleo de las '.lamadas a sistem a or'< y s b r k b rx y s b r k m anipulan el espacio que ocu par. los datos de un programa.1 E sto podra tal vez rem ediar algunas de las ii-

Programacin en Linux

nutaciones de la m a lio c de la biblioteca estndar, tales como a fragmentacin de memoria o la carencia de liberacin autom tica de la memoria sin utilizar recoleccin de basura I. Tambin el lector utilizar llam adas a sistem a sin si quiera darse cuenta. Casi toda llam ada a sistem a cuenta con una funcin del mismo nombre en la biblioteca C estndar. Adems, muchas funciones do la bi blioteca estn d ar invocan llam adas do .sistema, p r m t f , por ejemplo, utiliza la llam ada a sistem a w r it a . Uno puede tam bin llam ar a v / r i t e directamente.
S i d e s e a h ailr una cobertura detallada de la llam ada a sistem a r i t e , v ea "'Lectura y escritura d e archivos", pAglna 1**2.

Utilizacin de llamadas a sistema


La utilizacin do llam adas a sistem a or ta n sencilla como llam&f i u n a funcin. Desde el punto de vista de los program adores de aplicacior.es, la d ife rencia entre llam adas a sistem a y funciones ordinarias do biblioteca en irrelevantc. La interfaz es la mi3>a P ara em plearlas, codo lo que se requiere lu c e r os incluir on itl cdigo fuente ol archivo de encabeaado < u r u s td . h> Por supuesto, se deber com prender qu es lo que hacen las llam adas a siste ma Su comportamiento, parm etros y valores retom ados se encuentran docu m entados en las pginas del m anual correspondientes a la seccin 2. Dado quu loa Humadas a sistem a tienen fundones de biblioteca de nombres sim ila r e s que estn docum entadas en las pginuH del m anual correspondientes a In seccin 3. resulta generalm ente aconsejable leer am bas secciones a fin de ob tener una comprensin global .iobre a m anera en que se comportan.
L la m a d a s a s is te m a c o m u n e s

C011 ms de 190 llam adas a sistem a, la discusin de cada una de ellas trascien do el alcance d este iibro. No obstante, aprender v arias de ellas en otros cap tulos. E sta seccin presenta las llamadas a sistem a ma comunes, refiriendo al lector a los captulos apropiados en los que se comenta cada grupo de llamadas.
ADMINISTRACIN OE PROCESOS

Lu adm inistracin de procesos se tra ta en el capitulo 4, "Procesos". Ese gru po do llam adas a sistem a se encarga de la creacin y m anipulacin de pro gram as. Las llam adas f o r k , v fo ^ k y e x e c v e crean nuevos procesos De m anera similar, k i l l y e x i t term inan procesos. Los procesos tienen un nico PID, propietario, creador y dem s idencificadores que pueden 3er obte nidos m ediante las llam adas a sistem a que se listan aqu: g e t p i d Recom a el ID del proceso que efectu la llam ada g e t u i d Recoma el ID de usuario del creador del proceso g e t g i c Recoma el ID de grupo del usuario que creo el proceso g e t p p i d R etom a el ED del proceso padre del proceso que efectu la lla m ada g e t e u i d Recoma ei ID efectivo del proceso que efectu la Humada g e t e g i d R etom a el ID efectivo de grupo del proceso que efectu la lla m ada

Captulo 5 ; am adas a sistema

123

L as Cam adas a r.steiafi w a it y w a itp i d perm iten que el proceso padre aguarde h a s ta que siis procesos hijos term in en y recoja su condicin de sali da. Por medio de las llam adas a sistem a u l i m i t y g e r r l i m i t un proceso puede av erig u ar cuntos recursos del e s te rn a puede consumir, lo mismo que otros lm ites a ios cuales se encuentra sujeto.
E /'S OE ARCHIVOS

Muchas de los llam adas a sistem a de Linux involucran entrada y calida de a r chivos. El captulo 7. Administracin bsica de archivos en Linux", y ei captu lo 3. 'Adm inistracin avanzada de archivos en Linux, cubren muchas de estas ru tin as en detalle Las llam adas a st3tema utilizadas p ara crear, abrir y cerrar archivos, por ejemplo, son respectivam ente c r e a t , open y c i s e . De modo .si milar, p ara leer y escribir archivos se utilizarn las ravrionea re a d y w r it e . La llam ada a sistem a u n iin k elimina un airchivo. La sy m iin k crea un vnculo simblico 3 un archivo. La llamada a sistem a que se emploa para establecer y modificar permisos de archivos es chrrod. en tanto que chown modifica la asig nacin de propiedad, igual que el comando de usuario de idntico nombre. La entrada y salida de datos en modo m ltiplos se habilitu por medio de laa llam a das it sistem a se le e t y p o li . Si se desea aco rtar un archivo sin leerlo ni escri birlo. se d e b e r u t i l i z a r l a lla g a d a a t r n c a t e Para obtener informa cin obre un nrchivo, tal como su tamao, fecha de creacin y asi siguiendo, las llam adas a S t a t . I s t a t y u s t a t obtienen los datos requeridos. El bloqueo de archivos, finalmente, que controla el acceso simultneo a un archivo o u u s t a t y su contenido, se logra por medio de laa llam adas a sistem a * lo c k o f e n t i .
ADMINISTRACION DE MEMORIA

La administracin de mem ona extiende ms all de las rutinas m a llo c y c a l l o c de la biblioteca estndar de 0 . De hecho, m a llo c y su s rutinas asociadas de asignacin de memoria .son llevadas a cabo por medio de las llamadas a siste m a Drk y s b rk . Adems de estas dos funciones, existe una familia completa de llamadas a sistem a que proveen un tipo de archivos de E/S de alta velocidad, nvapeada a memoria. Los nombres de estas fundones son urnap, munmap, mlock, lu n lo c k , n ilo c k a , n u n io ck alL nsyno. areir.ap y m p ro te c t.
Para dc/&ner sor-re rcr-vo s m aceCos an -rwmorts. .e r 'A rch.vos d e m apea de m em o

rva", >;r.a 174.

A d m in is t r a c i n d e s e a le s

El sistem a de adm inistracin de sedales com entado en el captulo 5, S e a les," est to talm en te m plem entado a m a n e ra de llam adas u sistem a a nivel de kem el y c o n is te de las siguientes funciones: s ia a c tio o Modifica la accin que adopta u n proceso cuando recibe una seal determ inada.

s i g s - S p e n d Reemplaza, tem p o rariam d n te la m scara de seales de un proceso con u n a nuev a, luego suspende la ejecucin dei proceso h a s ta q u e se reciba u n a seal.

'

)
Programacin en Linux

124

si o er.cin g R etorna una m scara de se al que contiene todas las se ales que estn bloqueadas, aguardando ser en treg ad as al proceso que efectu la llam ada. sgproc~ ask Establece o modifica la lista de seales que desea blo quear un proceso.
Cdigos de retorno d e la s lla m a d a s a s is te m a

Las llamadas a sistem a casi siem pre reto m an O cuando tienen xito o u n va lor negativo (casi siempre -1) cuando 'na ocurrido u n error, de modo que existan como mnimo dos m an eras de verificar el valor retornado
Ejemplos

1. Este fragmento do cdigo com para el cdigo de retom o de una llam ada a sistema con 0. IftcpOTr/ujrfsre/iinui/Makofiie*, 0 R D D nly)} ( tetara V I' Tuvo lugar un error, aisinistrnr aqu r *l># I
* la 9r*.ura <fcl archivo na stda oxitasa /

/ 0 ^donlY : A&rir sola para

D " T s jg ) ^
tj(M p io

) Ente ejemplo saca partido del hecho do que las llam adas a sistem a exitosas retanunO. U condicin i f evaluar a vordad<?ro si la llamada a open fraciisa, de codo de ejecutar el cdigo de adminiH (radn do orrores que resulto adecuado 2 Sate fragmento de cdigo haco lo mismo que el anterior, pero evala espedcataote si la llamada a sistem a reto rn a un valor negativo. iflotr;V uv,/irc,,lirux;u.tKo<, .Lo*, 0_PCONiv> < 0} | /* O .PO CN LV: A artr jalo pira iictura / ; ,ir trror aecurrto, rund* it ner /
t IM { / opnd tu f i l a jjcco ssfu lly /

I Dejando de lado hus diferentes condiciones i f , Iob dos ejemplos se compor*-an exactamente de la misma m anera. El prim ero emplea una notacin que es muy comn en C, de modo que el lector se enco n trar con la m ism a m u chas m e s. Yo prpfiero la sintaxis del segundo ejemplo porque re su lta m is jencilla de comprender por los program adores novicios, pero la eleccin es del lecwr (se trata de Linux, despus de todo).
Tabla de cd ig os de e rro r re t o rn a d o s p o r lla m a d a s a s is te m a

La tabla ti. 1 contiene una lista comentada de los errores que retom an general mente las llamadas a sistema. Como el lector est todava aprendiendo a progra mar a i el entorno Linux, probablemente no comprenda muchos de esto errores. Lea la lista a fin de adquirir una idea general, y luego, a medida que vaya leyen do al resto del libro y trabaje con ios programas de ejemplo, revise :a lista. La pgina del manual p ara cada uno de las llam adas a sistem a docum enta tocos los cdigos de error que genera la mism a. Adems, todos ios cdigos ridos en POSIX, el e stn d ar al cual adhiere m s fielmente L inux, se en-

jj

1
125

Captulo 5: U a m a d a s a s is t e m a

cu e a tra n docum entados e a la p g in a e r r n o de la seccin 3 dei m an u ai {tipee s a n 3 e rr n o ). Tsba 6.1. Cc-sos de e'-'cr zerera d o s por is s Itansdas a sistem a_____________
EfTOf__________ D e sc rip c i n ______________________________________________________
EPE-RM EN06NT ES3CH SIftTfi EO E: -.-cceso carece de su^c-entes permisos pa'a 'eaii23r !aoperacin cue 25-t tratando ce i'svar a cabo E proceso est trs:arv30 09 acceder un archivo odirectora Que e ste . Ese jxcceso no

re o s w .

Fue ntemumoica una llamada a sistema. Tuvo lugar aign tice de error oe E/S generalmente relacionado con el

EUXIO
2 5 IG ESCEXEC

nar-areh B fl'soositivo o OireccOn de E/S no existe.


La lista de argumentes transfendes a una llamada exec era demasiado isrga. 5 formato O un archivo binario que un proceso trat Ce acular ora In correcto .per eiemjxo. si so fratasa fe correr un archivo binario SPARC en un procesador x86) a una funcin cuo at>ro/corra/l#/cfis>e un archivo mero incorrecto Ce areh/vo. 8 proceso no tena proceso hijo al cual espor.ir. Un proceso trat Oo realzar c/S no Oioquoante cuanto no haba ningu na entrada disponible No so cu^ta con ta suficiente mornor n para llevar o caoo la operacin recuenca. Fue denegado e< acceso a un orcnivo u otro rocurso del sistemo
a

E3ADF ECH ILO EAGAN ENOUEU 6ACCESS EFAULT SN073LK ESUSV E E X IS T EX9EV ENCDEV EVOTDO EiSOlR EV /A l

se le oas un n-

una lamada a s w o m a se * wis un puntero mcorrocto (uno que apunta hacia una porcin ce memona que rosuita inaccesible!.

Un orcceso Intent montar un dispositivo que no es un dispositivo wcQue.

to

'jn oroceso trato ce montar un dispositivo que ya so encontraba menta do o atent desmontar un ilesystam corrientemente en uso. En-or retomado cuando se yat3 de crear un archivo que ya existo. Retornado per la llamada l i n k si :us archivos de ongen y destino no se encuentran en el mismo fllesystem. 0 oroceso trat de utilizar un tipo ca fllesystem cue e( kernel no admite. Une de 'os d<rectonos n .egrantes de una ruta da acceso no es en reaiicao un directorio. comparante no /n a re _d e _a rch vc de una ruta de acceso es ur. nomtire oe director o , no" de archivo. Un procaso :e transfiri un argumento nvlido a una liamaoa a sistema, co.

re

Programacin en Linux

Tabla 6.1.
E N F IL 5U= IL E ENOTTY

Continuacin
El sistema ha g.'canzsdo 'a mxima cantidad de archivos aciertos que puede admitir. El proceso que efectu la llamada no ouede abnr ningn archivo m&s aorque ya ha abierto el mximo nmero permitido. Un procoso trat de efectuar E/S de tipo terminal on un dispositivo o arch.vo que ' o es un terminal. Este error es el quo genera e' famoso mensaje nof a typarwritor Cesto no es uno maquina de escribir*). *Jn proceso ir.tont abrir un archivo blnuno o de biblioteca que so en cuentra corrientemente en uso. EJ proceso lamento intent escribir un archtvo m is que 10 que permiten el mximo dol sistemo o 'os lmites de recursos dei proceso. Un fllonyutem o clsoositlvo ostA lleno.

Error__________ Descripcin_____________________________________________________

ETXTBSY

E F 9 IG ENOSPC ESP IP E EROFS 6M LINK EPIP E E004J ERANGE

Un proceso Intent efectuar un ls e c k en un .ircnlvo no previsto para


realizar bsquedas. Un proceso Intent escnblr

n un flosystom de tipo &0.o4oc?ura.

El archivo que est siendo linkendo ha alcanzado la mxima cant-dad de tinto permitidos. El extremo de lectura lie un pipo esta cerrado y SIGP1PE ostfl $endo ignorada o capturada. Estableado por las funciones matemticas cuando un argumonto excece ei dominio de la funcin. Estaoiecido por las funciones matemticas cuando ei resunaoo de la funcin r.o puede ser representado par el tipo des valor retornado por la misma.

ENAMETQOLONG Una nita o nombre do archivo son demasiado argos. ENOSYS ENCTEMPTY ELOOP La llamada a sistema invocada no se encuentra implementada. un directcno en el cual se llamo a r m d ir no esta vaco. Una ruta contiene una cadena demasiado larga ce vnculos simblicos.

A d m in is tr a c i n d e e rro re s

Existen dos m aneras de comprobar y ad m in istrar errores cuando se utilizan llam adas a sistem a. U na es comprobar los valores retom ados discutidos en ei pargrafo an terior y redactar el cdigo que los adm inistre. La segunda es utihz-ar la variable global firm o que se encuentra declarada en < e r r n o . h>. To das ias llam adas de sistem a y muchas funciones de biblioteca la asignan un valor a e r r n o cuando tiene lugar u n error. Existen tam bin dos m aneras de utilizar ia variable e r r n o . La prim era se basa en la Llamada de fundn a pe r r o r , que est declarada en < s t c i o . h> y prototipuda como sigue: voia oerrortconst char $);

Cspi'.'jio 6 : Llamadas a sistema

127

pgrror exhibe la cadena s , seguida de dos puncos (:), u n espacio y el m en


saje de e rro r asociado con e r r n o , tal como s e m u estra en ei ejemplo siguien te. La seg u n d a m anera es m ediante u n a lla m a d a a strerror, como se lo -Ilustra en el segundo ejemplo de este pargrafo.
' i

E je m p lo s

EiCMPlO

1 La utilizacin de p s r r o r constituye la m an o ra m s comn do exhibir un cdigo de error 3 * 1 orocrw u *n lntr-t: epl.C / f c r M MrPfif C V lrci.aH

<tauB.r>
inel jC* <rrro.r
int

( FIL '.<{pf t i fopM(*fooer*, *r*)) m u ) Mrror(*fopna);


iit(Ex:r_FAiujRE):

( fprrttf'itoout, *A qu# 9s: *rcnivo -c lcjtp fil* );

.it ( iIT _ S .C C E S S ) ;

y Z \ program a in te n ta a b n r un archivo su p u e sta m e n te no existente, f OCbar. Si fracasa, que = .-> lo que debera ocurrir, llam a a perror y term ina. Si de a l guna m an era n e n a xtto. el program a c ie rra el archivo y sale. La salid a de este program a es la que sigue:
rsr:j*js_arror

g V 'F

fopeo: * < c sucft * ii3 o r d if c :c ry

o*

Como se puede aereo ar, resulta impresa topen, la cadena transferida a pe rror , seguida de des puntos y el mensaje de erro r asociado con errno. perror permite implen: n tar de m anera m uy sim ple pero suficientemente informativa una rudim entaria administracin de errores en sus programas. La mayora de Ies programas que se vern an este libro utilizan perror.

) ) . ;

>

>

Programacin en Linux

2. La segunda m a n e ra de u tilizar e r r n o , tal como ya o hemos anticipado. $3 por medio de u n a llam ad a a S t r e r r o r , que se encuentra prototipada en < S t r in g .h > de la siguiente m anera:
c h a r * s t P t . - r o r < ln t s r r n u n ) ;

s t r e r r o r reto rn a a u n a cadena que describe el cdigo de erro r p resen te en errnurn. La cadena reto rn ad a puede se r u tilizada solam ente h a sta la si guiente llam ada a s t r e r r o r . Se puede u tilizar s t r e r r o r p a ra im plem enta r u n a funcin p e r r o r propia (definida por el program ador), ta l como se ilu stra a continuacin:
I" Nwnbr* 091 prograna n Internet: nporrcr /

/*
C r r o r _ M r s o f l jli a d a .! :

/
l r c l u d a < 5 t3 io .h > * in c lu d * < s t d llb .h > * ln c lu d t J t r ln g .n in c lu d * < flrrn o .n >

void perror_Mdiricaiaicor.it shar nansajo, Int orrnun};


in t M U i(v o id )

<
F IC E O f l U !

lf ( [ p f li

f o p t n V o o b u r - ,

* r * ) ) VWU.) (

3 * rro r_ n r,3 if tcadai fo p in * , t r r h o l

x l :(XIT_ f a iu j r e );

> lio {
f3 r in t f( it a o u t , quo # sto a rc h iv o d x i s t a ? \ n '}

xit(EXT_3UCCE3S);

v o la o r r o r jjo d l? t c a d a (c & n s t citar 'n a r-s a je ,

Lnt orr/iun)

fp r L itffs t o e r r ,

"S s : J>.s\n*, a a a a a je , s t r a r r o r ( e r r w n ) | ;

} Este program a define -ana funcin, p e r r o r j r . o d i f i c a d a , que em ula ol com portam iento de p e r r o r . La mism a utiliza la variable global e r r n o como a r gum ento de s t r e r r o r . La .salida de este program a es idntica a la del ejem plo anterior, porque a stre rro r 3e le pas como parm etro el propio valor de e r r n o . Si el program ador le hubiera pasado otro cdigo do error correspon diente a una tab la di: m ensajes propia, el m ensaje hubiera sido diferente.

>

i
129

>

Caolu'io 6: Llamadas a sistem a

Lo que viene
r.n este captulo el lector ha aprendido sobre llam ad as a sistem a, la in terfa z e n tre el cdigo de modo usuario y el de modo kernel. A m edida que se con vierta en u n prograir.ador de Linux m s avezado, se en co n trar cada vez m s con situaciones en las que re s u lta ventajoso o conveniente u tiliz a r s e r vidos provistos por el kernel e n lu g ar de d esarro llar cdigo propio. E n los prximos dos captulos -e l capiculo 7, A dm inistracin bsica de archivos en Linux* y el capitulo 3. 'A dm inistracin avanzada de archivos e n L inux"tend r oportunidad de ap reciar excelentes ejemplos de los tipos de servicios que provee el k em el y por qu raz n los pueda en co n trar preferibles a te n e r que rein v en tar la ru ed a con su propio cdigo.

7
Administracin bsica de archivos en Linux
Efl Linux. casi todo es un archivo, ol monos en trm inos abatracto. E sta ca racterstica constituye uno de los mejores detalles do diseo de Linux porque hace posible una interfaz do proifram acin uniform e hacia un pasm oso y continuam ente cam biante conjunto de recursos, tales como mem oria, e sp a d o en disco, dispositivos, canales de com unicacin e n tre procesos, canales de comunicacin e n tre redes y h a sta procea* on ejecucin. En este captulo se com entarn las prestaciones fun d am en tales de la interfaz de Linux p ara el manejo de archivos E ste captulo cubre loe siguientes tem as: Concepto* bsicos del manejo do archivos de Linux Perm isos de archivos Tipos de archivos A pertura y cierre de archivos L ectura y e se n tu ra de archivos Obtencin y modificacin do la inform acin p resente en archivos Tbdos los program as e este capitulo pueden ser encontrados en el sitio Web h t t p : / / wav . c c p . c o s / i n f o bajo el n um ero de ISBN 0789722151.

'4

7
Administracin bsica de archivos en Linux
En Linux, c a s i todo es un archivo, al meno-s en trm inos batracios E sta c a racterstica constituyo uno de lo mejores d etalles de diseo de Linux porque hace posible tina interfaz de program acin uniformo hacia un pasm oso y continuam ente cam biante conjunto de recursos, tales como m em oria, esp a d o en disco, dispositivos, canales de com unicacin en tre procosos, canaln d comunicacin entro redes y h a sta proem ua en ejecucin. En este captulo se com entaran las prestaciones fundam ental es de la interfaz do Linux p a ra el m anejo do archivos E ste captulo cubro los siguientes tem as. Conceptos bsicos del manejo de archivos de Linux Perm isos de archivos Tipos de archivos A pertura y d e rr e de archivos L ectura y e se n tu ra de archivos O b te n c s y mcdicacin de la inform acin p resente en archivos Todos ios program as de este capitulo p u ed en se r encontrados en el sitio Web h t t p : / / x w w . s c 0 . c a m / i n f 0 bajo el num ero de ISBN 0739722151.

132

Programacin en nux

P ara poder com enzar a u tiliz a r las interfaces de manejo de archivos, el lec tor necesitar com prender los conceptos y caractersticas m s im p o rtan tes a los que se hace referencia cuando se habla de u n archivo. A ntes de seguir adelante con la programacin, e sta p arte se refiere a dichas ideas y nociones con bastan te detalle. Como se estableci, la m ayora de los recursos de Linux pueden s e r accedi dos como archivos. Como resultado de ello, existen muchos tipos diferentes de archivo. Un listado parcial de los tipos de archivos presentes en un siste m a Linux incluira los siguientes: Archivos norm ales. Pipes con y sin nombre asignado. Directorios. Dispositivos. Links simblico. Sockets. Los archivos norma.Ua o convencionales se denom inan archivos de disco y so los define como unidades de alm acenam iento de datoa que perm iten un acce so discrecional, tam bin denom inado aleatorio. Los mismos estn orientado a byt*3, lo que significa que la u nidad hmica em picada p ara leer desdo un archivo y escribir al mismo es el byto, conjunto de ocho bits que tam bin co rresponde a la representacin de cu alq u ier ca r cte r cuyo cdigo num rico .se encuentre comprendido en la tab la ASCII. Por supuesto, uno puede, y habitualm ento lo hnce, leer o escribir m ltiplos bytes a la ver., pero la unidad fundam ental sigue siendo cada carc te r o byto individual. Un pipi! 'comentado con m ayor d etalle en o! capitulo 15, Pipe# y FIFOs"' os sim plom cnte lo que su nom bre (conducto) dn a entender -u n canal de infor macin que recibe datos por un extrem o y los tran sm ite (modificados) por el o tro- Por un extrem o del pipe 3e escribo y del otro se leo. E xisten dos tipas de pipes: con nombro asignado y sin nom bre asignado. Los pipes sin nombre asignado se denom inan asi porque nunca aparecen en el disco rigido de un istem a con un nombre, tal como por ejemplo / < J r _ p r n c i p a i / k u r t _ v /a llw a ll/n o m b re _ d e _ p ip e . En cambio, I03 pipes carentes de nombro on creados y dustruidos en la m em oria (estrictam ente hablando, en el kernel) de acuerdo a las necesidades del sistem a. Adems, como ae v e r en * .* i punto "La interfaz de adm inistracin de archivos" en este mismo captulo, los pipes sin nom bre son referenciados siem pre por un nmero, n u n ca por nombre de archivo. No obstante, se utiliza la m ism a interfaz p a ra le e r de pi pes sin nom bre y escribir a los mismos que la que se utiliza p a ra leer y escri bir archivos convencionales p resen tes en el disco. Los pipes sin nombre son creados generalm ente como resultado de un coman do omitido desde la lnea de comandos do una interfaz, tal como se m uestra a continuacin (los pipes se indican m ediante las b arras verticales [ [ ]): sievPLO
S

cat /Ci'passa cut

-Ci

-d :

ha3d

-5

Caoftuo 7: Administracin bsica de archivos en Linux

133

La salida del comando an terio r seria:

-------S A IID A

lo El comando de interfaz de dem ostracin crea dos pipes sin aotnore. como se io indica m ediante las flechas en .a fig u ra 7-1. a-V W ! J rwd !

at < 1 < M F ig u r a 7.1. Creacin de p ip is sin nom bre m ediante comandos de inlvrfa: Como se puede ap reciar en la figura 7-1. el kernel crea un pipe sin nombre que recibe la salid a del comando c a t , quo norm alm ente escribe su salida a il& ndar output Ha pantalil. E l com ando C u t recibe su en trad a desde el extrem o de lectura del prim er pipe, lleva a cabo su propia transform acin de loa dato-? y luego enva su salid a al segundo pipe iir. nombre. E n tretan to , luejo de que CUt recibe toda la aalid a do c a t . * ? 1 kernel destruye el prim or pipe porque ste ya no resu lta necesario. E l comando hoad, finalm ente, ex hibe las prim eras cinco lneas do e n tra d a ledas desde e! pipe Luego quo head recibe todos los datos provenientes del segundo pipe sin nombro, el k em ei destruye tam bin este d i tim o. En ningn momento, sin em bargo, tu vo ninguno de los pipes un nombre a residi en el disco. Los pipes con nombre, por el contrario, tien en nom bres do archivo. Se los u ti liza principalm ente cuando dos procesos necesitan com partir datos pero no com partir descriptores de archivos (ver La interfaz de adm inistracin do a r chivos* m as ad ela n te p ara e n c o n tra r detalles). Loa dwectonos, tam bin conocdos como archivos de directorio, son simplemente archivos que contienen una Lata de toa archivos almacenados en ese directorio. Los archivos de dispositivo, tam bin denom inados archivox especate* o cuntroledores (d n v e n ), son archivos q u e proveen u n a interfa 2 con la m ayora do los dispositivos fsicos Pueden ser ta n to especiales do caracteres o de blo ques Les archivos especiales de caracteres son escritos o ledos de a un byto 0 carcter) a ia vez. Ejemplos de dispositivos de caracteres pueden se r los mdems term inales, im presoras, ta rje ta s de sonido y rutones. Los archivos especiales de bloque, por otro lado, d eben ser ledos o escritos en mltiplos e algn tam ao de bloque (un bloque es u n a porcin de datos de algn ta mao arb itra rio pero mltiplo de u n a potencia de 2, por ejemplo 512 bytes o 1 kobyte). Los dispositivos de bloque com prenden, e n tre otras, las unidades de disco, las u nidades de CD-ROM y las unidades de disco RAM (sim ulacio n es de una u n id ad disco en m em oria RAM). H ablando en trm inos genera-

Programacin en Linux

les. los dispositivos de carcter se em plean p a ra tra n sfe rir datos, m ientra* que los dispositivos de bloque se em plean p a ra alm acenarlos. Los archivas de dispositivo se en cuentran alm acenados en el directorio /d e v . Los vnculos simblicos son archivos que contienen u n a ru ta de acceso a otro archivo Funcionalmente. 3e comportan de m anera muy parecida a la de los alias de comandos. La mayora de las llam adas relacionadas con el manejo de archivos operan directam ente con el archivo real al cual apunta un vnculo, on liufar de hacerlo con el propio vnculo (esto se denomina seguir el vnculo). Loa socket 3 . finalm ente, act an de m anera m uy parecida a la de los pipes pero perm iten que los que o com uniquen sean procesos que se ejecutan en com putadoras distintas. Independientem ente del Upo de archivo, sin embargo, la convencin que u ti liza Linux p ara el tratam ien to de loa archivos -os decir, su hbito respecto de tr a ta r o casi todo lo que haya p resente en l sistem a como si fuese un a r chivo- le perm ite a uno u tilizar la mioma interfaz p ara abrir, cerrar, leer y escribir Es decir, las convenciones de Linux reapecto de Ion archivos le b rin dan al program ador una interfaz consistente y uniform e por medio de la cual in tera ctu ar con la totalidad del espectro de dispositivos y tipos do arc h i vos existentes, liberndolo de ten er que recordar los diferentes mtodos do escribir a los dispositivos do bloque, vnculos simblicos o directorio*.
E l m o d o d e u n a rc h iv o

El modo de un archivo, que se tija m ediante lu ejecucin del comando do Linux Chir.od, es un nmero compuesto de siete dgitos octales (21 biLs en total) quo expresa el tipo de archivo, sus correspondientes permisos do acceso y la even tual modificacin de su comportamiento predeterm inado (recordemos aqu que el sistem a de numeracin octal cuenta con ocho dgitos, del 0 al 7 inclusive, y que cada dgito se puede representar a su vez por tros bits o dgitos binarios, de la mism a forma que cada dgito hexadecimal se puede rep resen tar por cua tro bits;. Los permisos de acceso ocupan los tros dgitos octales inferiores del modo de archivo (o sea los 9 bits de orden m s bajo). Los tres dgitos octales (o 9 bita) de orden ms alto expresan a su vez el tipo de archivo de que se trate, m ientras que el dgito octal (3 bita) del centro representa el valor del modifica dor de modo de ejecucin, que veremos enseguida. La figura 7-2 ilu stra la con figuracin del modo archivo y sus elementos constituyentes. StttanbnU
ro a i2 2 > ? u a ' >S:3AntaV*

f* rz* -cata ii
U u W Si:

F ig u r a 7.2. Los amentos del modo archivo.

C *V O 7: Administracin bsica de archivos en Linux

135

LOS TRES DtafTOS DE ACCESO DE ARCHIVO

Los tres dgitos ocalos de orden m s bajo ex presan los permisos de acceso de un archivo A medida que se recorre ia figura 7-2 de derecha a izquierda y se va observando cada uno de ellos, el valor del prim er dgito especifica los p er misos de acceso al archivo que se en cu en tran vigentes p ara cualquier u su a rio del sistem a que no sea el propietario del mismo, m ientras que el valor del segundo hace la mi3ir.3 cosa p ara el grupo al que pertenece el propietario del archivo y el itimo dgito lo hace pora e l propietario tratad o como usuar.o individual. respectivam ente. Si agrupam os los tres dgitos que especifican los respectivos modos de acceso, ta l como se lo hizo en el caso de las m scaras du comprobacin de la tabla 7.1. vemos que u n valor 1 en el correspondiente d gito octal corresponde a privilegios du ejecucin: un valor de 2 correspondu a privilegios do lectura, y u n valor de corresponde a p riv ile g ia d uacritura (los dgitos octaies de valor 9 dispuestos h acia la izquierda a p a rtir del dgito central corresponden nicam ente a las m scaras de comprobacin que se m uestran all; us valores verdaderos p a ra el modo de archivo se explican en este mismo capitulo). P ara especificar perm isos de acceso especficos sim ple m ente se deben ju ra a r los valores requeridos do cada columna e n tre si. Obsrvese que la sum a de los valores posibles p ara cada columna nunca su pera el dgito octal 7, es decir, nunca liega a 8. quo en el sistem a octal se re presenta como 10 y obligara a un acarreo Por esta nnsuia razn, on eau* ca so particular tole dgitos octaies se puedan tr a ta r como si tuesen decimales, pero sin perder de vista que en realidad non octaies. El archivo de la figura 7-2 es por lo tan to leble y ejecutable por e l grupo dol propietario y por cual qu ier otro usu an o , y leble/escribible/ejecutable slo por el propietario, r*oot.
e l d g it o d e m o d o d e e j e c u c i n d e a r c h i v o

El cu arto dgito octal (el dgito ce n tral) d el modo archivo es el dgito que corresponde a su modo de ejecucin; el m ism o :ndica ai se tr a ta de un a r chivo setuid, setgid o p e r tin a z ' (sticky). Tal como se vio en el cap tu lo 4. P ro c e s o s/ cuando u n proceso e je c u ta u n archivo s e t u i d o s e t g i d . su UTD o GLD efectiva, seg n corresponda, es p u e sta al mismo valor que la del propietario del archivo o la del gru p o a l que este pertenece, resp ecti v am en te. C uando e st activado el b it de p e rtin a c ia (indicado por u n a S m ayscula, por S tiC K y * , cuando se e fe c t a u n listad o de directorio con a opcin - i del com ando I s ) , s u p re se n c ia obliga al kernel a tr a ta r de m a n te n e r el archivo er. m em oria todo el tiem po que le resu lte posible (de ah el nom bre de p tn in a s ;, a u n e n el caso de que el mismo no e st siendo ejecutado, porque eso reduce el tiem po d e comienzo de ejecucin er. pos teriores corrid as del p ro g ram a d u ra n te la sesin. Los valores posibles pu r a dicho dgito octal son los del dgito c e n tr a l de la ta b la 7-2, que provee las m scaras y co n stan tes sim blicas p a ra ia d eterm inacin el tipo de modo de ejecucin. El dgito octal m odificador de archivo de la fig u ra 7-2 v ale 0. p o r lo que el archivo no es n i s e t u i d , ni s e t g i d , n i p ertin a z , y slo puede s e r ejacutado como lo especifican los tre s dgitos o ctaies de la derecha.

)
136

>

'

'

'

Programacin en Linux

N O TA les bits de moGrlcdC$rt y do permiso de un archive constituyen mscaras es bits. 0 d gitos octales c -e son mnlpSados y evaluados cor as urciones de manipulacin ce bits Ce C. tales como : (desplazamiento a !a izquierda) y - (comptemento de bits!. Afortunadamente. Linux provee un conjunto de ^aseares y constarles slTOlcas (ver cotamna izquierda de tala 7.1) que facilitan deoosiicar oi modo de un archivo.

Tabla 7.1. Mscaras para comprobacin del modo de acceso de un archivo.


Constante Represensimblica tacin octal S_IRWXV 0000703 3300400 000452OC 0000130 0030070 Modo de acceso que permito determinar El propietario o'al archivo cuenta con permisos de lecwra/escritura/ejecucin El propietario dol archivo cuenta con pe'miso 00 lectura 0 propietario del archivo cuenta con omiso de escritura El prop;eano del archivo cuenta con pemvso de e;ecvcin El grupo cuenta ccn permisos do ectura/oscmuro/oj'ocucin 1 grupo cuenta can permiso Cu lectura El grupo cuonta con oermiso de escritura El grupo cuenta con permiso de ejecucin Otros usuarios cuontnn con ponniooo de lectura/uscntura/ejecucin Otro r u a n o s cuentan con permisoo: de lectura Otros usuario cuentan con p e rn io s de asentuta Otros usuarios cuentan con pormlsos de ejecudC' POSIX SI

S_IRUSR S_I'MJSR S_XlSH S.IRWXG

S st

55
S!

S_IRGPP S_tWGRP S_IXGRP S_IRWXO

W 009 4H 0000023 8000010 3300007

si s; Si Si

S_rflOTH
s_ w t

000000. 8000002 3000001

si si
SI

s _ ix o r H

Tabla 7.2. Mscaras de comproDacln de la modalidad de ejecucin ce arcnivo.


Coi^tanto RepresanModo do ejecucin de archivo simblica racin octal quo permito determinar POSIX Si

s_isuro 300-1200
S JS G ID 0002000

Eatabicco 10 de usu3ro (UIQ) (modo s e tu id i Establece iD de gruoo (CID) modo s e tg id Modo pertinaz (sfrcy). Guarda archivo en memoria aun cuanco ya haya sido ejecutado, ce modo ce ganar en velocidad ce acceso la siguiente ver

si
No

s_rsvrx 001 000

El. INOICADOR DE TIPO DE ARCHIVO

El indicador de tipo de archivo (el dgito octal de la extrem a izquierda de los siete dgitos que componen el modo de archivo) es u n simple valor numrico que especifica el tipo de archivo. Los tipos de archivos adm itidos er. Linux ?on los siguientes:

.1

) 137

CacxtL'O 7: Administracin bsica de archivos en Unux

Socket Vnculo simblico. FIFO. Archivo convencional. Directorio. Dispositivo de bloque. Dispositivo de caracteres.
L a ta b la 7.3 lis ta la s c o n sta n te s sim b lic as y m s c a ra s que el lctor puede e m p le a r p a ra d e te r m in a r el tipo d e u n archivo. Tabla 7 .3 . M scara de ccm sfQOscidn de tipo de archivo._______________________ Constante Reoresensimblica tacin octal
S_IFWT 0 I7 0 C 0 0

Modo do accoso quo permito determinar

__

POSIX
No NO No No No No No No

Mscara oara com probacin oe cualauier tioo de arehrvo <Deoe activados todos los cit3 ooaajios) arenno o s un Socket
0 archivo e s un vnculo simei-co

SJFSOCX 0140000 S_IFLNK 0120000 S .'F flE G 0100000 SXFBUC oosoocc s . zfoxr 00*0000 s _ ifcm r 0020000 s _ i f : fo 0010000

E arcMvo e s convencional E. arcruvo 09 un dispositivo de Oiooue E retuvo 04 un OlrectOO El archivo e s un dispositivo do caracteres 0 ircftivo e s jnn FIFO

U na seccin posterior de este capitulo, Obtencin de informacin do archi vos*. ilu stra cmo utilizar las constantes simblicas para determ in ar el tipo de un archivo. El m -itenal de e s ta parte tal vez lo re su lte aigo abrum ador. Sernese! A un que ei mismo constituye el b asam ento del resto del capitulo, todo lo que re a l m ente necesita com prender a e sta a ltu ra es quo Linux cuenta con muchos tipos diferentes de archivo y que el lector pueda utilizar la3 constantes lista das en la tab la 7.3 p ara poder d e te rm in a r el tipo de un archivo. D espus quo haya ledo el resto de este capitulo y trabajado con los program as de ejem plo, vuelva a re p a sa r las tah las 7.1, 7 2 y 7.3.
C O N S E JO 5*2 0 0 r* r informaden SOtte ;crra manisvlar el modo Oe un arclwo desde la petS* pect.va ae .suarto ef de a ce -n arogramaccr. ver reacrt Su.'SelfUnux in 24 Hovrs 3 i Sai; . Lr.ux Unieasned ; T n Parker) o Spe&at Soiocn 'Jsirtg Unux {Jac* Tacy Steven Burnen), te c e s estos libros p_ol, esees oor Sars.

Programacin en Linux

La u m a s k

lector descubrir en la prxim a seccin, La interfaz de adm inistracin de archivos", que puede c rear nuevos archivos y directorios y puede fijar los permisos respectivos de acceso a loa miamos m ientras los crea. Sin embargo, tanto u nivel de sistem a como de usuario, los perm isos que se asignen sern modificados por la um ask asig n ad a al proceso, que contiene u n a m scara de bits com puesta por los bits do perm iso a se r desactivados p ara los archivos y directorios nuevos que sean creados. La um a sk afecta solam ente a los bits de perm iso de un archivo; uno no puede v a ria r por medio du la um ask los bits que especifican el tipo y la m odalidad de ejecucin de un archivo Se puede modificar la um ask do un proceso, pero slo p ara hacerla ma res trictiva, y r.o menos restrictiva. Esto se efecta m ediante u n a llam ada a unres*. prototipada en < s y s / s t a t . h> tul como se m u estra a continuacin.
jnaaK(noc_t na w m h i;

E sta funcin ostablece como nueva umask del proceso !a m scara newmask (m scara nueva), retom ando la umask an terio r independientem ente de quo la llam ada a la funcin umask so complete exitosam ente o no.
E je m p lo

El iffuiente progrnm a de dem ostracin llam a a u n a sk para establecer una nueva um ask m s restrictiva.
J C M I> I. O

/ son ora d a l a-ograita an [n c o rro t: r.e*n .sjk .c * ;

r rtu*va_unask.c - Modificar ia uttiSK nacindola ran restrictiva I


*rr.cluco <sys/stat.n> rcluce <sy*/types.n>

incluae <stoia.n> incluce <j:oLi3.r\>


xnt oainivouj}

aoas_: rueva_B3scara = 666, cascara_anterior; / los fligitcs ser ocales


<w$cara_Mtortcr ac4SK{ftueva_aa3ca."aj; p r iu t f ( La jnask anterior era %/ro\n*, n&scara_anterior); a r w r tC L a nueva unas* es % '. * , nudva_aascara|; systeaf teucn feo*);

9xit{XIT_SUCCE88);

CacnUic 7: Administracin bsica de archivos en Unux

139

S . U

V_UB*SV

J i t * * * t e r 10 * **3 2 2

La % f i -*ss* es 5
S 1 - l feo

............................... ^ u rt_ n ll j*rs a sJyl 2* 19:93 ico Como o m u estra la salida de este program a, la nueva um ask queda e sta b le cida a 866 desactivacin de perm isos de lectu ra y e sc ritu ra p ara todos los usuarios, el propietario y su grupo). La u tilid a d to u c h de Linux, que modifi ca la fecha y hora de u n archivo, ta m b in crea al mismo tiempo, on ausencia de alguna restriccin especfica, u n archivo coa modo de acceso 666. que asigna perm isos de lectura y e se n tu ra a todo el mundo. S in em bargo, una u m ask de 666 hace exactam ente lo opuesto y obliga a que todoa Ion archivos que sea n creados en el fu tu ro no ten g an activado osos bit do perm iso. Co mo resultado de ello, f oo result creado a in bita de perm isos, que es ex acta m ente lo que inform ls .

La interfaz de administracin de archivos


La m ayora de las opciones de adm inistracin do archivos vienen en dos formili: una que opera con los nombres do los archivos y o tra que opera con sus descriptores Loe descriptores de archivos son nm eros enteros positivos y de bajo vaior que actan como ndices de u n arreglo de archivos abiertos que m o n te n e el kem el p ara cada proceso P o r ejemplo, las funciones S t a t y f s t a t reto rn an informacin sobre el archivo que se especifique en ellas. Las m ism as se en cu en tran prototipadas como sigue en < u n i s t d .fi>:
m t stat!es<*-st cnar filar.**#, u it f s u t f i n ; fa, a tro cr ata: :at *3uf);

Como el lector podr observar, a ta t e sp e ra que en f ile n a m e se le tran sfiera el nom bre de un archivo, m ientras que f s t a t espera que en fd ae le pne un descriptor del archivo. A cada proceso >e le asigna siem pre de form a p redeterm inada tre s archivos especiales abiertos: standard inpui ( s t d m ), standard output ( S t d o u t ) y =:andard error s i d e r r ) . Estos archivos corresponden a los descriptores de archivo 0, y 2. respectivam ente. Sin em bargo conviene utilizar tres maerns, definidos en < u n is td .h > . en su lu g a r STDIN_FILENO. STDOUT_FILENO y 5TDERF._" ILcNO- Se le advierte que em plee esos macros en lugar de colocar directam ente 0 .1 o 2 en su cdigo fuente porque su program a puede se r com pilado en u n sistem a en e! cual standard tnput, standard output y standard rror no se correspondan con los valores enteros 0 .1 y 2.

NOTA
E r3 ta -- 'c -= as aranas ce marero ae areivos cubiertas en <esio Je este capr i o no 'Ciuver 33 r u t o -e bftsfccteca estroar ralea co ro fc-cer. fcose y asi sL M^r-e <t oue el c o r ya 'aa ccncce. S. necesita efectuar un repaso rkoo. vea C Prcgra>TvL^guege. Seconc Editic*.. de 3rfar. Xemigjisft y Dennis Pittfte. C 2 > ltsr-z.i. X a-eg 5 = f ry . o Texfi 'terself C in 21 Zsys. ffrm Earaor.. ce Pe-

i
140

,t

>

J*

Program acin en Linux

A p e r t u r a y c ie rr e d e a rc h iv o s

Existen dos m an eras do ab rir un archivo. Open y c r e a r . Ambas e=tn proiotpadas en < u n i s t d . h>. pero se debe recordar adem s de incluir en el cdi go f u e n t e e l a r c h i v o de e n c a b e z a d o < f c n t i . h > .
LA L U M A D A A SISTEM A O p e n

Existen dos definiciones de la llam ada a sistem a open: int coanfecnst cnar pathnnni, int flags);
:n t o oericonst cnar patfnane, in t fia o s . rode_t .xode);

o pen in te n ta ab rir el archivo especificado en p ath n a m e (nombre de ru ta ) con oi acceso especificado en f l a g s ( indicadores). El parm etro mode con* deno el modo del archivo, si eg que ste va a se r creado sim ultneam ente. Se deben establecer los indicadores a 0_RD0NLY, OJVRONLY o Q_RDWR, quo es pecifican accesos do slo lectura, slo escritura y lectura/escritura, respecti vam ente. Adems, su pueden estab lecer uno o m s de los valores octaies I13 tado- en la tabla 7.6. Si se utiliza m s de uno de los valores de dicha tabla se debe hacer con ellos tina operacin lgica de O (logical ORI bit a b it Utilice la prim era forma de o p en si el modo de archivo por defecto satisface su s ne cesidades. Utilice la sejjunda forma de open si desea establecer un modo de archivo ospecfico, modificado por la umask del proceso. Ambas form as de open reto m an , tienen xito, un descriptor do archivo. Si no. re to m a n 1 y asignan un cdigo a e r r n o . Tabla 7.4. Listado parcial de indicadores (flegs) de acceso para open y crear
Indicador
o_ r o o n l y

Valor ooaa
0001

Descripcin El archivo so ;ibr<9 so.o paro lectura 0 archivo so abre solo para escritura. Se escribo dosde su orgen fie datos 1 archivo so abre para lectura y osentura

C_WRCNLY 0_ROWfl 0_APPEN0 0_RAN00M


o_seq en t:al

0002 OC08
0 10

Ut esentura de datos so reola siempre 3- final Cei arcnlvo 0 drcnlvo se aore paro ser accodido de manera discrecional
(aleatoria) El arcnlvo se abre

3020 0040 0080 0100 3200 0-100 4000 3033

para eer accedido de manera sec-jonoai

C_TSM?OHARY 0_N Q IN H ER IT 0_CREAT O^rRUNC o le X C L Q _TE X T 0 9INARY

0 archivo es temporario
1 archivo no hereon las varlaoles ce entorno dei programa oue

lo creo Crea el archivo si este ya no existe Establece d tamao del arcntvo en 0 by.es. Empleada slo con 0_CREAT. open no abre el archivo Si y3 :o ah 0_CREAT 0 archivo se abre en modo texto 0 archivo se abre en modo oinarlo

coniina

>

Captulo 7: Administracin bsica de archivos en Linux

141

Tsbia 7.4. Continuacin Indicador Valor 0_M3CTT7 0_MCK3LCCK OjSYNC

Descripcin

Si e ah-.vo en cuestin es jo disoositivo ce terminal iTTV), no se corve'*jr en 3 terminal de control del oroceso CTTY) ore e arc^wo en rroto no-blcqu*. de -OCO que ur.a ecturg retomar cero bycas en lugar de un bloque 'coas : escrituras X arctivo cecen completarse antes de ace retorne a liamada a sistema

LA LLAMADA A SISTEMA creat

ereat tam bin abre u n archivo, pero prim ero lo crea si ste no existe. S u pro totipo es ei siguiente:
H it crea: (coi? cnar M tn n , nc_t o o i ;

Esto es equivalente a lo siguiente:


CQ*fl<MtRrai*, 0_C* 0_T*>jMC 0_"0NLY, acd?);

Los program as de este libro no em plean creat por dos razones. Pnm oro, p o r que e st m al deletreada. Segundo, la llam ada a o p en es m s general y, siem pre que se utilice el indicador 0_CEAT, logra el mismo resultado, c r e a t retorna un descriptor de archivo 3 tiene xito en su cometido o, si fracasa, asigna un cdigo de e rro r a e r r n o y retorna I
LA LLAMADA A SISTEMA C l O S G

&

\ 11

Pora c e rra r un archivo, utilice la lla m a d a a c i s e , prototipada en < u n ist< J.h > de la siguiente m an era: int :!( int ?d); doe cierra el archivo asociado con fd (file descriptor) y reto m a 0 s tiene xito o 1 si ocurre algn error.
E je m p lo

El siguiente program a sim plem ente abre y cierra un archivo de nominado hola:
en in t e r n e t : fo p u .c */ * a t r t \ ) r * / c t e r r t a r e n iv o i

/ .%3acr* 3l r e t e r e * .

fJEM ?LO

/
#i*clod c n i. ft

#ineiuO <urlJt3.>

L/telrt* isclude <*Wio.n>


m : u in ( v e ia )

{
:n t d escn p re r^ iren ivo ; char r o t a r 5 * {tola*;

if ( c - : r i o t : r arcnivc - ccan-ruta. 0_0AT ;* v r ; k u 7 . i ) ptrror(*9flA*)

0 -RUNC

0 W RONLY, 6-*41 ) (

142

Programacin en Linux

} elj# printf(*ADii)r:o archivo Ns'.n*, ruta>; if{clos{de$criotcr_4rcnivo| < 3! { p a -r o r C c io S '); exit(txiT_?AlLUPE|;

9 l3

p rin tf('C e rra d o archivo

% aVa , ru ta):

ItlEXZTJUCCEtt);

) La ilamadu a sistem a open trata de abrir ei archivo h o la o modo alo lectura C_CREAT h ar que ei archivo sea creado si no existiese previamente pero, si ya existiera, 0_TRUNC pone el tam ao del archivo a cero, como si hubiera sido re cin creado. 0 W RONLY hace que el archivo 30 abra para lectura/escritura solamante. Cuando el archivo queda abierto, c i s e procede rpiduraante a cerrarlo. En particular, obsrvese quo el cdigo fuente verifica el valor de retom o de c i s e Aunque comnmonto esto no ao lleva a cabo, rep resen ta en ese caso un jerio erro r de programacin por dos razone. Prim ero, en un fileaystem operando en red. tal como NFS, In llam ada a c i s e puede fallar debido u :. atenria de la red. Segundo, mucho sistem as e st n configurados con alma cenamiento temporario (cacha) de tipo escribir despus, lo que significa que una llam ada .i v/n*. e reto rn ar con xito, puro el toma operativo diferir A la accin efectiva de escribir a disco h asta h a lla r alguna ocasin m s conve niente. Citando la pgina del m anual p a ra C i s e (2): La coudiuQ de error puede (llegar a ; s e r inform ada (recin) en una operacin postenor du eenturn, pero se g a ran tiza que serfi informada cuando se proceda a cerrar el archivo. El hecho de no verificar el valor retom ado por c i s e cuando se cierra el archivo puede conducir a prdi d a inad v ertid a de datos."
L e c tu ra y e s c r itu r a d e a rc h iv o s

Probablem ente ei lector desee tonto leer como escribir y desplazarse por u n archivo. P a ra leer de un archivo y escribir al minmo se proveen en < u n i s td .h > los siguientes dos funciones: asiie_: readfmt M, voic *Ouf, sZ8_t countl; a i <rita(in: -d, ccns* void *buf, size_t count); r e a d tra ta de leer desde el archivo abierto indicado por el descriptor de a r chivo fd la can tid ad de bytes especificada por c o u n t y si reto rn a exitosa m ente alm acena los datos ledos en el buffer (espacio en memoria) especifi cado por b u f . Si tiene xito en su ta re a reto m a asim ism o el nm ero de bytes ledos desde ei archivo (0 indicara u n a condicin de EO F o final de a r chivo, E sta cantidad puede llegar a s e r m enor que el nm ero de bytes solici tados. Si se produce un error, el valor retom ado ser - 1 y se le asig n ar u n valor a e r - n o . Despus de una lectura exitosa, el puntero de archivo ser avanzado la cantidad de bytes efectivam ente ledos, la cual no n ecesaria m ente ser igual a c o u n t.

Captulo T: Administracin bsica de archivos en Linux

143

Sim iiarm ente. w r i t e escribe en el archivo especificado por el descriptor de archivos f d h a s ta la cantidad de bytes especificada en C O unt desde el buficr sealado por o v?. U na operacin exitosa de e sc ritu ra recom a el nm ero de bytes esp ato s 8 significa qu no se escribi nada). E n caso de error, w r t e retom a 1 y asigna a 9 ,' rr,o u n valor rep resen tativ o del error ocurrido.

Ejem plo
E l sig u ie n te p ro g ra m a lee su propio cdigo fu e n te , y luego lo esc rib e en / d e v / n u i l y e n u n archivo d e n o m in a d o / t m p / f o o . b a r : ! Xoatn U '. t 'v j-x v i m ln:^net: fr*ad.c /

/
. c tu r j_ tc > -;tu f* .c U * i l f t l d a s 1 1 1 t r o * r*d y r i t e

/ inclu*
aincluc* <*ifiitd.H incl-jct <tclis.n>irclutfe

m MtPiwcw) (
ii*.t s v : r t c : o r _ * j r t t . d * c r ip t s r _ n u l l, d## crio to i*_'o Q o ar. nui_bytos; c n a r - o a ^ r c ft - .'io il U c t u r a _ * r l t u r a . c * ; t u r e w f jje ; / At r i e ; t i a rc ftiv a ?u *n t* */ : | ( d e s c r o t o r _ #u *n t* * s ; n ( r o o _ jr c i* :v o , O flflO N U l) < ) ( ^ * r r c r * c ^ * a l* c t u .- _ a s c r r u r a .c * | ;

\
f
A C r ir :

ir iv o

/fl#v/rol /
* G e rt(* /aeW ftu ll , 0 _ * fi0 \i.v )) < 3) (

tf(:c* scrio tC r_ fiu U

p ierzr('ct*n m V /nuil);
c lM e {c * * c r iM f_ f o ta ) ; a s ie r r o */ 5 X lt(s .x rr_ F A !!.llR s); / C r r a r e s : a a r c h iv o , ya $ue lo Itaoianas

)
r t r : e l a rc h iv o / t 0 . - o . s a r l i * d * S C f;o to r c o ra - = ;o e r ' t a p / f > . M r * . 0 caEAT , 0 TflUt>C OJOTCNLV,

S < ) {
- rro n * 5 * - t a f l r 'c c . s a r * : ; l C i * : c 3 s : r a t c r _ f u-er:e ; * -a y qu e c e r r a r l o s eos i r c n iv o s a o ie r :o s

:v,c5 >

;= !: *
c l o s a ( d s c r i o t c r _ n a ll } ; a * i r { X i : -K lU < tZ r.

.te - -= = := i zy'ts
1 v 2 - ; - : * i s i r -.asta

i=ctr3_oicrLcura.c.
? s y r e s jn l e v / n u l i / < 0)

r.il[(/iua_Dytss = *e40(C6Scripto-_u#a, C n i , 18; | = 3) f


if ( * i * : e i l e s s r 3 t o r _ n a i i , b u f, >0

>

>

>

>

>

144

Programacin on Linux

o s rr o r C w r ite /d e v /flu ii* );

}
Ahora a s a r ib ir nas a -8 aytes an /tn p /ao .O ar */

{
if(* rii;9 (c 9 s c.- p t0 r_f3 0 & a rt w f , n u s jiyte a ) < 0; P 8 rr o r (* r it B .'tn p / fo o .B a r');

>
c e r r a r lo s t r e s a rc h iv o s y s a l i r ' I c :o s e { c !'3 s c r iD t 3 r _ f u a i:9 j; c io s a a e s c r :p tc r _ n u ll) ; c lc 3 a ;a e s c rip ts r_ fc c 0 a r) x it lE X t T 3UCCESS}

} Ei program a abre tres archivos, uno p ara lectu ra y dos p a ra e scritu ra El a r chivo / tmpy f o o . b a r resu lta poco relevante, pero obsrvese que el progra ma abre un controlador do dispositivo, / d e v / n u l l , como 3i fuese u n archivo corriente. De modo quo os dable o bservar que se puede tr a ta r a la mayora do los dispositivos como si fuesen archivos. La terminologa e st n d a r que se utiliza para m an ip u lar archivos convencionales se em plea tam bin p ara adm in istrar diapoaitivoa y otros archivos especiales. O tra caracterstica del program a es que cuando escribe al archivo de disco denom inado /tm p / fo o b a r, escribe slo h a sta n u m _ b y te s caracteres, lo quo evito que se cucriban bytes carentes de informacin al final dol archivo. Lu p n m era llam ad a a r e a d antes de alcanzar ol final del archivo probablem ente no lea la to ta li dad de lo 10 bytea, pero v /r: t e escribir n ol di/ico tant03 bytes como se !e haya instruido. Al escribir slo n u m _ b y te s, ol program a no agrega c a ra cte res adicionales al final dol archivo.
P o s lc lo n a m le n to d e l p u n te r o d e l a rc h iv o

Si se quiere leer y escribir desde cuulquier posicin de! archivo, deber po der canto doteransnar la posicin co rriente del puntero del archivo como pos: d o n a r ol mismo adecuadam ente. La h erram ien ta p ara este propsito se d e nom ina l s e e k . Su prototipo en < u n s t d .n > es el siguionte:
L it LsaaK(uit fa, o t t j o fa o c, in t nence):

iseek colocar el puntero dol archivo abierto que se encuentra individua]iza do por el descriptor de archivo f d file descriptor), en la posicin situ a d a a offset bytes contados desde la posicin especificada por w hence desde dn de). w hence puede ten er uno de los valores siguientes: SEEK_SET ubica el puntero a o f f s e t bytes del comienzo del archivo. SEK_CUR establece la n ueva ubicacin del puntero a o f f s e t bytes re lativos a la posicin corriente del mismo, o f f s e t puede se r tan to posi tivo como negativo. SEEK_END sit a el puntero a o f f s e t bytes contando hacia a tr s desde el nal del archivo. C uando tiene xito l s e e k reto rn a la nueva posicin del puntero, o 3i tuvo lugar algn e rro r reto rn a un valor entero de tipo o f f _ t y valor -1 , y asigna el valor adecuado a e r r n o .

Cactulc 7: Administracin bsica de archivos en Linux

145

\ 'r .

E je m p lo

'

^
t JC M P t O

El siguien te ejemplo lee 10 by tes desde el archivo de ingreso de d ates despus de s itu a r ei cur>cr en diversas ubicaciones del archivo.
. \oozr* o e l a r e ir a s r s=>:.c

{ */

9-o-c - Utilizacin de Ls?i<

* i x l u 3 < iy s / ;y p 9 3 .h p c io t e < s i i 5 . n >

tlese <5*dL).i>
<fc.Ttl.h>

io :lt9 <vftLSW-fw
l n t zain(*oC)
c f a r a< -ctivo _ t 3 0 0 rir o ( [ - 't s c x x x x x x \

cftif 0ufpI;
ir t i , d s c r t t o r _ e .-itr a a , s c f i f i t o r j a l l d a ;

/ Afcrir *1 archive Ci *ntr5<ta i I f 'lt t s c r is C T . f f n t r a d l p*n<*(Jlpo*ttt0.tAf, Q_S0QNLY)) < < l) (

cwrrcrCicer. cu ooitivcs.txt*};
x ;t iI T

>

/ C rar j; ircn ivo ttJ*ccrario para la salida '< t e r n u it s i m r c _j* ((c h s r * _:np'.Jt#i) t i jna funcin proxatipada

r. s W U 9 .r QU1 ' to rn a un a u n ta ro j un a rch ivo t n u p c n r io tapXXXXXX I f ( l l K f i p W . U l l U * t H * n p n r - n iv o _ :o o c o r a r * o i^ < ) { p + r r o r ( * e s t * * P ') ;

*it(x:T_F*:LiflGi; )
p r irM l 1 a rc h iv e U 1 1 1 1 4 4 t i V #\n*. j r c fc lv o jr t n o o r .ir io ) ;

E?aolcer la uoicacton I n i c U l <Jfl- puntero an *1 archivo no ntn<in M H (0 tse fS p tsr^ in trM t, 1 M , 35K.5T);

/
E i c r l f i i r t i archivo s a c a l e p r la t r w it es t t O* 5 y t la t io s a l a rcn iv o a* salaos

/
fx (l i < t f t ~ l) { 'ti<j{54scrip2r_*r.:rMa, auf, I0>, r i* ( i c r i p t o r _ s a l l a , 5uf. 1 0 ) ;
is k ( a c r io :c r _ > s n t.-3 c a , 0 3. SEEK_CUfl); r e s t a n t e s Ot U s e r i a c ~ !M / l S a lt s a r s n l e s 90 o y ts s

> ::o5=(asscnptoj_ntrss= i;
: lo s g d es c - i c t o r _ i a i 1 s > ; xt{XI7_5UCCcSS);

i E l archivo de e n tra d a , d i s p o s i t i v o s . t x t . e st incluido (con el nombre aev tC 9 S . t x t ) en el sirio Web de e ste libro, ju n to al cdigo fuente de esto capitulo. A dem s, en lugar de asigruirlc u n nombre cualquiera al archivo de

Programacin en Linux

salida e incluirlo en el cdigo fuente, este program a utiliza la llam ad a a mksteinp p ara cre ar y a b rir u n archivo de nombre exclusivo para esa corri da especfica del program a) on ol directorio corriente. Despus de situ a r el puntero a 256 bytes contados dosde el origen del archivo, ol program a proce de a leer 10 bytes, I03 e3cribe al archivo de 3alida y luego se saltea los res ta n te s 90 bytes, de acuerdo con lo requerido. El nom bre del archivo tem p o ra rio de salida v a riar p ara cada ejecucin del program a, aunque siem pre comenzar con tmp r por lo que luego de correr cada instancia dol program a se debera proceder a elim inarlo m an u alm en te p ara que no ocupe espacio in necesario en el disco. Una corrida de pruoba do u b i c a r p u n t e r o . c produjo la siguiente salida:

s a l i a

El siguiente comando de interfaz noo perm ito ver el contenido do tmp t j CXQN, cuya correccin podemos verificar leyendo en un editor de texto ol program a original d e v i c e s . t x t (loa pacin tam bin cuentan como c arac teres):
s c a t t* p ? |c x c
ik j ;

A uguin u sotr in ir c lu d a c c *

* tp ;/^ fa x varsioiflu x P lla s H iflu x - s t a n ly .

A lio c in tho puributed i

T r u n c a d o d e a rc h iv o s

O hviam ente. p a ra extender un archivo slo hace falta escribir m s d ato s al mismo o colocar el p u n tero m s all del fin al mismo m ediante una llam ada l s e e k . Pero cmo se puedo tru n c a r un archivo? U tilizando u n a llam ad a a t r n c a t e o a f t r n c a t e , por supuesto. Estn funciones, declarad as en < u n i s t d . h>, tien en los siguientes prototipos: tnt truncar*iconst char *patnnana, off_t iangthl; int ftruflcatednt '*d, d f j t lengtM Ambas llam adas perm iten acortar un archivo, especificado por au ru ta de ac ceso pathnam e o su descriptor fd , a la longitud le n g th , y am bas reto m an 0 si han tenido xico. Recurdese que m uchas de las llam adas a sistem a de E/S de archivos tienen dos formas, en este caso una ( t r n c a t e ) que acepta una cadena estn d ar term inada en un cero binario ( \0), y otra, ( f t r n c a t e ) , que acepta u n descriptor de archivo en lugar de una ru ta de acceso. Si tiene lugar un error, las dos llam adas reto m an I y asignan un valor adecuado a e r r n o . Si se emplea f t r n c a t e , el archivo debe de ser abierto para escritura. Para qu podra una desear acortar un archivo utilizando -ana de estas llam a das? Una razn tpica es para suprim ir datos innecesarios del nal de un archivo preservando al mismo tiempo el resto del mismo. Trancar un archivo a la longi tud deseada es mucho ms sencillo que crear un nuevo archivo, leerlos datos que se quieren preservar del archivo viejo, escribirlos al archivo nuevo y luego elimi n ar el archivo viejo. Una nica llam ada a trncate o a ftruncate reemplaza a por lo menos cuatro am adas sucesivas, a saben Open, re a d , w r i t e y j n l i n k .

Captulo 7: Administracin bsica de archivos en Unux

147

E je m p lo

C JtM P lO

El program a tru n c a r que viene a continuacin es una utilidad que resulta prctica p a ra aco rtar archivos. Acepta el nom bre do! archivo a s e r acortado seguido de la nueva longitud que se desea asignarle.
/ x c flS 'i c e i ir-c u y o n n t;rr.* t: t r v c . c

/*
tru n c a r.c A c a t a r un arch ivo a la lo n g itu d ta c a d a S in ta x is : truncar

-w_a^ivo, longtuC / toe la* ttdi5.


in c iv le stdluo.ft *;nclue# <unuta.?i* sjcluc < c n tl.r> r E -* . a in (), argc in fo raa *1 nu*aro 5 irgua<nt03 xngr*acos I ac la ISAt S4 tcoanoc3. n itn tra qua **rgv es un our.:ero cufl / ivA a ia : orige-. # r> oor:a ce seos / in : a a lr ( ir . f ir^ c, cftar rgvi

{ loftg longitud;
i'j a 'c : 3) r i.*gc cuanta lo* a r g e n t o da la U n ca u CN/SO; #1 p ry w ro ta *1 o rcoio noar* <Jal archivo *

mttcxrT_*A!uu*E>;
lo o g itv d (lc o 5 i i t r t o l a r 3Y l 21 , W U , t<); ir(tru R C 4 t ( rg v (lJ, io r g it ^ J ) { p c r r w C in m o ta * ) ;

xi'.texir WILW); } a*t(XrT_SyCCSS); > La ejecucin de este program a sobre un archivo llamado t e s t . t x t del di rectorio corriente produjo ios siguientes resultadas:
S is -1 t e s r .t x t - r - r r - 5t ru cc t c a t . t x t 22C S iS -1 t i t . t x t r r -

1 urr_* 2i l

u S * ri

5656!J u l 2-i55:56 t a s t . t x t

\ ^ . \ r
____

5 A lio *

! *wrt_ail

ase rs

2-300 J u l 24

15:53

te 3 t.tx t

Luego de comprobar que se ic- tra n sn n e ro n efectivamente des argum entos, t r u n c utiliza la fundn s t r t o l p ara convertir el texto del argum ento que espeeea. la n ueva longitud de- la caden a a -on entero de tipo lo n g . Despus lla m a a " " u n c a te con el nombre -de archivo que le fue tra n sferido 7 la nueva longitud requerida. 3: la llam ada a t r n c a t e fracasa, el programa imprime ur. m ensaje de error y termina. Si tiene xito, la ejecucin del mismo term ina sin em itir ningn mensaje, retom ando el valor cero al sistem a operativo. Aunque fu n d e nal. ei program a t~ u n c no es p a ra n ad a lo suficientem ente robiisto como p ara ser totalm ente confiable, porque da por ser.tadu que los argum entos que re c b e son vlidos. L*n program a con la calidad suficiente

,/

/ .

>

>

>

148

Programacin en Linux

como p a ra em plearlo sin que genere so rp resas debera confirm ar prim ero que ei archivo especificado existe y que el nom bre e archivo que se le ha transferido es u n nom bre vlido. Esos detalles fueron pasados por alto aqu por razones de brevedad.
O b te n c i n d e In fo rm a c i n d e a rc h iv o s

Ahora el lector puede abrir, cerrar, leer, escribir y tru n c a r archivos. Sin em bargo, tam bin se puede obtener m uellsim a informacin in teresa n te sobre un archivo, como lo m u estra el comando s t a t (1):

----------SA L,D A

.p e : flc g u la r = le Ucda: ( 0 $ 4 . ' - r w - r - r - ) U id : (Sa/KUrt_W 3il> Cc v c : 3 , 2 Inode: 53 4 555 U n ks: I A c c e s s: 3 3 t Wodty CTtang# J-j 2-t 1 6 :0 2 :5 0 S a t J u i 24 .6 : * :2 9 S a t Ju L 2< I6 :0 :Z 9

G d : | 1M / u s c r s ) tW 9(W M .0 0 :1 5 :5 6 1 19 9 9 W 3 3 0 .00: U : 5 7 l i g 9 9 !3 s 1 0 0 0 .M :U :l7 )

El comando S t a t lee informacin de u n a serie de nodos de informacin de archivos denominado? cada uno < 1 * ! ellos inode o nodo-i. y se la exhibe al usuario. Aunque loa detalles especficos exceden el alcance do esto libro, loinodes son e stru c tu ra s do datos que el kuml m antiene p a ra cada archivo p resente en un filesystem . E n tre o tras cosas, los mismos contienen inform a cin tal como el nombro. 1 tam ao y el propietario de un archivo, la fecha y hora en quo fue cambiado el inode, accedido y modificado el archivo, su tipo y :untoa vinculo simblicos existon hacia el. El comando s t a t del ejemplo lista todu esa informacin. Existen tre s funciono* p ara o b ten er esta informacin: s t a t (estadsticas). L s t a t y s t a t Pora utilizarlas, se debe incluir tan to <sya/atnt.h> como <un i s t d n> en ei cdigo fuente. Sus prototipos son los siguientes:
inr. it a t ( c e < is t ch n r M ln a n o . s t r u c t i m b u f) ; in t ' a t a t l w : f a , s t r u c t ic s t * 0 u f>; in t U t a t fc o r .* ? cn ar filan d .rm , s t r u c t s t a t * 0 u ft;

Todas las funciones s t a t colocan er. b u f ia informacin obtenida del archivo especificado por filcnam e o el descrip to r de archivo 1 d. Si so ejecutan con xito, retornan 0, y si ocurre un orror reto rn an 1 y asignan el cdigo ad e cuado e r r n o . Lu nica diferencia prctica en tre ellas es que l s t a t no si guen los vnculos simblicos, en tan to que s t a t y f s t 3 t s i lo hacen La es tru c tu ra de patr n s t a t est definida como sigue: struct stat {
aev_t s t jJa v ; :n o _ t J t _ i n o ; w > a a _ t ic_nc-cJ; a lir .k ^ : s t j U i n k , V* d i s p a s i u v o r 'I / / nu.noro a a in o o o

wcJO t fa l a rcnivo / p r o p ie t a r io

/ lu n e r o d e m e o s Ju ro s /

jd_t s t_ u ld ;
5 ic _ t s t j i o ;

/ UID aei

col

a r c n iv o

attv_z s~

"d e v;

/* jIO a e l p r o p ie t a r io a e l ) u p o ce C i s o a s i t i v c ! I ' ta a ra t o t a l sn b y tes

a r c n iv o " f

s t _ s iz 5 ;

'

) 149

Cap'v-.o T : Administracin bsica de archivos en Unux

o<^ 5 t _ 6 1 k s i2 ;

t w a flo i e a lo c u a p r e fe r id o */

jrsi;*e: lo.-;
:
ik

oueero * fifia
/'
c*e

/ .

i e blesues oe S12 sytes V 5 * 1 u I t in o acceso c e ! a r c h iv o /

:ice_t 3t i : i s ; :i=5_: st_ sti e;

n z " i r-ora a la uLtiaa rcdificacior del arcnivo */ fscna / -.era -e i u i t t c cmcio del cor.-enico ce i ir.&ae

El miembro s t _ 3 l k s i z e inform a el tam ao preferido de bloque p a ra la E/S del filesystem . Si se u tilizaran bloque m s pequeos podran ten er lugar operacaor.es de E/S de dxsco que fu eran ineficientes. La. ltim a fecha y hora de acceso, a t iras. es modificada p o r as llam adas a mknod, utim e, read, w ri te y tr n cate. Las llam adas a mknod, u tim e y w r i t e tam bin cam bian la ltim a fecha de modificacin, d enom inada m tim e. La tim o , la fecha y hora del ltim o cambio, alm acena la ltim a fecha y hora en que fue modificado el contenido dei inode. incluyendo propietario, grupo, cantidad de vnculos c in formacin de modo de archivo. M ediante la informacin contenida en la e stru c tu ra S t a t uno puedo imple* m eo tar su propia Puncin s t a t , como lo m u estra el program a do d em o stra cin de la prxim a seccin. Ei lector puede tam bin em plear v a n o s macros que le perm iten obtener in formacin adicional sobre el modo d el archivo. El e st n d a r POSDC defino siete m acros que decodifican un modo do archivo p ara deducir au tipo. Loa mismos e st n listados en la tablo 7,5. Tabla 7.5. Macros para comprobacin de tipo de archivo.____________________
Macro________________ Descripcin

S_ISLNX(eo<J) !>wna verdadero ni el archivo es un incuso simblico S ISRG(od > Retcma vwrtfadoro si Iarchivo s un archivo normol S_!SOIR|node> Retorna verdadero si elarehrvo es un directorio S_ISCHR i oode y Retoma verdadero si el arch.vo es un disoositivo de cara S_IS3i.K(*o<2e) Rotorna verdado/o si el archivo es un dtsoositivo de bloq S ISFIFO(soae) Retoma verdadero si el archivo es una PIFO S_ISSSOCK(noae) Retoma verdadero si el archivo es un socket P ara u tilizar estos macros 3e les debe tra n sferir a los macros de la ta b la el miembro st_ m o d de la e stru c tu ra de patr n s t a t como su argum ento mode. Ei siguiente program a de dem ostracin d u stra su empleo.

Ejem plo
P ara correr este program a, tran sfi ra le el nom bre del archivo que sea de su nteres.
/ oDcre c e : p r c g r s s i en I n t e r n e t : n s : i t . c /

r
n c r z s _ c e _ x c 3 .c - ""C-;r=na s e n c illo ce s*a*<l). S in ta x is : uacras_de_Mdo

I
in sio c* a sista .a >

Programacin en Linux

Syiclude <sy5/sta:.h>
< *t< Jlib .h > fin c lu M < *t!lio .h >

int aaifl(UU argc, cnar argv)

i
s tm ct Jta t bu; nose_t todo; char ncc_d?_3rchivo{30;; if(u rg c 1= 2) { /* argc Cuenta Los argunentos Ot la lnea de cc*ando; el armero m propio noubr del archivo o u t i(auooo oe zw ito: nstat Mowae oe aachivO '); *lt|BT_FAILUR8);

)
l f ( ( l t a t ( a r g v m , S u f)) < 0> { e a r r o r c i a t a f ); xit(EX:r_FAlLUR);

}
nodo bu? .atjrode; s n r :f { AflO*lVO; Vj\ti*, a rg v M l a r :n :? r INCOE: vj\n*, o<if.at_noj; print^l* OISPOSIT .VC: Sd,*l\n*, tiajor(buf. j j i e v ) , nmoriauf .t_dev||; g r tf ltf C CCO: M o \n ', buf .st.aode A -(S .IF M T ));

p r in tf [* ViNOiOS: VJ\n*, b u f . t j i lw k K prtntfl* Uto: VS\n*. #ir.4t_ui0) p r in t r e oro: kj\i \ c u rs t_ g id | ; HtS_ISLVic<nocc)) rtrc p y{ tipo_de_arcnivo, 'VincuLo s u ib o lic o 'l; olse f(S_ISnE<3|itodoS) itrcpy{tipo_de_arcn:vo, *.\rcn:vo norjial*); ene i*<SJ50lfl{fK>0C!) 5trcpy(tipo_d9_ar:nivo1 'D ire c to rio * I; sisa i(S_lSCh/l{nodol | strcpy(tit>o_<i9jjrchivo, 'D ispositivo de caracteres*);
* l i lf(S_:SQ L.<(n o coi)

strcpy(:ipj3e_arcniva, 'Dispositivo ae bloques*|; alse L(S_ISPIFO(uodo)) s-rcay<t:co_de_archivd, *f : f o *|; else if(S_i3$0CXjnca)> s:rcpyst:po_de_arcnivo. Socket*);
3 S 8

strcpy{t:po_de_arcn:vo, 'Tipo desconocido*]; arir.tf|*TXP0: "isin*, tipoj3e_arcM vo);

Cap?UO 7: Administracin bsica de archivos en Linux

151

S r ir t 'C T A i a C CS BLOQUE: VJ'.n*. 5 v * .S _ 0 l* S iZ e ); o r i n t f CSLOOeS: * 3 \n \ c u f it_2 i-5 C '.s }; :>ritf(M C C & SO G : % s \ c t it 9 ( i b u f . S j l t i n e ) );

D -:n t'r* :F C 0 : * s \ :tw ( < jr.ftja tl t|);


a r in t ? !* i,C C : GCIfrCAOO: Vs*. c :iJ i8 (s a u f .s t _ c t i8 e H ; M :< B H 7 _ & iCC$S};

} La salida de u n a co m d a de prueba de e ste program a os la siguiente: i .:t>*c^_2_so3 A A C W flfO : ItLnlli 2574* DISPO SITIVO : 3.1
W XQ: J? 5 S

vuem as! i io: e 313: a


TOO: A rcn ivo normal

TJJW iO: 5* :iWiO D 9.COJC: &.COU6S: 108


ACC0:0C: Sa t J a l J 4 1 6 : 1 8 15 tW fl

UCO.'FrOCC. Tt* Mr 23 '9:34:26 :9 :ve MlfrCAOO: Jui V 16:22:29 1999 El cdigo a n te rio r resu lta b asta n te rido, lo adm itim os, pero sirve p ara ilu s tr a r cmo u tilizar la fam ilia de funciones s t a t D espus do hacer que l s t a t recorra e archivo p a ra recoger inform acin, el program a exhibe el valor asignado a cada miembro de la e stru c tu ra de patrn s t a t Cuando le llega el turco a exhibir el tipo de archivo, el program a realiza un considerable despliegue p ara convertir un numero ininteligible en u n a forma que tenga significado, da ah el bloque i f . . . e l s e (que debera on realidad h ab er sido confinada a una fundn), m stat utiliz la constante S_IFMT, m ostrada en la :abla 7 1, p a ra dejar tu era los bits dei tipo de archivo correspondiente al mo do de archivo, e modo que el modo de archivo exhibido contenga slo los bits correspondientes a les perm isos y a Ja m odalidad de ejecucin. El cdigo u tiliza tam bin la funcin c r i n e p ara convertir los valores de a i i r . o t i ~ e y c t i n e en una cadena q u e los u suarios puedan com prender fcilm ente. Como en el caso anterior, e ste program a necesitara ser refinado pero sirve p ara poder apreciar lo que res u lta posible hacer y sirve de ad e cuado punto de p a ra d a p a ra la confeccin de un program a m s elaborado. E n particular, se podran agregar porciones de cdigo p ara verificar que el nom bre de archivo ingresado sea un nom bre vlido.
M o d if ic a c i n d e la s c a r a c t e r s t ic a s d e u n a rc h iv o

En esta p arte le captulo, ei lector e n co n trar u n a sera de funciones que modifican la informacin dei inode. M uchas de esas ru tin a s riener. contra partes que son com andos de Linux. Esto-s comandos se distribuyen h a b itu a l

.1

152

Programacin en Linux

m ente como p arl del p aquete f i i e u t i l s e GNU, que es e st n d a r en casi todos los sistem as Linux actualm ente en circulacin.
MODIFICACIN DE LOS PERMISOS DE ACCESO

Las llamadas a sistem a chmod y fchmod cambian los permisos de acceso ce un archivo, siempre y atando, por supuesto, la UID y la GID dei proceso que ercu ia !iamada posean los derechos correspondientes. Slo el usuario root y el propie tario del archivo pueden modificar los permisos de acceso de un archivo, cfvncti y ?ChOd se hallan prototipadas en < u n i s t d . h> de la siguiente manera mt crrsdfconst char 'catnnie, nt3e_* nodC lu fctwad(mt fd, nodtj: nc3B); E stas ru tin as tra ta n de modificar los perm isos de acceso al archivo especifi cado y a sea por la cadeua term inada en un cero binario \0> que se indica en pathnam e o por el descriptor de archivo fd , respectivam ente. Si la ten tativ a tiene xito, am b as funciones retornan 0 Si fracasan, retornan -1 y asignan el valor adecuado a errno. P a ra utilizur estas funciones 9e debe incluir tanto < s y s / t y p e s .h > como < s y s / s t a t . h> en el cdigo fuente del program a.
E je m p lo

Er. este program a :io eren un archivo vaco con un conjunto de perm isos y luego 3e utiliza f chmod part m odificar dichos permisos. r sonore del archivo *n Int*rnt; cfignod.c r
r o la r _ p e r r u io j.c - Cro# un rcHivo v Iuoqo n o d tfic a su p tn m o a de accoso

I
tnclud* <dl:t.n> nclude <a'dio..i> *ir.ciud* < i y s jt a t .h >

finclude <*//typaa.n>
w c lu fle <fcntl.h> Lnt aain (ve id )

(
d e _ t noca 0 755; in t 2 8 s c r ia :o r _ a r c r .iv o ;

I ' Crear 1 arenivo i f (!deacriptor_arciuvo - opea{'archivo,vacio*, 0J5RGAT, perron *0330*1; exie<EXIT_FAIUIftE|;

< o;

) r Correr 5 oars este archiva reeiep creaoa !


3 y s a ( * l s - i archivo.vacio*};

o d tfic a r su- ca.-nisos /

i ; : fe n o e d d a scrip to r.a rch iv o . ncdoj) < ?) (


p e rro rrfc h n o d * |;

Cap'T J.c 7: Administracin bsica de archivos en Linux

153

*C(EXl7_FAllR|;

'

>
* Zcr-^r i s W t M t 'i s : o r i o s p e ro is c -s y a s o c i f i c t c o s */ - i i r c i i v o . / a c i Q ') ;

*1? CEXI~_3UCCS3), > La salid a de este program a ser sim ila r a la siguiente:
S ./ CS S C 13 _ 3 r* li5 0 3

.
^ .

r w -

r . .

t k-j*t_all * ijr;_ * a li

u s flr s u sarj

8 J u l 24 2 0 :< 7 j j u l 24 2 3 :4 7 o f / . f i l i

M C ty .f ll* ' i r - * - . *

Se puede v er claram ente que el archivo tiene un conjunto de perm isos in m e diatam ente despus de su creacin, y otro conjunto despus de la llam ad a a f c ^ r o d . D espus de h ab er sido creado este archivo, c a m b ia r ^ p e r m is o s emplea la funcin s y s ts m para ex h ib ir los perm isos del archivo ejecutando el comando de Linux 1$ i . llam a a f enraod p ara modificarlos y luego u tili za otra llam ada a la funcin s y s te m p ara exhibir ioa archivos modificados.
REASIG N AR O N DE LA PR0P1EDA0 OE UNA ARCHIVO

R easignar la propiedad de un archivo es sim ilar a modificar sus perm isos d<* acceso. Las funciones chown y feh o w n son las que se encargan de e sta ta rea Las m ism as se en cuentran protetipadaa en < u n i s t d . h> de la siguiente m anera:
t-n: c r - ^ t c o r * : ; n j r *3 :n n * M . u if l_ t amrtr, g i( j_ t g r o p ) ; i n t c 'c * n ( l f i t *C. c c r. gi<S_t g r w o i ;

E stas dos llam adas modifican el p ropietario y el grupo del archivo especifi cado en p a th n a n e por la cadena te rm in a d a en un cero binario (\0 ) o por el descriptor dei archivo fd a los nuevos valores ow ner y g ro u p , respectiva* mente. Lo mismo que el resto de las funciones discutidas en este captulo, estos dos re to m an 0 si tienen xito; 3i fracasan, reto m an - 1 y asignan a e r r n o el valor adecuado. La decisin e n tre u tiliz a r chown o fChown d e p e n de de varios factores Si uno conoce el nom bre del archivo, probablem ente desear u tiliz a r chcw n. Si se h a abierto o creado el archivo utilizando o p en o c r e a t , que re to m a n descriptores d e archivos, q u i 2 se prefiera u tilizar f cnown porque se conoce ol d escrip to r del archivo. Si se conoce tan to el nombre del archivo como su descriptor, da lo mismo utilizar cualquiera de laa dos funciones. En esa situacin yo p referira u tilizar f chown porque re quiere m enor can tid ad de tipeo.
E je m p lo

L0

El siguiente program a crea un archivo y luego modifica su propietario. Ob srvese que p a ra que el program a funcione correctam ente, debe 3er corrido por ei usuario root. Adems, se d eb en reem p lazar los valores asignados er. el cdigo fuente a i propietario y al grupo por valores que tengan sentido p a ra

'

154

Programacin en Linux

el sistem a donde el program a se vaya a corror. La m anera m s sencilla do lograr tai cosa es utilizar el comando id p ara obtener su LID y su GID. y luego introducir esos valores en el cdigo fuente. ! nocftrt col prograna < n [n-.^rnet: chgoon.c */ r
c3oour_orooitario.c - Crea un rcftlvo y itodifica $o propietario y ;ruoo

V
Wcioae #tflcluc* Liciufl #lndufl toclutfe <3tli0.^> <3MiO.!>> <syi/tat.n> <3y#/typ9.n> fc n ti.h

tnt nain(v6t<J) (
uld_t prooletario 56# g:a_t grupo too; tnt d*jcriptor_archivo;

I ' Crar l archivo / if|< a e jm p to rjre fU vo opon<'nuevo.archivo , 0_CRAT. a44)) < ti ( perrorC op en'); extt{CX(T_FAtLlH6) ) ' Correr Is sara este archivo rucian croado */ s y s t n C l 1 nuevo.archivo'1 ; / C ia c ia r su p ro p ie ta rio y grupo / ifi(fc h o r(3 8 5 c rip :o r_ < arcni.vo1 p ro p ie ta rio , grupo|| < *) { parrarCfcMBoo);
#*ir(EXI7_fAILUflEI;

>
/ Correr ls oe nuevo con e l ppcpietano y grupo ya nodificaoo / system|*is 1 nuBvo.archivo*); xit(cXIT_SUCCSS);

} SI resultado de u n a corrida de p rueba del program a fue e! siguiente:


5 su P M o n J : s ./cnsiar_propietario - r - r - - p nuevo. archivo - r f c nuevo.archivo i exi: i raat 1 ku rt * a ll ro o t users 0 J u l 24 2t : n 3 j u l 24 21:11

Como se puede apreciar, el program a prim ero cre el archivo. n la corrida do demostracin, prim ero utilic el comando su p ara convertirm e en superu* suario. de modo que el archivo fuera creado con propiedad del u su ario root y

Caer'!-o 7: Administracin bsica do archivos en Unux

155

del grupo root, respectivam ente. La funcin f chown modifica luego ta n to el propietario como el grupo a los valores especificados como argum entes, 500 y *3 0 , que en mi sistem a corresponden s k u r t _ w a l l y usuarios, en lbrma respectiva. E l segundo comando i s confirm a que la propiedad de i archivo fue m odificada con xito.

Lo que viene
En este capitulo, el lector aprendi considerablem ente sobre cmo tra b a ja r con las llam adas bsicas de manejo de archivos en Linux. El prximo c a p tu lo extiende este tratam ien to do la adm inistracin do archivos cubriendo m a terial m is avanzado sobre tem as talos como el filesystcm ext2, muHplexing. E/S non-bloquaante. archivos m apeados en m em oria y bloquoo do archivos y registros. Esto com pletar la discusin do la interfaz de Linux para m anejo do archivos, que lo p ro p a ra rl p ara a p re n d e r sobre u n a API de baso do datos y sobro m em oria compartida.

8
Administracin avanzada de archivos en Linux
E ste capitulo contina coa el trata m ien to de la interfaz de adm inistracin de archivos en Linux que comenz n el anterior, pero cubre caractersticas m s avanzadas.
E ste c ap itu lo c u b re lo sig u ie n te s usm as:

M anipulacin de la fecha y h o ra con que se guard ol archivo ln ltim a

Vt
P resta c o n e s del tnesystem ext2 de Linux M ultiplexm g de E/S E/S de a lta velocidad por medio de archivos mapeado wn mem oria Bloqueo y desbloqueo de archivos Todos loa program as de este capitulo pueden ser encontrados on ol sitio VVeb n ttp ://v % w .* c p .c c (B /in fo bajo e l nm ero de ISBN 0789722151

Programacin en Unux

Modificacin de la fecha y hora de creacin y edicin de un archivo


Recuntase del captulo 7, Administracin bsica de archivos en Linux, que el kem el contiene tres registros de hora y fecha por cada archivo: gu ltim a fe cha y hora de acceso ( a t ime), su ltim a fecha y hora de modificacin (n tin e ). y la ltim a fecha y hora de modificacin del mode (ctim e ). La norm a P O S K provee la ru tin a u tim e que perm ite modificar la a tim e y la mtime. N*o existe interfaz de programacin a nivel de usuario p ara modificar C t :me, pero las funciones para modificar a t i n e o intime hacen cam biar tam bin a c tim e , de modo que dicha circunstancia no representa ningn inconveniente. La funcin u t l ^ e e st prototipadu en < u tim . h> de la '.iffuiente m anera: int utr(cons: :nar MthnBn.?, struc: utiRuf bu*); Tal vez lo sea necesario incluir el archivo de encabezado < s y s / t y p e s . h> por que el mismo contiene lo t.ipon de dato del nigtema primitivo definidos por PO S K . Loa vorsionea anteriores de g ee y Linux no siem pre incluan < s y s / t y p e s . h> on < u tim o . h>, de modo que si u compilador produce men sajes de error aludiendo a variables no definida cuando compila 3US progra mas. aada ei archivo de encabezado < s y s / t y p o s . h> en su cdigo fuente, pe ro :ilo ai verifica previam ente que el mismo declara el tipo de datos cuya definicin no encuentra ou compilador, u tim e modifica la fecha y hora de ac ceso y modificacin del archivo especificado en pathnair.e a los valore* a c t i me y m ootim o. respectivamente, que se encuentran almacenados en bu? Si b u f es NULL, la a c tim e y la modt Lm son puestas a la fecha y hora que m a r ca su sistem a Como de costumbre, U tim e retom u 0 si tiene xito. Si encuen tra algn problema, reto m a - t y asigna a e rm o e l valor adecuado. Por su puesto, el proceso que llame a u tim e debe contar con el correspondiente acceso ai archivo o debe e star ejecutndose con privilegios de usuario root. La estru ctu ra u tim b u f est definida como sigue: struct uuaouf { t:ne_: ctia; / access Une tira_t nc-dtine, / nadiicanwi tina */ ti.T ie_t es un tipo estn d ar de POSE, generalm ente un entero de tipo io n g , que alm acena el nm ero de segundos transcurridos desde el inicio de la E ra <poch). La E ra. a su vez, est definida en POSIX como el p a r fecha/hora Enero 1. 1970 a ias 00:00:00 UTC (Universal Coordinaied m e u Hora Coordinada U niversal, la que antes e ra conocida como Greenwich Mean Ti m e u H ora M edia del m eridiano de Greenwich).
NOTA
C o rre a c o ta ci n r .t e r e s a n t e . p orq u e m u c r e s c e a s fu o c io '-e s r e la c io n a d a s co--> fe c h a s

y o ra s Linux e s t n b a s a d a s an el coacto, el m uy puoi citado p ro b le m a d e la compatiDii - a d c o n el arto 7GOO 'O -ta s ic o u n gran p ro fc e m a para Linux zv-dvsd co n lo a u e se r ei a o 2 C 3 S . D ad o q u e t l m e ^ r e s jr . e n te ro d a rlpo io n g. ei m iam o d e s b o r d a r en
el arto 2 C 3 8 . O & ea. t i n c _ t p u c o s a lm a c e n a r h a s t a 2 3 1 - 1 s e g a d o s , o s e a 2 l7.ua3.fr:7 s e g u - o o s . ? ss?.-vd a p o r alto el d a adicion al c o rre s c c ri o n tc a lo s a o s

Captulo 3: Administracin avanzada de archivos en Unux

159

<5Jestos. en C 9 -3 arto ftsy 3c5x2x5Cw60. o sea 31.53S.COO. segundos As' que t i - 0 _ t n^0O3 aJmecery mximo do yrn&taor de 63 aos 2.147 483.547 / 3 1 536.000 . Co<no ? '= ' W i n r a n i*o 1970. mndale 63 aros 3t nt:&-rrci 30 3 1-.-3 3 ) .-^0' 2038-1-3 C ecra y hora exacta en 13 aue seo-dar varia, doo<^s .i^ vo Je cuntos segados existan en cata ao bisiesto.

E je m p lo

El siguiente program a crea un archivo y establece sus valores a tim e y m t i i e a septiem bre 3. 2001 Por ra=on<?s dy brevedad se ha omitido del cdigo fuente la verificacin de errores. r Kcwrt u'u a ^ 'a * ir ntacret: emjtu< = V
c*tfiLar_f*cy?fli*i- - Utilizacin c la rutina uting 1

irc i u y s /^ i.K incluir <jy i:! ft>


l* ijd

uxlw a <wni.ta.ft> vtncluM <ttslis.n> induce cr.ti.n>


ni

um irttct Ahora * 'MN1JM, n ru e t ^tL2<xr ouf; in\ 3*icriptsf_ir<hlo; ^jf-sctia* = <*>;


Daf.ncctiac 1 no;

Scri;tc.-.srcnivo = 0Mn( feo-oar*. 0_CSEAT, $4<;i; yriMi'fo-s.Mi". eo ); cicii'.c=scrip :r_arcfttOf: ix ii (E*!T_$2CSS}; } L'u listado del directorio corriente desp u s de haber com do este program a m o strar lo siguiente: S is -i roo.bar r *- c - - r xurt_aall uii*s 0 Sa? 3 21 fco.oar Como se puede apreciar, f 0 0 . b a r exhibe la fecha S eptS fiiber 8 , 206 \ . Despus de asignarles a los miembros a c tiz n e y rcoOTime de la estru c tu ra e l valor '<.3 S 3 .0 S 2 .3 C 0 que corresponde ai 3 de septiem bre de 2001 a cierra hora, m inuto y segundo), c ig tim e abre e: archivo, luego llam a 'a u t i a e p a ra que acte sobre =i mi^mo. transfirindole lu direccin de la es truct u r a nc<cada y el nombre del archivo. E sto ocasiona que sean m odi-

J 160

Programacin en Linux

cadas t a ltim a fecha y hora de acceso y ta ltim a fecha y hora de modifica cin (a c tim e y m odtim e, respectivam ente) al valor especificado (y ltam enLe im probable p ara u n sistem a cuya fecha y h o ra estn bien configuradas

Caractersticas del filesystem ext2


El filesystem ext'2 e perm ite al program ador establecer en los archivos has* ta cu atro atrib u to s especiales: Immutcible (No modicable) - e X T 2 _ I M M U T A 8 L 6 _ F L Append-only (Slo p a ra ag reg ar datos a l final) - E X T 2 _ A P ? E N D _ ? L X o-dum p (No volcable) - E X T 2 _ N 0 D U M P _ F L Sync (Sincrnico) - 6 X T 2 _ S Y N C _ F L Slo el usuario root puede establecer o elim inar los indicadores tm m uta b ie y append'only, pero el propietario del archivo puede activar o d esactivar los indicadoroK no-dum p yaync. Qu significan los miamos? Los prrafo;? s i guientes los describen en detalle: Los archivos con el atrib u to im m utable activado no pueden ser modifica dos en ninguna circunstancia: Uno les puede agregar datos, elim inarlos o renom brarlos, o a a d ir vnculos hacia los. Ni siquiera el supe ru s u an o puedo hacer eso; primoro se debe desactivar ol indicador de im m utable 9 Los archivos que tienen activado el atribut appcnd-ordy pueden ser escnto> slu en modo cppcnd y no pueden ser eliminados, renombrados o vinculados El .itributo no-dum p haco que el comando dump, utilizado habitualm ente p ara croar copias de seguridad, ignore el archivo. El atributo sync hoce qin* el archivo sea escrito sincrnicam ente; es de cir, todas las operaciones de e sc ritu ra al archivo deben com pltam e a n tes do ro tn m a r al proceso que efectu la llam ad a (esto es idntico a lla m ar a op8n con la opcin 0_SYNG). Para qu utilizar estos tributos? H acer que un archivo sea im mutable c u ta que sea accidentalmente (o deliL'oradamente) borrado o modificado, de modo qu<representa una prdctiea medida de seguridad para archivos crticia. El indicador append-unly preserva el contenido corriente dol archivo pero contina perm itien do que se le agreguen datos; de nuevo, una prctica precaucin de seguridad. El indicador no-dum p es sim plem ente un recurso conveniente que le ahorra* r una valiosa can tid ad do tiempo y espacio en disco cuando haga la capia de seguridad de u n sistem a. El indicador sy/ie, finalm ente, resulto, en especial, prctico p a ra g a ra n tiz a r quo los archivos crticos, tales como las bases de d a tes, sea n realm ente escritas cuando se lo solicite. El empleo de la opcin ync evita prdidas de datos si un sistem a se cae an tes de que los dato s p re sentes en un cache de m em oria sean fsicam ente escritos a! disco. El aspecto negativo del indicador de sincronismo, sin em bargo, es que puede h acer ir m s despacio, significativam ente, ei desem peo de un program a. Para obtener o establecer estos atrib u to s se deber u tilizar la llam ad a a L o c ti I/O control o control de E/S). d eclarada en < s y $ /iO C tl.h > . S u pro totipo es el siguiente:
:nt r c c t if in t fa, in t rsquest, voia -ar-gj;

>

) y

i )

Cap-'tuio S: Administracin avanzada de archivos en Unux

161

La atrib u to s estn definidos en < li.n u x / e x t 2 _ f S . h>. P ara o btener Tos a tr i butos ext'2 del archivo especificado por el descriptor de archivo f d 'e q u e s t debe se r p u e sta a EXT2- I0C_GETFLAGS. y p a ra establecerlos lo debe ser a EXT2 I0C_5E7FLAGS. E n cu alq u iera de loa dos casos. *G alm acena les indi cadores que estn siendo m anipulados. P R E C A U C I N
5 mate**'' C esta sccz-rr es svrvjmcrct: s;of5co a) Slssyster. pnrcpai oe Unux. C2. cctocoo mente ;orro '^syster- ce Segjnda Extensin. Otras eoicnes de .v a t*-or ta ~ i n as S n c c -e s y estructuras Q u e varrea a correcta', psro leguramente no te v y. s cemootar de '-a manea que se Escrito aqu Si usted utiliza t a s 3r-_=C33 en un programa serpeo zsrz ser rte&e. cece rodanos con # if 3 9 f3 aarg su tfco co^-cmj y coenj 3OCiOCameir.0 en 3*3trras cue ro sean Unux.

E je m p lo

El program a de dem ostracin que v-.ene a continuacin activa los atributos sync y no-dum p p ara el archivo tra n sie n d o como su nico argum ento.
V c -f

U'. c o r s a s n I n t t m t t : j * t 9x : 2 .c */

/
t c t ; v * r _ , t 2 . c - * c t u i 1 3 1 t r d i : * c c r s o v c la U * a r o n a t o o- x*,2

V tn clu ct

tircl-jc* oja::c.n> *:ncl.<3 < t c l i 0 .ft


l w i . i l < ltli.> fl'K lv ec cn?l.i*>

laclad# < sy s/ia c tl.h >

UK M lfl|tflt ^ . cftr *>rgv[!l

( rt S6SCPio:cr_irc'ivo; L m $ irtdic*o.*u. S: U . I uc 5 yicarret. enniCir U sintaxis Mecuaaa / l t a l e : 2) ( ;u ts iiiC C OD iP .SG. activar_*t2 {nondra la archivo}'); lt( EXIT_PAIUJftJ , }
i | ( f c * cp e n (a r 5v ( i j , C_30C*fc.Y)) < 0 ) {

162

Programacin en Linux

xit(x:r_fA iujR E );

>
Estes n los indicadores quo actlvnrenos

maleadores = =XT2_5YNC_f:'- ; EXT2_00W_F.; ; c a va r I 0 3 indicadores. peno- toisaje do error s i ^alla / I f d o c t ii d , eXT2 _tOC_serr^GS, A in m c a c o m )) ( M rro r| la o tI *)5 clos(tftscriDtor_urcriivc):

iM io a u w o rn *

\ =xr2 _svc_a>

pu:*(td<M . 'Indicador JVK'C actlviido*}; iftindicadora A XT2..v 20(jup _ci.> a u t ij '^ d l id o r nO-CUMP activada*J;

c lo j# (d c r:p to r_ a rc M v o | ; x itlc X IT J U C C B S );

La salida de u n a corrida de dem ostracin de activar_oxt2 arroj el siguiente resultado:

TCO

salida

, ac:ivar_cxt2 roo D iM P ictivaoo


o - roo

Inctcaaor SYNG activado Indicador \0

i Is a ttr roa
. . . s - -

La sem ntica de la ru tin a l o c t i req u iere que el archivo que se va a modifi car esc abierto, de ah la llam ada a O pen. D espus de asig n ar los atributos XT2_SYNC_FL y EXT2_N0DUMP_FL a la variable in d i c a d o r e s , la llam ada 3 i c c t l tra ta de activarlos, asegurndose de c errar el archivo abierto si a llam ada falla. 1 ltim o bloque de cdigo confirm a que los atrib u to s req u e ri dos iayne y no-dum p) fueron efectivam ente establecidos. El comando i s a t t r utilizado en la corrida de dem ostracin vuelve a confirm ar esto.

Ca&'tuto S: Administracin avanzada de archivos en Linux

163

C O N S E JO
L-nus eos cofngrvjos. c f 'a t t r y 15 a T T r , Q^e estaolecen a Interrogar 'os atflbu.35 K ' i s Oo w?2 OUCUfcW eo esta secc-ir Res-omitarente. c h a t t r re cerrrurs a yno K t e e tr tos ".nutos Dedales. rr>ntr3s au I s a t t r r ib e 0 3 atributos ? K ?'3 *>t2 que estn activa*. 31 tos fcuOtera. E - 'a corr oa de demostracin 3sl DTOgrama arorior. (a S mayscula rtica cuc el atributo 0CT2_SYNC_Fl. (syC) ha s-do *s?vad3. y 3 t rrarOscuia nxiica <?je atrQuto xr2_f30UUP R . tmtsn na sido ocv*}Q. Ver man c n a t t r y !an I s a t t " para ootener"-n3 e:a7-es.

E S E E S directorios
Aunque los directoras son sim plem ente archivos que contienen u n a lista do .os archivos alm acenados en ellos, tienen unn interfaz aspecial de p rogram a cin para m anipularlos.
M o d if ic a c i n d e d ire c to rio s

La lia m a d A requerida p ara av erig u ar el directorio corriente de trnb^jo es g etcw d '.getM obtener, cwde cu rrtn t w orking dirretory). declarada en < u n i s td .h > Su prototipo es el siguiente: cnar g#:ec{cn*.- *cvf, t u i . t > u t|; g e tc w a copia a b u fia ru ta absoluta de acceso al directono co m en te Ha ru ta completa d w d e el diructono raz, cuya longitud es de s i z o bytes. Si b u f no es lo suficientem ente grande como p ara poder alm acenar la ru ta de acceso, g etcw d re to m a NULL y asigna a e r r n o e l valor EflANGE. Si llegase a ocurrirle eso. aum ente el tam ao de buf y vuelva a probar. Como altern ativ a, si en g etcw d se hace arb itrariam en te b u f igual NTJLL y se le asigna a S iz e un valor m enor que 0. g e tc w d em plear m al lo e p ara asignar dinm icam ente la suficiente m em oria p a ra b u f. S i el lector desea sacar partido de e sta va rian te debe recordar de liberar el buffer p a ra ev itar fgaa de mem oria P a ra m odificar el directorio co m en te, u tilice indistintam ente la ru tin a c h O ir o la f c b d i r . p rotodpadas en < u n i s t d . n > de la siguiente m anera int cftfltrfcoftt cnar *ps:n); Iflt fCftfltrCM a>; C ^ d ir hace que ei directorio corriente p ase a ser el que se encuentra expre sado en p a th (ru ta de acceso!, f c h d i r bace la mism a cosa, excepto que se le debe tran sfe rir u n descriptor f d de u n archivo de directorio abierto.
E je m p lo s

1 E l siguiente program a. d i r _ c o r r i e n t e . que reto m a el directorio co m e n te de trabajo, utiliza p ara ello g e tc w d , em pleando los dos mtodos re cin comentados, de asignacin de espacio de alm acenam iento p a ra poder alojar el nom bre de dicho directorio. 'o te rt es: prograw Jotrn-: cwd.C */ r
ir_ M r* iftW -e - io s ru e i nonors sel i r ct8 rio corrieate ae trasajo V

melad# mista.fc*
s io i -* <s:a:c.*>

164

Programacin en Linux

uvcliide <rno.h> 4 f L ie *MU0_SJF


in t n a in ( v o ill

{
c f j r O _*statico * nillociTAU-xv^QUF;; criar 'b u fjH Jlo * n u il;
tn t i i;

A ji^ n a - j m i c a n a m e e l b u ? ' r / L * TAMAriOJUf)) = MUU| \

- t 'i l - ( ( g 'c # 3 0 u f _ s s t a t i C 0 .

buf_Jttico* r-a llo c(D u _S tatlco , 1 * rAMAV3_8UF};

)
fe rin t?Jtcau t. VJ llaaacas a r o a ilc c W . L l|

prifltfn td O t,

* ! d ir n c t o r to

corrante as

M \n \ 8 u f_ ta u c o );

r P ra itlr qu getcwd aaign la niw o ru /


printf(*Nu*vantnt, l diractorlo corrlont# es a\n\ / 3* dD liBora'* tiuf_nulo pura prcvonlr una fuga da nMorta friiX jf_ n u lo );
-U t(E X tT JS u C C S S );

*1

) La salid a de este program a tieno a n aspecto sim ilar ni sigusonte:

s a l id

1 d lrs c o rlo corrlsnte as ,'<Jsraocai,'n**pr3lactS/lpe/0/jrc


*

N uvM nt, 1 directora corriento as /usn'iscali'naiipreiects.'.pe.-OS/irc

El lazo h i l e va increm entando continuam ente la mem oria asignada a O u ~ '_ e s ta tic o , en tram os equivalentes al prim er tam ao asignado, h a sta que g e tc w d retorne no-NULL. El segundo bloque de cdigo ilu stra el empleo del com portam iento alternativo de g e tc w d . Em pleando en g etcw d un tam ado (sise) de buffer de 1 y haciendo el propio buffcr igual a NULL, la llam ada a g etcw d seguir teniendo xito porque dinm icam ente hace que D u f_ n u lo sea lo suficientem ente grande como p a ra alojar la ru ta de acceso ai directo rio. Dado que tan to b u f _ e s t a t i c c como b u f_ n u lo son asignados del con junto de m em oria sin u tilizar (h ea p ), f r e s libera luego adecuadam ente los recursos utilizados por d i r _ c o r r i e n t s .

>

>

Cc t j c 5: Administracin avanzada de archivos en Linux

165

2. E s:e program a im ita al comando Cd de Linux.

' c iic ia -

cnarg* :a = ir d irs c c o r y

S in ta x is : cam u ar_dir

/
f in c lid unuttf.ft*

finelgflc <it9UD.B>
fifld o d t <T2O.H> in clw flt <ir-fto.->

iflt ML'iIir.t ar^c. erar V T 't l ) {f


i(c -.3:<*(argvf1]) < ) ( e#rro^(*chdir*j; 9 u t ( a : T _ f A ! u M i;

)
i y s : t n c is * i

<ttlx:r_SXCSS);

)
* jo o ia r 4 ir SWS*
**5 91n/ ooc/ */ Isg/ pro|cts/

trcl

tnp

3a 1 1 o a

* ;*o*;*uPt.tIl/proj#eM/ls/M/vc La salida de este program a sim plem ente d em u estra que la llam ada n c n d l r tuvo u to . O bsrvese que cuando el program a sale, uno sigue estando en ul directorio original. Esto se debe a q u e el program a se ejecuta en una sub-inte ra i. y u n cambio de directo n o s en una sub-interfaz no afecta al directorio corriente de la interfaz padre.
C r e a c i n y e lim in a c i n d e d ire c to rio s

A fortunadam ente, los nombres de la s funciones cised ad as p ara cre ar y eli m inar directorios son los mismos de los de =us respectivas co n trap artes de lnea e comandos: e irtd ir y n a d i r P a ra u tiliz a r m k d ir, incluye en su cdi go fuente tan to < f c n t l . h > como < u n i s r d .h > ; r m d ir requiere alo < u n i s td .rt>. Sus prototipos son, respectivam ente:
in t tw ir(c o < m cr.ir *pat*iraM, c<38_r K c e j; in ; f ir {c o n s t -'i*.- jatnnac*i;

166

Programacin en Unux

r K d ir tr a ta r de crear ei directorio especificado en p ath n am e con I0 5 per misos especificados en (TIOde que sean com patibles con las restricciones im puestas por la um ask. rm d ir elim ina ol directorio especificado en p a th n a me, que se debe de encontrar vacio. Ambas llam adas reto m an 0 si tienen xito o asignan u n valor adecuado a e r r n o y reto m an 1 ai fracasan.
E je m p lo s

l/ =X
ije w p u o

l El prim er program a orea un directorio cuyo nombre es transferido como nico argum ento del mismo,
*K>t5r * a e l a-ogrun a n ;n t r n * t : n u w d ir.c /

/*
n u t v o j l '- . c C r * i un d ir c !o r l& . S i1 Aj(1S: VjVO_filr 0 H b r9_d ir# et0 rl0

I
iocl'jde f-n i:d ..i>

inclu! <fcntl.n>

ln t B n m iin t a rg e . cn ar * r o v [ J )

ir< a k ir (jr g v [i;, 9?SSi) (

p trro rj'M d ir'l; #Xit(EXlT_FAlLUK>; )


*lt{6X[T_Sl>CC3S>;

Esto es un program u senclo. UtUiza perm isos e st n d a r (lectura/escr-tura/ejecucin p a ra el propietario del mismo y lectura/escritura p ara su grupo y todos los dem s usuarios), asignados por ol argum ento 0755 sobre el direc torio creado. Si la llam ada fracasa, el program a sencillam ente finaliza d es pus de im prim ir un m ensaje de error. Por lo dem s, no se efecta verifica cin de errores por razones de legibilidad del cdigo La salida del mismo, que se ve a continuacin, m u estra cmo funciona:
/5 ./nuevo a ir foo

\7V7SALIDA

s is -W
a ' t x r - x * x 2 k u r' a ll u $ rs 10 2 4 J u l 2 5 2 3 : * 6

?00

\ I/ 1 / f 3 )
/ =!

2. El siguiente program a elim ina el directorio cuyo nombre le es pasado como su ^ co argum ento.
r v in o re 25i sragraita i r interne t: d e ld ir . c */ e lir .m a r _ ijir .c - E iin ir.a ur. d ire c to r io

T I m T l l induce <cnist3. - >

Cactij'o 3: Administracin avanzada de archivos en nux

167

in c lu e fcn tl. in c lirit SttfliS.ft # lsc UjG <stoio.fi> i n t m a ita x ti^ c , c-ar rvL)

(
l f ( r * J i r ( ar ^ v J - ] ) ) (

9 * r n r i'r x s ir ');
m t< E * lT _ f A lU * );

> m tta r ja s ) ; ) E ste program a es a n m s simple que el dei ejemplo anterior. In ten ta elim i n a r el directorio especificado, finalizando ab ru p tam en te si fracasa. La lla m ada puede fracasar ci ol directorio no se encuentra vacio, si no existe o si ol ttsuar.o quo corr* ! program a carece de los suficientes permisos como p ara elim inar ese directorio
1 iliiiiu r d ito a

s a l id a

L is ta d o d e un d ire c to rio

L istar un directorio nignifica sim plem ente leer el contenido del respectivo archivo directorio. E! procedimiento bsico no C3 complicado: 1 A brir el correspondiente archivo de directorio utilizando o p e n d ir . 2. L*er su contenido empleando re a d d i r y, ta i vez, r e w in d d i r p a ra vol ver a pcsicionar el puntero al comienzo dei archivo si es que se lo ha ledo h a sta el final y se desea comenzar de nuevo. 3. C errar el archivo de directorio utilizando c i o s e d i r . Todas e sta s funciones estn declaradas en < d i r e n t . h> Sus prototipos son los y ^ u ien tcs: o :: ^iyir{cor^z cnar patrnuM );
st^uc? ic e r rsadairiO M '<3ir|; in t

rniroiriOl *3ir);

i n : lcseaiP'SIfi *-3ir);

o o e n d ir abre el directorio especificado en oathnafr.e {que es sim plem ente otro archivo m s, despus de todo), y retorna un puntero a una secuencia de caracteres fstreom DIB n caso de error, retorna NULL y asigna a e r r n o el v alo r correspondiente. El puntero a is secuencia de caracteres a p u n ta al co mienzo de la m ism a, c l o s a a i r , obviam ente, cierra e s ta secuencia d i r , y re-

, 168

>

>

>

'

Programacin en Linux

torna 0 si tuvo xito o -1 si tuvo lu g a r algn error, rewinddir re g resa & puntero a la secuencia de caracteres nuevam ente al principio de la m ism a. R etorna 0 si d en e xito o -1 si ocurre algn error. readdir es la que lleva a cabo la mayor parte de la determinacin del conteni do de un directorio. Retorna un puntero a una estru ctu ra d i r e n t que condene la siguiente en trad a de directorio de dir. C ads llam ada subsiguiente a r e a d dir sobrescribe la estructura de patrn dirent retornada con nuevos datos. Cuando alcanza el final de! archivo de directorio o en caso de que tenga lugar un error, readdir retorna NULL. P a ra obtener el nombre, utilice el miembro d i r e n t .d. ame[ ] , que retorna un puntero que seala el nombre del archivo. La estru c tu ra d i r e n t se encuentra definida en < d i r e n t . h> de la siguiente manera: 3t*uct tirtnt / datos atenidos < 3 e getdntaO y reacdlrf| / ( ltd_t d^lro; r nwero inod? oc la entrada ae directorio */ off_t /* distancia rolatlva <ofst) d- la entraoa ae airctorio V C^ai-_t d _ r li}f l; r longitud de esto registro /
ctn r a.n 4 n ('W^_LCO_'<CV0RE * 1 ) .

PRECAUCION $<3io mo <n loo ml*rrOnm intcftratfes <jc lo otfnrctorn d i r o n t , <}_r.aire[ J. or. potable (ei doclr. ata doflnkfc por el csttoJir POSIX com de ccnducM pfWoabie tooas to* stsrenvjs <iuo awton cbcna normo). Todos tos aomfts inorr*yos tjt/.n deAnkctos (xx i siatoira y deoeoMn cei mimo. OJ modo nun o o rtr w y/o ol too da <n*os quo cononon pooco .annr oc .n itcm a i o>ro. Algunos 'llosyKems. pa* eftmpo, on '.'mitn los nonhrtv. de .v c v a a 14 carachos, menlras une oros. co>vo Lnux. potmtten hata 2S6 coractcroo

E je m p lo

El g u en te programn, l i s t a r _ d i r , listu el contenido del directorio cuyo nombre le os tra n sie n d o en a lnea de comandos:
C U M PLO

/ .Honor cnl pro^rana on Jntornot: ll s t d i r .c /

r
lls ta r^ d ir.c - le* un arcnivo 3 dire cto rio . directorio include <stdlo.h>
incli/Ue < 5 * d lib .n >

Sintaxis: l u t a r d ir notnj

inciudo <airflt.n> voia ia lir_ ji_ ir r o r(c h a r *nnnsa]eJ; ;nt oain (it arge. cfar argvJI)

(
o.'fl *dir; struct dirent n i j U r m ;

1 * t puts(*W30a 3 UP.cO: l i s t a r j u r { r j t a ce a c c e s o } );

ifla rg c I 2 } { x it'S X tT PAII.R:);

>

>

>

>

Ceofajo 3: Administracin avanzada de archivos en Linux

163

i f H d i r * a c .id r (* r g v [lJ )) = ? iir _ s i_ s r r o r( jM n t lir * );

n u llj

'

e iI = ( B i_ < J if r tt = * a - : c i r . ; d i r ) |
i r i.- :-

1-

KVL'.I

*V : : ts

i , - ii jji .r s n - - > c _ r a / J 9 ) ;

c l3 5 e -3 ir(d irj; it{ c X I\5 J C C S $ S ;

)
v o ic t a l i r _ s l j r r - ^ ( c i-.3r - J i s a j t )

<
M rro rfn e -iM fe );

it{cX:T_=AtluaS}; ) E; lazo w tiile constituye el ncleo de oste cdigo. El mismo llam a ropetirinmcnte a r e a d d i r para recorrer la secuencia de caracteres preaenU* un el arch i vo de directorio h asta que nalm entc t i to m a NULL y ol program a abandona ol laxo. En cada iteracin imprime el nombro del archivo (m y d re n t ->d_name) La siguime salida ilustra el comportam iento de l i s t a r _ d r
S ./Lit*r_dir

t : .
2 t ..

I da

3 ; * : KtKtflU
i : c*aoUr_f*cftyfw.c ! : Capitulo W .n p ? dtr_corrirrtt.c

3 : out
9 : t i tw r _ i t 2 .e

i# : liian*r_air.c
11 : rtu e v c jlir.c

12 : c * e o ia r_ sir.c 13 : l i i t s r _ 3 i r .c

Multiplexing de E /S
M idplexing es u n a p alab ra que e n in fo rm tica significa efectuar operacio nes de lectura/escritura con varios archivos sim ultneam ente. Ejemplos de m ultiplexing lo constituyen, ios navegadores de Web que abren m ltiples co nexiones de red p sr* descargar tanto m aterial de una pagina Web como les resulte posible hacerlo al mismo tiem po y las aplicaciones de cliente/servidor

1 7 0

Programacin en Linux

que abastecen a cientos de usuarios de form a sim ultnea. A unque conceptualm ente sencillo de comprender, el m ultiplexing puede re su lta r dificultoso de im plem entar de m an era eficiente. Afortunadamente, Linux cuenta con la llam ada seiect para facilitar las operadones de multiplexing. s e i e c t es una m anera de aguardar sin consumir dem a siados recursos del sistem a a que muchos descriptores de archivo modifiquen su condicin com ento. Su prototipo, presente en < u n i s td . h>. es el siguiente: mt ilct(lnt n, fe_set voacdj, fd^se? 'ntofds, fd_st 9xc*pt*d, truct ttnsvai seiect jup erv iaa los siguientes conjuntos de descriptores de archivo: El conjunto de descriptores r e a d f d s de archivo de lectura.
E l conju n to do d e sc rip to res w r l t e f t s p a ra v e rifica r que 3U3 re sp e c ti vos archivos p u e d an s e r escritos.

El conjunto de descriptores e x c e p t f d s en buKca de excepciones. N aturalm ente. si uno 3 h alla interesado solam ente en escribir u una suno de iifchivOG, puede despreocuparse dol conjunto do archivos quo tienen caracte res listos para ser ledos. En vordad, ol program a que so desea correr puede no realizar n in g n tipo de lectura on absoluto. Si esc fuera efectivam ente el caso, uno lo puede tran sferir NULL n ose argum ento. Por ejemplo, p ara igno ra r los archivos que sean lebles y los archivos que presenten alguna condi d n de excepdn 'ta l como un error), uno llam ara a s e i e c t como siguo: fo_aat *writ*Dl_fds;
i#loct(njxfO S, NUIL, ritfO S , NULL, 1 |;

El parm etro tim e o u t determ ina pi>r cunto tiem po s e i e c t bloquear, o ag u ard ar, a n te s de reto m a r ol control al proceso que efectu la llam ada. Si ti m e c u t se establece en 0 . s e i e c t re to m a ra tan pronto comience a ejecu tarse. C uando u n a operacin do E/S reto rn a de m anera inm ediata, sin n in g una espera, ae la denom ina llam ada de E/S no bloqueante. Si uno desea ag u ard ar h a sta que una operacin de E/S pueda ten er lugar (o sea, que r e a d f d s o wr i t e f d s v an en ) o h a sta quo tenga lugar algn error, le deber tran sferir a tiw e o o t el valor NULL, em p len d o la misma sin tax is m ostrada en el ejemplo situado arrib a de este prrafo. En este ltim o caso, el proceso quo efectu la llam ada qu ed ar bloqueado indefinidam ente h a sta que algu no de ios archivos presentes en alguno de los prim eros conjuntas pueda ser ledo o escrito, respectivam ente, o h a s ta que se produzca u n a excepcin. El primer parmetro, n , condene el descriptor de archivo de nmero ms alto en cualquiera de los conjuntos que vienen siendo mortoreados. ms i (el programa de demostracin m uestra una m anera de determ inar este valor). Si tiene lugar un error, s e i e c t retom a 1 y asigna a errno el valor adecuado. En caso de error, s e i e c t tambin invalida codos los conjuntos de descriptores y timeout, de modo que uno tendr que volver a asignarles valores vlidos antes de reutil2 a r les. Si ia llam ada a seiect tiene xito, retom a ya sea el nmero total de descripto res contenidos en los conjuntos de descriptores {no-NULL) monitoreados o 0 Un valor retomado igual a 0 signica que no ha ocurrido nada interesante", o sea. que- ninguno de los descriptores vari de estado antes de que expirara tim e o u t.

Captuo 8: Administracin avanzada de archivos en Linux

171

L?. imple mentacin de s e l e c t e m b ic o incluye cuatro ru tin a s de m an ip u la cin de los conjuntos de descriptores:
? D _ Z j; * C _ S 5 T ' M t j ; .

P5>_5PfiM

_st jt}; f?. 'jc ti;

F0_;S3T(tnt ffl, #_t *Mtt5

Las m ism as oporan de la siguiente m anera: FO ZERO vaca (tnidaliza a coros) el conjunto set. F0_SET aade el descnptor fd a aet. FD_CLR elimina fd d i M t FO_ISST deternun si fd e3 tn p resente en set. FO_ISSET os la ru tin a que se der-e utilizar luego de que s e l e c t retom e a fin do determ in ar ai ha ocurrido ulgiin 3uceso que requ:ora u n a accin. Si fd sigue presento en set, su condicin vari d u ran te la nm ada a s e l e c t {su correspon diente archivo tiene bytes a ser ledos, puedo aor esento o n ol mismo ha wmdo lugar un error . Los descriptores de loa archivos que no han v a n a do su condicin son eliminados de s e t en esa inatancia de FD_ISSET.
E je m p lo

El .siguiente ejemplo, m u i tl p le x . vigila dos pipes con nombre en busca de datos que e encuentren listos p ara ser ledos le program a de dem oatracin utiliza pipes porque los mismos constituyen la m anera ms sim ple de de m ostrar la E/S de tipo multiplex con un p rogram a breve).
N O T A

A c s o u e o o t - c i s e l C t . c , o a x c s c o ^ . c a r r c n n u n u x A sp itca 'jcn O ftw /o p rren t,


ce A . i e r r s e n y n w . T ro an . A tK 3 c w e s ie y , I S S S , p s g s . 2 l 3 - 2 l .

- 0 5 p s co n w u r c

c ie n e s * , e n

s r "Q u e s u n a RFO *. o*>!ns 3 3 2 .

Q uiz la m anera ms sencilla de u tilizar el program a m u l t i p l e x soa cons truirlo utilizando el m akele provisto en el sitio Web de este libro, que inclu ye regias p ara construir ios pipes. A lternativam ente, prim ero se puede- cons tru ir i program a y luego crear dos pipes con nombre .en el mismo directorio que ei ejecutable n u i t i p l e x ) utilizando el comando mKnod do Linux ral co mo sigue:
S W---ZC l i l i 3 S p ip t 3

Luego, ejecute r u l r i p l a x . A bra des v en tan a s de term inal adicionales. E n la prim era, a p e e c* > p i p e t , y en ia seg u n d a tipee c a t > p ip e 2 . Todo lo que se ripee luego de ello en cu alq u iera de las ventanas form ar ur.a cola para que la vaya leyendo muiriplex. El cdigo fuente e este program a es el siguiente:

; 1 72

}?

.)

>

>

Programacin en Unux

N o cir? d e l o -o gran a en i n t e r n e :: n p le x .c !

/
n u lT io ls x .c - Lee c a tc s deste p ip e ' y p ip c2

utilizando una lia?-ada a select


Adaptado ce o * - s e l e c t . c , e s c r i t o zor

V ic c a e l jcrrnson y S rX Trsan. U t iliz a a o con o i consentiruento de lo 3 autores e l iu x A a p lc a tio n Oavelcotent, M cto a l Johnson y Er:< Troan. irc k id e <fcntl.n>

Include <3tdio.n>
in d u c e <unlatd.h>
in clu d < s t d li0 .h >

n - v m o j v f ao void J4 ilr_ * i_ * rrir(c T a r -mensan);

in t aatn(void)

(
m : d 5 c r i_ a r c .ilv o I 2 J; cftar b u f( Aj*Ao_Bf]; :n t i , co n tad o r j i a r a c t e r c * . n *y o r_ d o a cr; d _ 5 : c ) t : _ a e i c r s ; / Conjunto de d e s c r ip to r a do io t arch ivo
qu

/ A r r o ll o ce d c s c r ip to r e o de rc n iv o /

aeran

lo ic o j */
fd _ so t p en d ien tes de lo e tu r a ; a c t u a lic e s e la o t / / C opla de c ; t o o o se rs a ara <}u# la

A o r ir lo s p ip e s */

I^ ((c a s c r 5 _ a r c iiv o 0 | 0 p an { p i p e r , OJMXWLY , O_JN0LCCK)> < C| a a l i r _ j i _ r r o r ( E rro r a l w r i r p i s a i * ) ; i r ( ld * s c r 5 _ a r c n iv o p | = o p 8 n ( 'p ip e 2 \ G _fiX Lv OJtONBlOCKI) < d) s a l i r j i _ a f r o r ( * E r r a r a l a o r i r p ip e 2 ) ;

f I n i c U l U a r conjunto de t e s e n p t o r e s con n u e stro s d e s c r ip t o r e s de a rch ivo */ C D _ a O (ic ]w _ u e sc rsi; ?D .SE T .;(;escrs_arcn .vo [i>!, 4 c jt o _ d e s c r 3 ) ;

R)_ST(dascrs_archlvc{ i|

sc]to_cesc.-s>;

/ l e l e c - n e c e s ita conocer o d e s c r ip t o r de a r c h iv o ae a ax io o v a lo r /

aayor_descr -1 o e scrj archivo(81 > o e ssrs_ a r:n lv o [i ] ? desers 3rcnivor| : d3scrs_arcnivo[1I;

.}

>

i
173

C c O fo tc 3 : A d m in istraci n a v a n z a d a d e a rc h iv o s en U nux

lo s

s i

r* c c r-s

.* 5

o tr3

vez

s i

la z o

o ie n trs s

a g u srd a

poder

lw r

de

^ J S

_i3 iteraciones tsrtiraran cusfcz la excreaion que eoaprue&a wnii avalu

i '.SO . / : s u sutrtio

q ee cen o t e e s i B i a r t c s * '

ftlle r3 :5Ss~: :9 :-s _ a r c riv o 'a i, 4c3to_d3crs)

P3 :S$ET<d93C.-s archivo [ 1 ] ,

lC*t5_053Cr3)J {
Asegsrarse Os T j seiect cuente con un conjunto actualizado Se

descriptores V
P4fldierttes_tf*_l*ctura cjto.Ssacra; :f(seiect|ejyor_fd * t, Sce*dlen9S_d9_lecttjra, NULL, NULL, NULL| < |

s* llf_ sijK T 8 r ( * ! ) ; / iCaal srcAivo esta lis to para 39 .- Ledo? / f o r a 9: i < 2; 1) { :f(TO _iSST((jescrs_arcntvotiI, So*M ientes_de_lKtura)) ( contador etrtcztres rad(dscrs archivoft|( buf, tamao 3U*

1)2
if'ccftador_caracteres * ) l / Se leyeron datos / &>."?{coiadcr_caract9reaI 'Vfl ; orirtt*(*Letdo: < t , ouf; } else ir|contador_caractere * 0> ( / Lsctura terreino Cerrar este sioe V close(cecr>_arcnivo[ 1 1 ); FO_cm(desc.-s_arcniyofl, 4c to_descr 1 ; > else" salirsi_arr9r(*read *}i concrtar*e */

/ Ocurri algn otro error que no

) ) }
*xit|XIT_SuXSS);

>
Old S*lir_s:_errcr(ch4r * n |* |

{
S errof(Berjajajj eilt(B U T_FA lU JA |;

i L a g u ra 8-1 m u e str a el a sp ec to d e n au ltip lex m ie n tr a s s e e s t ejecu ta n d o . E ste program a e s a lg o com plejo. L u eg o d e ab rir los d os p ips con nom bre, ol program a irucializa u n conjunto d e d escrip tores do archivo ( c j t o _ a e s c r s ) por m ed io d e FO_ZRO, y luego incorpora a l m ism o los d escrip tores d e los dos pi p es. E l corazon d e j i t i p l e x se e n c u e n tr a e n e l lazo '//r u la . D u ran te cad a iteracin d el m ism o, u tiliza F D _ S S 7 p ara d eterm in a r ai algu n o d e los d os p i p es disp on e de a n te e q u e p u d ieran s e r le d o s. S i a si m e se , prim ero copia c ] t o _ d e s c r s a p e r .d i e n t e s _ d e _ L e c t u r a c u e n te siem p re con la v ersin co rrien te d e C j t O _ d e s c r s . q u e e s la q u e in d ica cu n to s p ip es q u ed an cerrados.

>
17S

>

>

Programacin en Linux

Tabla 8.1. va/ores p o s les para el parmetro o r o t de fflnap.


Valores de PROT SONE PROT READ PROT W RITE PR0T_XcC

prot

Descripcin No so permiten accesos La regin mapeada del archivo ouede ser ei(33 La regin rrapeada del archivo puece sar escita 3 regin maceada tel archivo puecd se' ejec-taa

N O TA En la a^ortecr-ra x85 PRO" EXEC representa tambin PflOT REAO. de moco cue PR0T_EXEC equivale a especificar PRCT JEXEC PR0T_READ.

Tabla 8.2. Valores posibles para el parmetro f l a g s de mmap.


Valores de UAP FIX EO UA3 PRIVATE UAP SHARED MAP DENYWRITE A ? GROVfSOOWN MAPJ.OCKED

fngs

Descripcin Crea un mapa annimo, igroranto a fa Falla 31 la direccin es nvdllda o yo so encuenda en uso Las ooeracior.es de escritwa a la regin oo memona son priva tivas del proceso Las operaclooos de escritura a lo regin do memoria sor, ca&igdas a un archivo Ceso de permitir oscrUuros normales al archivo incrementa ln momorta en sentido desccntonte Bloquea p e in a s nn memonn

.IAP ANOKYMOUS

o f f s e t es habitualment 0 . lo que indica quo todo el archivo debe ser mapoado en mem oria. U na rogin de m em oria debe ser m arcada ya sea como privada, con M A P _ P R I V A T E , o com partida, con W A P _ S H A R E D ; lo d em s valo res son opcionales. Un mapeo privado hace que cualquier modificacin a la regin de m em oria ocupada por 1 archivo sea privativa del proceso, de modo que e sta s modificaciones no se a n reflejadas cr. el archivo que le dio origen o > t encuentren disponibles p ara otros procesos. Los m apas com partidos, por el contrario, hacon que cualquier actualizacin de ia regin de m em ona ocu pada por la im agen del archivo, sea inm ediatam ente visible p ara todos los dems procesos que hayan milpeado el mismo archivo. Para ev itar escritu ras al archivo origen de la im agen se debe especificar M A P _ D E N Y \ Y R I T E (pero tom ar en cuenta que ste no es un valor conforme a P O S I X y, por lo tanto, no resu lta portable). Los m apas annimos, creados con U A P _ A N 0 N Y M 0 U S , ao involucran un archivo fsico sino que sim plem ente asignan mem oria para uso privado del proceso, ta l como u n a im plem entocin personalizada de m a llo c . M A P _ F I X E D ocasiona que el kem el ubique ia im agen del archivo en u n a direccin especfica de m em ona. En este caso, si la direccin ya se encuentra en uso o no se h alla disponible por alguna otra razn, mmap fracasa. Si M A P _ F I X E 0 no e sta especificada y la direccin no se encuentra disponible, el k em el tr a ta r de ubicar la im agen en cualquier otro lu g ar de la memoria. M A P ^ L O C K E D perm ite que los procesos con pnvilegios root bloqueen la correspondiente regin de m em oria de modo que nunca sea p erm u tad a con su contraparte en disco.

Captulo 3: Administracin avanzada de archivos en Linux

177

N O T A

- ; s pregra r - = s y t \& := r.o - c aueden u tilizar 'A F J .C C K 5 D . E sta = s una ca ra cte rstica de s r j - ' c = c r * < p r e t ie r a c v e s n x e s o s r-o s jx .c n z .x c -i b lo c u se n W C3 la -n e irc n a disp on ib le. cc>~& sr*3a a s r e> s t e m e ( s e i c o r c e s t a r o * * ? ' c o r r o aWQue c e .re & ic v g ce s e n fc c l.

SUPRESIN DEL MAPEO DE UN ARCHIVO

C uando el lector haya term inado d e u tiliz a r u a archivo m aneado en mem o ria. llam e a muninap p ara su p rim ir la im agen en m em oria del archivo y re to rn a r a correspondiente regin de m em oria al sistem a operativo. E sta fun cin tien e el siguiente prototipo
ifit W * 0 1V 0 1C * S tir - .. ti l t J C I s r g * .* i j;

E l argum ento s t a r t es u n p u n ten ? que se ala al comienzo de la regin do m em oria a ser liberada, m ien tras q u e l e n g t h indica qu cantidad de la co rrespondiente m em oria so debe lib erar. Luego de que u n bloque de m em oria ha sido liberado, los intentos subsiguientes por acceder la m em oria cuyo co mienzo estA sealado por s t a r t o casionarn u n a falla de segm entacin (la seal S I 3SEGV). C uando u n procedo term in a, todos los mnpus en mem oria creados por el m : 3 mo son can celadt y la correspondiente m em oria es l i b r a da La funcin mur.map retorna 0 si tiene todto. Si fracasa retorno 1 y asig na a e r r n o el valor adecuado. E xtrao como p uoca renultor, munreap punde fallar por una serio do razones. La razn m s comn es quo S t a r t no a p u n ta verdaderam ente al comienzo de la regin mapeadfl ce m em oria. O tra cau sa por la cual munmap puedo fa llar os que lo n g th .m dem asiado la rg a y. corno rosultcido, so extiendo hacia la m em oria que no se e n cu en tra m apeada
E je m p lo

El siguiente program a, apear, m ap ea y luego desm anea un archivo especi ficado en la lin ea de comando. v x c re u i progr&na *r. In ta m tr a&sjp.c '/ r M g e ir.e C -'iit* i aewry -jcoad f ile . S ln ta x ii: apear n>nora < lo archivo /
finehxfe <*yi tycs.n> laclvct sys/stac.n

i i x h a t vrustc.rw
iitcluoe <fcntl..*v> *LT'l2a s ta lta .r. i x . 'j c a <s:cio .t> ro l z s iiir_ 5 i_ e rro r{c iu r * u n M | s }; i r : a ain(tnt i r j c , cnar **rgv{])

* C

Programacin en Unux

ir ; Ge3c-ijnor_4rcf!ive:
v o ta
t

.j o :
s ta t s ta to u f;

3 tru c t

/ A c r ir #1 arcn ivo a 3er upeado V if<argc I* 2) { pu:COCO o UPtEO: r-jooar {nojre e arch ivo } } ;

**lt(EXir__FAtLWE|; >
i f ( | d C f : p t o r _ 4 r c h i v o g p n | i r y v ( 1 ) , OJ tD O N LY )) < fl} sL ir_i_irror(* op *fl*);

/*

0BTnr la longitud dI archivo a se r capeado pora u t i l i t a r i a con iraap */

r ca t(fd , & tatbu); /* f>t*t vuelca su Lnfornaclon en atatbuO

/ apear 1 archivo da ntrad* / if(|aap nnaplti, Jta tO u f.tt li * . fROT AEAD, uap SHARE3. fd. 0|| ** im p _f a : lc 01

saH .r.si^rrorC inap' |j


flr in t r asa o ei archivo creado en ty V n ', Anap)

/ Cerrar y sasnsaear #1 archivo / ciaaeiae5criptor_arcnvo} nunaapinap, statD uf.st_8izej;

4xit<EXIT_SCCISS) }
yo id i a U '_ i ;_ ''or|char *neosaje)

<
perrorinensaiej;

8xtt(Exrr_FAiLUft6i; i L a nica salid a de mkmap es la direccin de m em ona donde com ienza la im a gen del archivo. Aunque este program a no n en e v erdadera funcionalidad, m uestra de m an era *inambigua cmo m a p e a ry desm apear ur. archivo. La llam ada a f s t a t hace sencillo d eterm in ar el tam ao del archivo, quo es en tonces utilizada como parm etro length en la llam ada a nvnap.

Captulo 8 : Administracin avanzada de archivos en Unux

179

U t iliz a c i n d e u n a rc h iv o m a p e a d o

Por supuesto, u n a cosa es m apear y d esm ap ear un archivo, y otra, y m 5 im p o rtan te. es u tilizarla y m anipularla. Las llam adas d iscutidas en esta sec cin - n s y n c . n p r o t e c t , n r e ^ a p y la fam ilia m lo c k - le perm iten a uno realizar dichas operaciones. ESCRITURA OE UN ARCHIVO A DISCO La funcin -JSync escnbe un archivo trap ead o a disco. Tiene al siguiente prototipo.
ir:

a s y n c t c i* ' :

* * :* * ? .

* in _ t

lir jr t i,

f ia o s ) ;

s y n c d e sc a rg a l e n g t h b y tes del m a p a a disco com enzando desde la d irec cin d e m em oria in d ic a d a e n s t a r t El a rg u m e n to f l a g s s obtiene realira n d o u n O lgico 'b i t a bit) de u n o o m d e los sig u ie n te s valores:

US ASYNC US_SYNC

Program a u n a operacin de ecritura y reto m a Escribe datos antos de que reto m e au homnima
m syncO

yS_ISVALIOATE Invalida otros m apas del mismo archivo de modo que sean actualizado* con datos nuevos MODIFICACIN DE LAS PROTECCIONES OE UN MAPA La funcin n p r o t e c t modifica loa indicadores de proteccin de un m apa de archivo en m em ona Su prototipo es el siguiente:
in ; p r o : * c t ( c - $ : * o :a *<*:< . iu * _ t

Un,

w x p ro t);

n p r o t e c t establece o modifica laa protecciones p ara ia regin de mem uria que comienza en a a c r al nivel de proteccin especificado en p r o t . Este di urno argum ento puedo obtenerse m ed ian te un O lgico (bit a bit) de uno o w!i< de los indicadores listados en la tab la 8.1. R etorna 0 si tiene xito. Si fracasa, r . p r o t e c t re to m a 1 y asig n a a e r r n o el valor adecuado.
BLOQUEO DE LA MEMORIA MAPEADA

31oquear la mem oria significa p rev en ir que un area de memona pueda ser escrita a su co n trap arte en el disco p a ra que la correspondiente regin de m em oria pueda ser liberada. E n un sistem a m ultitareas y m ultiusuario tal como L in u x las regiones de m em o n a de sistem a (memoria RAMj que no se encuentren en uso activo pueden ser. tem porariam ente, escritas al disco p a ra que la m em oria ocupada por ellas p ueda se r utilizada para otros fines. Al bloquear la m em oria se activa un indicador que previene que dicha regin 5e a volcada a disco. Existen cuatro -ir.riones p ara bloquear y desbluquear la m e m o n a i l c c * . o lQ c k a ii . -n u n lack y - n u n lo c k a li. Sus prototipos se listar, a connnuacin: int v5C<i eres: c:c K ir, si2 r.t leo i :
iflt p _ * .5 :< w o i;

icar,

3 i:e _ :

Io n );

i r : IocScaiI(n: 'la c s :; i-it 1.:i: ;

)
1 80

).

>

Programacin en Linux

El comienzo de la regin de m em oria a se r bloqueada o desbloqueada se es pecifica en a d d r . le n indica qu can tid ad do la regin se debe bloquear o desbloquear. Los valores p a ra f l a g s pueden ser uno o ambos (previo O lgico bit a bit) de los siguientes: MCL_CURRENT especifica que todas las pg in as queden bloqueadas a n tes de que la llam ad a retorna. UCL_FUTURE especifica que slo sean bloqueadas to d as las pginas que se a n a ad id a s a p a rtir de all al espacio de direcc:ones de m em oria del proceso. Como se observ d u ran te el tratam ien to do ramap, slo pueden bloquear o des bloquear regiones de memoria los procesos que corran con privilegios root.
MODIFICACIN DEL TAMAO DE UN ARCHIVO MAPEADO

O casionalm ente se necesitar m odificar ol tam ao de una rgin de memoriu. Utilice a tal fin la funcin mromap. que tiene el siguiente prototipo: vold 'nn*nai){voM *ol_addr, 3ize_t old_len, J n e n i e n , uisigred loro floga): De m anera sim ilar a lo que hace u n a llam ada a la funcin de biblioteca r e a llOC. iTiramap modifica el tam ao do lu regin de memoria que comienza en o ld _ a d d r, cuyo tam ao original era o ld ^ le n . al nuevo tam no new_],-?n f Lags mdica si ln rv/pn en cuestin puede ser desplazada por lo mcunona n i fuese necesario. MREMAP M AYM OVE perm ite que lu direccin de u ongon vario; si no se lo especifica, la operacin de redim ensionam iento fracasa, mremap rrtom a la direccin de la regin cuyo tam ao se ha melificado o NUIL si ocurra algn problema.
E je m p lo

e4CMi>t.o

El program a que sigue, c a t jn a p o a d o , im plom onta el comando c a t u tili zando m apas de archivos en mem oria. Aunque* e sta es una im plcm entacin olemuntal. m ueatru c larim en to cmo llevar a cabo E/S de archivos em plean do im genes en m em oria de loa mismos.
Vonrn a s i c r o q r j r j p I n te r n e t: ifitcat I

r
ca r jia o e a flo .c - In p le n o n ta c io r do c a t ( t ) anpleando r a c a s en neaioria S iflM X U : :at_T 4 oeaao nwraro de a rc h iv o

I
o tn clt.ce < sy sy ty p e s.ft> flflc lu d * <sys/an r..n > # tn c la d < s y s ,'s :a :.n > ir .d u d e ijn is ic .n ^ in d u c e < fc n t l.n > fu ic lu c e < 3 t a lio .h > Lnclude < 3 ta io .h >
v J if l i a : i r _ s i _ e r r o r ( c n a r 'o e n s s ie );

>

>

>

>

; 181

C a e d le 8: A dm inistracin avan zad a d e arch ivos en Linux

in t s a in ( ir t ar^c, ca* *5rgv:j)

(
i n t :e s c r :a t o c - arc.iv; cftar f j f lt * ;

3 :rv c t ara: star^ j?;

A s rir I ircn ivo *uer / fa r g s 1= 2 {


?.-$*( mqcc ce G VLEO : ca t_ a c * * : {nonore d a rch iv o }* ); it(E X IT _ F A IL U B E);

>
if(( # * e n w r_ a r-* U L o * c n (a rg v [ 11, 0 _ R 0 G N L Y )> *) M l i r _ S l _ r r o p |* o p f l * J ;

QCte*r L i io rg ltw J a; a rc-iiv o ;a r a u t i l i z a r l a con irnao V 'ita t( 3 j< P iP t '_areniwc, J s t a t C u f K j t a t e w f .s iz a a a ta ta v */ / S ootn<jra j * l .m in oro

/ Vap<ir l arcntvo 3* ntr*ca /

ntaod, *ta?0uf.*:_tr, PWr_fiAfl,


OP ShABtO. a tjc r ip to r .a r c n tv o , 9|| < I Salir_t_r.-or( 'm u s ):

rita I t

ut / tatbu# .t_*iz*|;

n:*(STOOuT_F!wio.

/ ProLijar /
c l t t l M t c r l t o r . r c n w o ) ;

statayf . it _ s iz ) ;

)
ais u i ir _ i i_ * r r o r ( c M r w nsaja)

{
p trro r (M a s a je );
* * it ( t x iT _ F A :u ^ ) ;

>

Programacin en Unux

Despu 3 de que el archivo h a sido mapeado a memoria, nvncat utiliza el puntero de caracteres, s r c , do la llamada a v / r i t o exactam ente igual que si los caracte res hubieran sido obtenidos por una llam ada r e a d o a * g e t s . Luego, la llam ada a nunmap retorna el proceso a la regin de memoria donde reside el kemel. CONSEJO Desa punto de s-.sra practico, o; umpeo de un archivo macoodo v memo-a e~. este
e/trolo oQuivaila a partir ur a nuez con Lira prensa hidrulica, Criuo no provea ninguna venala e n rminos < < ; dcscrpoo o do er.ens'n de cdigo. Sin e r r lo , en 3--k>ociore 3 en que e' cesempeto resulto crucial o cuando uno est en'rent&ao a ope'asftyves v> ticas o < -. chanto a tiempo. los archivos n-ac^sdos un memoria pueden representar jna evi <Jc*:o .rttoja el apeo e - memoria puede tomoin resultar valioso on circunstancias er. aooce se uloro una aa seguridad 103 orocesos cve corren con prtviittgios do root pueden Moquear lo Archivos boqueadas on memoria, evitando as que san oermutado-. a di3cc cor 9l admirttmdor do memora do Lnux. Como resu tnao. los archivo', w t co> '.iwcn datos cue deben ser rosgjardacos. tales como los do contraseas o Ce nmina oe oaitav ser an -rnr-os prodlwn a sor rnvisados. Por supuesto, en una situoc6- as. la a pecSva regin do memoria to-dra oua ser ostnbloddo a PAOTjCNE de modo que ofos proceson no .Mocados no puedan leer dicha rogln.

Bloqueo da archivos
El bloqueo de archivos es un mtodo que perm ite quo vano procesos p u e dan accodor el mismo archivo sim u ltn eam en te de unn m uera segura, ra cional y predecible. Cada proceso que bloquea un archivo lo hace p a ra e v itar quo otros proceoon modifiquen los datos presenten en 1 miRmo m ientras ese proceso se en cu en tra trabajando con ol nrclnvo. No existe una razn especifi ca por la cual a dos procesos no se les deba p erm itir leer dil mismo archivo sim ultneam ente, pero im aginem os la confusin que resultar: si dos proce sos estuviesen escribiendo al mismo archivo al mismo tiempo Con toda pro babilidad cada uno de ello3 sobrescribira los datos del otro o. en algunos ca sos. corrom pera totalm ente el archivo. El procedimiento general s> se desea acceder a u n archivo bloqueado se lista a continuacin: !. Verifique la presencia de un bloqueo. 2. Si el archivo no se encuentra bloqueado, establezca su propio bloqueado 3. A bra el archivo. 4. Procese el urchivo de la m an era que resu lte necesario. 5. Cierre el archivo. 6 . Desbloquee el archivo. Observe cmo ei proceso bloquea el archivo an tes de d ar comienzo a cuxJqu ier operacin de E/S y com pleta todo el procesam iento del mismo an tes de proceder a desbloquearlo. E ste procedim iento g a ran tiza que iodos los procosos que lleve a cabo su program a no sean Interrum pidos pnr otros procesos ajenos a i mismo. Si uno abre el archivo an tes de proceder a bloquearlo o lo cierra despus de proceder a desbloquearlo, otro proceso podrs acceder el archivo en la traccin de segundo que tran scu rre entre a operacin de bloqneo/desbioqueo y la ce apertura/cierre.

Captulo 8: Administracin avanzada de archivos en Linux

183

Si el archivo se en cu en tra bloqueado, u n o debe ad o p tar u n a decisin. M u chas de la s operaciones de E/S dem an d an , a lo sum o, slo un p a r de segn* dos. Uno puede ya sea ag u ard ar unos In sta n te s - t a l vez em pleando u n a lla m ada a s i e s o - y probar de nuevo o d e sistir e inform ar al usuario que est corriendo ei program a, que el mismo no h a podido ab rir el archivo porque otro proceso se en cu en tra utilizndolo. Los bloqueos de archivos vienen en dos variantes: bloqueos inform ativos y bloqueos compulsivos Los bloqueos inform ativos, tam bin conocidos como bloqueos cooperativos, se basan en u n a convencin por la cuai todo proceso que utilice u n archivo bloqueado verifica la presencia de u n bloqueo y lo res peta Ni el kernel ni el sistem a en s u conjunto hacen regir loa bloqueos infor mativos; stos dependen slo de que los program adores respeten dicha con vencida. Loa bloqutoi n m p u h iv c s , p o r el contrario, se hacen cum plir por el kernel Este ltim o bloquea loa accesos de lectura/escritura o de e sc ritu ra olam ente a un archivo que este bloqueado pan escritu ra isegn so tra te de un bloqueo de registro o de archivo, como se ver enseguida) h a sta que el proceso que !o bloque proceda a desbloquearlo. El precio a pagar por los bloqueos compulsivos, iin embargo, es u n a preciable penalidad sobre ol de sempeo. porque cada operacin de le c tu ra o de escritura tiene que verificar la presencia de un posible bloqueo As como existen dos r.po* de bloqueo de archivos, existen tam bin duu num eras de im p lem en u r los mismos: bloqtieo total de archivos o bloqueo de registros.
B lo q u e o d o la to ta lid a d d e l a r c h iv o

Los archivos de bloqueo son archivos de longitud cero y de nombre nom b r e _ a r c h i v o . icfc. donde nom bre_a r c h Lvo e.n el nombre del archivo que se d esea bloquear con absolutam ente todos su s caracteres, inclusivo los p u n tee y caracteres posteriores a los mism os. G eneralm ente son creados en el mismo directorio que el archivo que e l proceso desea abrir Eaton archivos resu ltan sencillos de ;m plem entar. P a ra hacerlo, se necesitar de un bloque de cdigo que se paresca al siguiente fragm ento de pseudo-cdigo:
li tls e
tro a iS B O c lo c ^ e a o c

'zen rc n tv o a sloq u to t*oIarcc *1 tfloicao or 0_6XCU la l l r u s s 3 zasc ' r t C l U y a rrre =- ESXIST) ;:ro procesa sartie^e aioqi^aao 1 a-rer.ivo

ti

arc n z v o

izr-.r
lle v a * :ti r a e i

irenive
z iz c
e i p ro c is a n s n ro a d ic io n a l re c -ja ric o a rc h iy o

i J lf r ana i f

3*svi-iCbl5r. a. ir c n i. c :a blOQuO

La utilizacin de 0_EXCL cuando se abre el archivo de bloqueo garan tiza que ia llam ada a. C?9 n sea atmica, es decir, que no sea interrum pida por el kemeL Ssto s im portante porque se puede d a r una. probable condicin de competencia r o e condiior. cuando dos procesos tr a ta n de abrir el mismo archivo. U n segundo proceso podra a b n r el archivo m ien tras la llam ada a open del prim er proceso est iendo interrum pida por e l kemeL E empleo de 0_EXCL evita es-

) )
134

) )

J-

J 'J

Programacin en Linux

ca situacin. Como se acaba de comentar, por convencin, los archivos de blo queo son denominados n o m b re _ a rc h iv o . lc k , donde n o m 'cre_ arch iv o es el nombre del archivo que uno est bloqueando, incluyendo ccdos sus caracteres.
Las corxJicionss de conips.e--c<a se comentan con mayo.'53 detalles en Dgina 73.

&flo de ~ o rk

E je m p lo

EJEMPLO

Este program a crea u n archivo de bloqueo, y luego tr a ta de bloquear el a r chivo principal u n a segunda vez. El segundo in ten to fr a c a s a r! E l propsito de! program a es iiu stra r la lgica correcta a em plear p ara utilizar ios arc h i vos de bloqueo. / NosCr. cal orojrana 9n Internet: lo c k it.c / /
* bloquearJirchivo.c - U tilizacin Oe archivos de Cloqueo. Sintaxis: cloquear bloquea.-. c.Ick

I
*include <ynistd.n> lnclude <*cntL.h einclude 'rrn o .n > *inclu<l* <atdliti.h> inclufl <3t30.h> nt nainlinr arge, enar ' r j v O )

r Por la posible presencia de EEXIS" /

{ int descriptor jirc tu vo , nuevajjescriptor;


/ A b rir 1 archiva do olouuoo V daicrptor_rcnivo con(arqv[i j , G_CRCAr ; OJXCL. flea-t;,. i*{descriptor_arc*iivo < t U rriw - EEXlS) / E l archivo ya te *ftcuntra tslocueico */ p u tsC E l archivo ya ncuont-a DLoquaaiJc por otro prccess"!; clo*en!acrip:or_#rchivo); } elao if(a*scriptor_rcnivo < 3) conprobarenoa ) else

r Ocurri alQun otro orror que ro

putsCC curno un error no p rc v u to '1 ;

i, ! V. .ircmvo oata ahora blocueaoo par noiotros*/ puts{*cta o.-egrana procede A Bloquear al arenivo*); /'
A q ji tendran lugar procesos adicionales

/
flepatir e l prcceso ae bloqueo, cua asta vez fracasara / rjsvc,3S3criccor = opaiargv(11, 0_CH6AT 0_EXCL, 06*); if(nuevo_descriptor < o 44 e<vno == SEXlSr) ( p u rsC E l archivo ya sa encuentra bioqueaoo sor otro proceso'); si nuestro */ lise |,iuevo_descriptor); } *ise if| nuevo^descriptor < < !)

Capitulo 8 : Administracin avanzada de archivos en Linux

185

owt*{ '0cjfi*i3 un errar no pr*ylsto*)i eise


3 -jts i s t a pro grau s crcceas a c lo q u e a r a l a r c h iv a i ; f r

J
P ar3 a i e s t a s

C5 M n 'c t *

-asaltadas i m m * suorUlrse. si prcgra.na nunca eSena l l ? ; r asta j. *


:lo s s ; 3 5 5 :r ic :o r_ s r c iv o > ;

j - l ir . : aryv :! l ;

' D e svin cu la r a l archivo da bloqueo v

3 *i*.{xr*_SuCCSS); > U na corrida de dem ostracin de l o c k i t produce la siguiente salida: 5 ;Dlocj=a-_archivo &ioquar_arcftivc.e.lcJc SIckjuc astailacldc :c* ? prograna aaor al archivo 1 3rciir3 yt 35 Kuffttra Siojusaao ser otro proceso A menos que ocurra algo inesperado. & io q u e a r_ a rc h .iv o bloquear debida mente el archivo (cuyo nombre le es pasado al programa como juco argum ento en la lnea de comandes?) cuando se ejrcute la prim era sentencia open. Despus, en la segunda sentencia acen . D lo q u e a r_ a rc ftv o trata de bloquear el mismo archivo una segunda vez creando el mismo archivo de bloqueo. Lu especificacin de 0_CflAT en la llam ada a open. ju n to con OJ-XCL. significa quo la llamada a ope fracasar si el archivo yo existiese- Para exprra&rio en otras palabras, la creacin o ap ertu ra de un archivo do bloqueo utilizando la aintaxm moatruda <;n sil jomplo anterior es totalm ente equivalente a bloquear el archivo cuyo nombro so obtiene eliminando la expresin . !c k de dicho archivo de bloqueo; eliminar ur. archivo de bloqueo es exactam ente lo mismo que desbloquear un archivo. Co mo la segunda apertura del archivo do bloqueo fracasa, el programa informa que el archivo ya se encuentra bloqueado. Ya do nuevo en el bloque cornwpcmdiente 4 mainO, el programa e rr a ol dnscnptor do archivo y desvincula (aupri me) el archivo do bloqueo, desbloqueando as el archivo principal.

B lo q u e o d e s lo c i e r t o s r e g i s t r o s Aunque los archivos de bloqueo son sencillos de utilizar, tienen v a n a s des ventajas im portantes: C uando un archivo <e bloquea, nn se en co n trar tampoco disponible pa ra otro- procesos que m eram en te q u ieren leer tos datos del mismo El indicador 0_SXCL es confiable solam ente en los filosyscems locales, no en filesystem s de red a l e s como el NFS Los bloqueos son slo inform ativos; los procesos pueden ignorarlos. S i iin proceso term in ara an tes de elim in ar un archivo de bloqueo (el que term ina en .Ick ). ste perm anece activo p ara el correspondiente archivo bloqueado y los dem s procesos no cuentan con u n a m anera efectiva de d eterm in ar 3 i se tr a ta de un bloqueo ya perimido, es decir, dejado all por u n proceso que finaliz prem aturam ente. E stas lim itaciones condujeron al desarrollo del bloqueo de registros, que brinda a los program adores ia capacidad de bloquear regiones especficas de les archivos, denom inadas registros. Los bloqueos de registros, alg u n as ve-

Programacin en Linux

ccs denom inados POSIX, perm iten que distin to s procesos bloqueen diferen tes porciones del mismo archivo o que. inclusive, lean loa mismos segm entos del mismo archivo. Los bloqueos de registros tam bin funcionan adecuada m ente sobre NFS y otros lesystem s de red. Finalm ente, dado que el control de los registros bloqueados es llevado a cabo por el k em ei, cuando un proce do term ina, su s registros bloqueados son autom ticam ente liberados. Los bloqueos POSD vienen asim ism o en dos variedades: bloqueos de lectura o com partidos y bloqueos de esentura o exclusivos. Los bloqueos de lectura se denom inan tam bin com partidos porque muchos procesos pueden estab le cer al mismo tiem po este tipo de bloqueos sobro la mism a regin de un a r chivo Los bloqueos exclusivos, por otro Indo, evitan el acceso a u n a regin bloqueada m ientras que los mismos se en cu en tren un vigencia. Adems, uno ao pueda cre ar un bloqueo de escritura m ientra e encuentre en vigencia un bloqueo de lectura p a ra la misma zona do un archivo. NOTA
Recordase -mi cwtuio 4. Procesos , qu ios procesos nvos no heredan os bloqueos oe ircnno* cuando tiene lugar un Cork, owxjua por el connivi un proceso niciaflo mncmnto una Herrada a ewc herede. .j hecho, too archivos bloque** rrnmeni *. podro.

Lu llam ada l* c n tl (filo control o control de archivos), prototapada en <f c n t l . h > , adm inistra los bloqueos de registros. Su prototipo es el siguiente: tnt fcntl(tnc re, int cad. ru ct #iocx loekI fd es el descriptor del archivo a ser bloqueado cmd debo se r uno de lo s i guientes parm etros: F_GETLK. FSETLK, o F_SETLKW. F_GETLK verifica si loe registros del archivo pueden se r bloqueados. Si efectivam ente es asi. el miembro l _ t y p e de la estru c tu ra f lo c k (file lock o archivo bloqueado) es puesto al valor F_UNLCK. Y, en caso de que los registros del correspondiente archivo no puedan se r bloqueados, a l miem bro l _ p i d de la estru c tu ra f lo c k le es asignado el PID del proceso que tiene los respectivos registros bloqueados. F_SETLK lleva a cabo el bloqueo. F_SETLKW tam bin lleva a ca bo el bloqueo, pero fcntl ag u ard a p ara re to m a r h a sta h a b er establecido con xito el bloqueo. lo c k es un puntero que a p u n ta a una e stru c tu ra f lo c k que describe el blo queo y s u com portam iento. La estru c tu ra f lo c k est definida como sigue: Jtr-jct f Lock { nort l_tyce; / fypa ot lock m t
snor: o ff_t i _ s :a 't ; off_t I_lar; pia_t I j i d ; / SeginnLng o* ioc* / r Staf'ttng off$*t of lock */ / Nunoer ar jytss to lock */ / Process holdlng lock /

l.ty p e puede ser F_RDLCK p a ra un bloqueo de lectura, F_WRLCK p ara u n blo queo de escritu ra o FjJNLCK p ara lib erar el bloqueo. I_ w h en ce puede adop ta r uno de los siguientes valores: SEEK_SET, SEEK_CUR o SE=K_END. que tienen el mismo significado que en la llam a d a a ls e e k . l _ s t a r t m dica el

C a c tJo 8: Administracin avanzada de archivos en Linux

187

desplazam iento del comienzo de ios reg istro s a s e r bloqueados, relativo a l_ * h e n c e desde dnde), m ien tras q u e l _ i e n especifica la cantidad do by tes consecutivos a ser bloqueados. I _ p i d , finalm ente, es ei PID del proceso que g en era el bloqueo. La 'tarr.aa i s-stema lseek esta cutortfta n 'Po 3.-oooarrilento dol punteo < J* archivo', pagr-e
E je m p lo

El program a siguiente. b l o q u a r _ r a g i s t r o s . establece u n bloqueo de esc n tu r a sobre u n a p arte de un archivo y un bloqueo de lectura sobre o tra p a r te S j je corre este program a en dos v e n ta n a s de term inal, se puede ap reciar claram ente como funcionan tos bloqueos de registros. hooo-* fl*I p*og*i*4 n Internet: recicK.c
plowe*.-_*#Utr9S.C 5 * t* D ltcio t n to C olocuto* d le ctu ra y a s critu rn

I
H K lw H i/'Clw.J ir e iv o t IflCluO# unut0.l*> fc fltl.t <talio.n < *ttio.h*

irclji* <irno.H>
IflX

(
y it <3e*ef!0tor_ircfttvo; nr'jCt f l oc 6lW_rg;

t f ((aeter iptor_ 4rcruvo * penitest. d e t \ 0 _CVj) < 0 ) { ptrrorl'oo** ); mtfBIT.MXLUKl; /


E i t W l K i r un al>ru ae e s c r itu r a la sr* lo s j lr i a c s ! M oytes fiel ercUva

I
3 loa_'ffl.l_tyc sjWtOC; fcloo_r*fl.l_eneflc * SX_9<0; 9 lo q _ re g .l_ * t3 rt = ; aloq_r g.I_l fl c s ta a le c e r e i oicccec / i f ( | fs n tl(c e s c rie :c r_ rc h iv o , ?_3Tu<. i c i a c j t f l ) ) put9( Sioc-.eo 34 e s c ritu re est-isU cia a * } ; 3 Isa {

f:ntl(fle*c-'ipter- ircniva> FJSETLX, 4blc<j_r g );


p r if lt fr * * f liS t r o s ya 3 lo c j a a t pa<*3 e s c ritu ra aor jroesso PIO *KJ\r*.

:ioa_"*:.l_cis;;

.1
188

>

Programacin en Linux

/* Aora a s t s b la c e r un b lc q u e : da l e c t u r a ; b lo < 5 _ '!;,'._ t y :s ?_3DLCX; b lo q _ re < l.l_ w a n c e * SEE:<_5H0

Doq_r^g.i_stact = 0;
b i o c j - s g .l ^ l e n = 100 : if( :fc a t l( < J s c r U > t o r _ 3 r c h iv o . F_SeTLKH, ib lo c ^ r a g )) w t 3 ( S lo cu e o co lg c t u r a e s t a o le c iC o ) ;

9isa

{
c n t l l d e s c r l p w r j u 'c h i v o , ?_GeiUC, 4 Jio a _ r* g > ;

o > -ii!tfv * fia g :itro 3 ya o loauead os nara le c tu r a por p ro ceso ID w n \ c l o q _ r s g . l o d ) ;

)
38tc h a r ) ;

M itlX IT 5CCES5;

J La salid a de egte program a. ejecutado en dos xterm s. se m uestra en la figu ra 8 -2 .

F ig u ra 8.2. Los bloqueos escritos xnn exclusivo*; lar, rojos compartidos. Prim ero, b io q u e a r _ r 9 g i $ t r o s establece un bloqueo de escritu ra sobre los ltim os 100 bytes del archivo t e s t . d a t . Si no se pudiese establecer el blo queo. el program a llam a a f c n t l con el argum ento F J3ETLK a n de obte ner el P1D del proceso que dispuso el bloqueo existente. El siguiente bloqueo es un bloqueo de lectura sobre os prim ero 100 bytes del archivo Los blo queos de lectura son com partidos, por lo oue varios procesos puerien blo quear !a m ism a regin del archivo, como lo ilu stra la figura 8 -2 .

>

C apitule 3 : A d m in istra c i n a v a n z a d a d e a rc h iv o s en Linux

189

Lo que viene
E ste captulo extendi la discusin de la E/S ce archivos, concentrndose en sus caractersticas avanzadas tales como m anipulacin de directorios, m apeo de archivos en m eraona y bloqueo de archivos. El prximo capitulo, T teem o n s. an aliza la creacin de procesos en segundo plano, lo que finali zar la seccin correspondiente a program acin de is te mas.

9
Daemons
En este capitulo, o! lector aprender cmo crear un daem on', pronunciad mon. Los daem ons 30n procesos ejecutados cu segundo plano que corren do m anera no interactiva. G eneralm ente proveen algn tipo de servicio, yo sea p ara el sistem a en su conjunto o p ara determ inados programa* de usuario. Este capitulo cubre los siguientes tem as: Las caractersticas de los daem ons Las reglas p a ra la creacin de dae mona La* llam adas a fu ndones que d eben em plearse cuando se program a un daem on Cmo tra b a ja r con la u tilidad s y s l o g Cmo deben a d m in istrar los daem oos los erro res en tiem po de ujocucin Todos los programa.? de este captulo p u ed en ser encontrados en el sitio Web n t t p : / / * v w v .n c p .c c ,n / i n f o baju el n m ero de ISBN 0789722131.

) 192

Programacin en Linux

Generalidades sobre Daemons


Tpicamente, los daem ons se inician d u ra n te el arran q u e mismo de la compu-adora y, a menos que se los term ine forzadam ente, se ejecutan h a sta que se cierre al sistem a. Adems carecen de term in al de control, de modo que toda salida que generan debe ser a d m in istrad a de m anera especial. Los daem ons tienen tam bin ciertas caractersticas que los diferencian de los program as ordinarios tales como l s y c a t- P a ra comenzar, casi siem pre co rren con privilegios de superusuario porque proveen servicios de sistem a a los program as de ruedo usuario. No tienen un term in al que los controle por que q o son interactivos; o sea, corren 3 n necesidad de disponer de ingreso de datos por parte del usuario. Los daem ons g eneralm ente son tan to lideres de grupos de procesos como lderes de sesin. A m enudo hacen la s veces de procesos en su grupo de procesos y en la sesin. Finalm onte. ei padre de un daem on e 3 el proceso i n i t , que tiene un PID igual a 1. Esto se debe a que su verdadero proceso padre ha efectuado un f o rk y term inado an tes que ellos, de ahi que sean procesos hurfanos heredados por i n i t
Los wrtituKes d control y os IfcfenM de sesin son comentados on 'Sesiones*, g'ro 76. Los rjucci do procesos y los lidoros do proces conV.ituyon c. teme do Grupos to proce sos.* stfgine 76. . .. ...............

Creando un Daemon
Para crear un programa que se comporte como un daemon mo debe seguir una pocas reglas sencillas y llam ar a varias funciones, todas las cualcts h an .sido vis tas por el lector en ios captulo previos. En el caso de lo daemons, sin embargo, la manipulacin do errores presenta dificultad^ especiales y requiere que el pro grama use la utilidad do ingreso al interna, s y s lo g , pora enviar mensajes al resTstrodol ..Htemn (que a menudo en el archivo /v a r/io g .-m e s sa g e s). Este tema so cubre en Manipulacin do errores", m s adelanto en este mismo captulo. Existen unos pocos pasas sencillos a seguir para cro.'ir un daemon que al mismo tiempo ae desempee adecuadamente y so coordine correctamente con el sistema. Pnm ero se debe ejecutar un f o r k p ara hacer term in ar al proceso padre. Igual que la mayora de los programas, los daem ons son iniciados desde un scrip de interfaz o desde la linea de comandos. Sin embargo, los daemons son diferentes a loa programas de aplicacin porque no 3on interactivos: corren en segundo plano y, como resultado de ello, no poseen u n a term inal de control. Como prim er paso tendiente a desem barazarse de la term inal de control, su proceso pa dre efecta un f o r k y term ina. Si uno reflexiona un minuto sobre elio, esto tie ne totalm ente sentido. Los daemons no leen de s te lin ni escriben a s t d o u t o a s t d e r r , de modo que no necesitan en absoluto de u n a interfaz con un term i nal, excepto p ara que sta los haga comenzar. El segundo paso consiste en cre a r u n a n u ev a sesin por medio de la llam ada a s e t s id . La U am aca a s e t s 1 0 desconecta dicho proceso de cualquier te r minal E n otras palabras, esto hace que el proceso lujo (el daemon) no posea un term inal de control. El program a co n tin a ejecutndose, por supuesto.

Captulo 9: Daemons

193

El paso siguiente es hacer que el directorio corriente de trabajo (cwd) del pro ceso sea ei directorio raz- E?*o re su lta necesario porque cualquier proceso cu yo directorio co m en te se encuentre sobre un lesystem montado evitar que dicho Slesvstem pueda se r desm ontado. N orm alm ente este es el comporta miento deseado pero. 31 el sistem a debe p a sar a modo monousuario por alguna razn, u n proceso dsem on corriendo sobre un lesystem moneado se con g erie, en el mejor de los casos, en una m olestia p ara el superusuorio (purque ste de be encontrar el proceso problemtico y eliminarlo), o. en una situacin de emergencia, u n a verdadera am enaza p a ra la integridad del sistem a (porque evita que un filesystem mentado en u n disco que p resenta problemas pueda ser desmontado?. H acer que el directorio de trabajo de un daemon soa ol direc torio raz es una m anera segura de e v itar am bas posibilidades. Luego viene establecer la u n a sk a C. S3te paso es necesario p ara prevenir que la urcask heredada por el daem on in terfiera con la creacin do archivos y directorios. Consideremos la siguiente situacin: un daemon h ered a una u ~ as < de 055. que elim ina los perm isos de lectura y ejecucin p ara ol grupo del propietario y p ara los dem s u suarios. Si el daem on luego procediera a crear un archivo, por ejemplo de dato s, el archivo asi creado podra se r ledo, escrito y ejecutado por el uuuno. pero el grupo y el resto de ios u suarios s lo podra escribirlo, lo cual seria absurdo. Sem ejante situacin 3e evita h a c e n d la del daemon igual a < 3 Tam bin le otorga al daem on m ayor flexibilidad para croar archivos porquo. con u n a u.nask de 0. el daem on p u e do establecer con precisin los perm isos quo sean requeridos en lugar do te ner que conform arse con los valores predeterm inado* del alaterna. F inalm ente ie deber cerrar cu alq u ier descriptor de archivo que el proceso hijo huya heredado pero no necesite. Ente es sencillam ente un paso dictado por ci sentido comn No existe razn valedera p a ra que u n proceso hijo m antenga abiertos descriptores heredados de su proceso padre. La lista de descriptores de archivo candidatos a ser cerrados incluye por lo menos S t d in , s t d o u t y s t d e r r O tros descriptores de archivo abiertos, tales como tquello* que se refieran a archivos d e configuracin o de datos, puoden re querir asimismo ser cerrados E'U-e paso depende de las necesidades y re q u e rim ientos del daem on en cuestin, d e modo que re su lta difcil establecer esta regla de m anera m s precisa
L la m a d a s a fu n c io n e s

P ara sau sfa ce r los requerim ientos d e l p rim er Item so debe llam ar u f o r k p ara en g en d rar un proceso hijo y luego h acer que el proceso padre llam e a e x i t . P a ra elim inar el term inal de control se debe crear u n a nueva sesin llam ando a s e t s i d , que se en cu en tra d eclarada en < u n i s td .h > y tien e el siguiente formato: p :c .t HtJiCivoW); s e t s i d crea una nueva sesin y u n nuevo grupo de procesos. El daem on ser entonces el lder de la nueva sesin y el lder de grupo de procesos del nuevo grupo de procesos. La llam ada a s e t s id g aran tiza tam bin que la nueva se sin no tenga un term inal de control Si ei proceso que efecta la llam ada es ya un ld er de grupo de procesos, sin embargo. la llam ada a s e t s i d fracasar.

Program acin en Linux

Si tiene xito, s e t s i d retorna el [D de la nueva sesin (SID.i. Si se produce a l gn tipo de error, retorna - 1 y asigna a e r r n o el valor adecuado. La llamada a u n ask establece la umask del dactnon a 0. Esto deja sin efecto cualquier umask heredada quo pudiera de forma potencial interferir con la crea cin de un archivo o directorio, ta l como se explic anteriormente. P ara cerrar los descriptores de archivo que ya no se requieran se deber llam ar a c i s e
E je m p lo

Jf

MPLO

El siguiente daom on crea un nuevo archivo de registro. / v a r / l o g / I p e c a t e d . lO Q , y escribe la focha y hora al mismo cada minuto. A 5n de que el daeraon funciono, debo sor iniciado pur ol u suario root.
/ Ipedated ( U 7 7 1 no e x i s t e en I n t ? r n t . Lo que hay B jO IdUfllCO .oubro O S v a ru rtfl d *l un

m iao qu i encuentra nao adolanto en eto niiaa captulo facnajiora.c - Daonon sencillo para oscriO ir fecha y ora a

/ unarenivc o#

reentro* I
m c iu d e < y /ty c * .h > i t n c iu d < y * / ta t.n >

includ* <tdio.r> inclu* <stdlib.n> inclusa <fcn tl.h


inclOfl errn o .h > i n c l u d e < u o is td .n > f i n c l u d * < tn*> * in d u d a < r in ^ .n >

Lnt Min<voidt

l
ptd_: pid, s id; sor as sesior- ) t u a . t tirabuf;
t n t c 9 5 c r i o to r _ a r c n iv o , lo n g i tu d ; p id - f o r k ( | ; f < p l d < 8} { p e r r a r {* o r K * > ;

/ pa - icentir'icador oe procesa:

Jid iden tifica-

xitisxir_FALJRS);
i f ( p i d > 3)

/ En e. pracsso aaOre. *r.ara, s a l i r /

*it(Ex:r_sw:cessi;
r
A fo ra , en a i cro c eso h i j o / / * P r ia e r o , d a r conienzo a jn a nu av a s e $ io n */

C a p itu lo 9 : D 3 e m o n s

1 9 5

i ((U 0

* ts id O )

< 4;

o trro rj : * ) ;

}
/ * a c o n i r u a c i o r . , ^ a cer cu e i c i r a c t o r x o c o r r i e r e 5 i r * c ; o r j o r a i i / u r r a c a j o sea 1

tf { < c ft S t r { * / * > ) < a i < p*r.-f('CP<J i r * j ;

* i; t( a : T _ F A lv ^ ) ;

> / iM ic L ili 2 i : 0fl : i l ooflo d* ircnivo V u m w h ):


/ C * r r * r i t a i n , SttOUt i H U r r /

C3t4<STOr*_F:iN0:, ClOM<5T9CU7_Fll*0);

elOMlSTOBW.FJLHO);

F liu lM ftT * . r a lu a r :* ta rta prataniHda V

loftQ iua * : r : # n ( c i M ( i t u * o u r n ;
* U i(S {

c ftir buf r a : i a c ( * i i ' ( c f r | if ( D f * JU .) (

U oogu ye t))l

ir ( s x X T _ f A : . i K

i 11{

s s c r i o :: r _ a r c i i i v a o D a r tC / v a r / :o g / 2 a a :a fJ .lo g * ,
0_CflAT : O J O M .Y : 6 M | ) o: {

n:{X!T_FAlLLfl|;

J STr->c7/(Cvif, !, longitud - t );

-it'<J;.*;pror_ircfi0 , Of, longitud - t); cicesesrru-o^arc-nivci ; JiitpiM J; }


t t > XIT_3UCCcSS);

i 196

>

>

>

>

Programacin en Linux

* ecra_ n cr a utiliza las llam adas a sistem a o p e n y w r i t e con el propsito de recordarle a l lector que Linux provee a ltern ativ as a las funciones e st n d ar de biblioteca p a ra E/5 de secuencias de caracteres (streams) f open y f v r i t e . Recuerde, se debe correr este program a con privilegios root porque los u su a rios normales no tienen acceso a escritu ra en el directorio / v a r / l o g . S: se tra ta ra de correr e3te program a como usuario no-root, sencillamente no suce d e r nada. El daemon sim plem ente te rm in a r despus de que fracase en abrir su archivo de registro. Despus de unos pocos minutos, el archivo de registro mantenido por el daemon. / v a r / l o g / f e c h a _ h o r a .l o g , tendr un aspecto sim ilar ai siguiente: s $ > j -c *ta il -S /var/log/fecnaJiora.log
#5d J u l 28 0 1:0 5 :4 * $ A ~~ J u l 23 3 1 : 3 7 ; 4 | W flO J o l 28 9 l : 3 8 : * i >999 vre-J J u l 28 o : : 3 9 : 4 l I9S3 1999 *0 J u l 29 0 1 : 3 6 :4 1 '999

Obsrvese que f e c h a d o r a deja de escribir m ensajes ii*? erro r a s t d e r r despus de llam ar a s e t s id . El proceso hijo ya no tiene u n a term inal de control, de modo que la salid a no ten d ra donde ir. El lazo infinito vhile efecta ei trabajo del program a: a b rir el archivo io g , im prim ir al miBmo In fecha y hora, c e rra r el archivo y luego dorm ir d u ra n te 60 segundos. P ara term in ar el program a, ingreso al sistem a como usuario root, obtenga el PID de fe c h a _ h o r a y em ita el comando K l l <PID de fe c h a _ h o ra > .
A d m in is tra c i n d e e rro re s

Luego do que un daemon llam a a setsid ya no dispone de una torm inal de control, d*.- modo que no tiene donde enviar lo s:d:da que tria do forma n o r mal a S td o u t o o s t d e r r (como por ejemplo, Iob m ensajes de error). A fortu nadam ente. la utilidad e st n d a r p ara este propsito es el servicio s y s l c g derivado de BSD. provisto por el daomon do ingreso al sistem a, s y s lo g d . E sta interfaz relevante est .4 definida en < s y s lo g .h > . La API es simple o p e r lo g ubre el archivo do registro; s y s lo g escribe al mismo un m ensaje: c i o s e i o g cierra el archivo. S us prototipos se listan a continuacin;
v o id sp d fU o j'c r.a r voiO c lo se lQ Q (v o id ); m t opu on , ln t f a c l l l t y i ;

vota syslog(uc p r w n t y , c*ur farnat,

o p e n lo g da comienzo a una conexin al ad m in istrad o r de ingreso al sistem a (system logger). i d e n t es u n a cadena de caracteres a adida a cada mensaje, y tpicam ente se asigna a la mism a el nom bre e! program a. El argum ento o p ti o n es u n OR lgico de uno o m s de los valores listados aqu: _0<j_C0NS Escribir a la consola si el adm inistrador de ingreso al sistem a no so en cu en tra disponible.

l OGJJOELAY Abrir la conexin in m ediatam ente. N'ormaimente, la co nexin no so ab re h a sta que se enve ei prim er m ensaje.

Captulo 9: Oaemons

197

LOG_PERROR Im prim ir a S 'u S P r . L0G_PID In clu ir en cada m ensaje el PFD del proceso.

a c i l i t y especifica el tipo de p ro g ram a que en v a el m ensaje y puede ser uno de los v a lo r e listados en la ta b la 9.1. Tabla 9.1. '/afo'es ocsiCies para el argumento acity del administrador de ingre se a- s:serra ___________________________________________________________ Descripcin Valor de facility M e rm e s de seg'jndad/autonzaciOn log_ auth r : v LOG_CRON LOG_DAMO J L<X5_KRN LOG_LOCAL{3-7J LOG_L?B tOG_UAIt L0G_NcWS LOG_SYSLOG LCG_USER LOGJJUCP
D a e m c ^ s ce reiG; c r o n

/ a t

Otros daemons Oe sistema

T e n a is <ai kome<
Reservado oara
-js o

local

Scosisterra de imoresora en rinea Suraistcmo do correo SuOaistoma do nofcelaa de Usenet Mensajes s e rra d o s por Usuarto predeterminado Sistema

sy slo g d

UUCP

p n o r i t y esp eaiiea la im portancia del m ensaje. S us posibles valoren son listado* en la ta b la 9.2. Tabla 9.2. vaores postales para el argumento onenty del administrador de inxreso ai sjstem a Descripcin Valor de prionty
LOG_EURG LOG_AL=RT
lo g _ c

Q sistema no se ercuenwa utllteaoie Temar accin ir.meclatamer.M Concicln crtica Conoicn de error CorvJfun de advenenc'S Carxjidon normal cero significativa Mensaje informativo Mensaje de depurac-n

:-

LOG_ER3 L0G _A3SIM G LO O .S O TIC E LO G .IN F C L0G_D=SG

E strictam en te hablando, ei oso de o p e n lo g y c l o s e i o g es opcional porque s y s lo g a b n ra el archivo de registro, autom ticam ente, la p rim era ve-/ que sea lla m a d a

Programacin en Linux

E je m p lo

El
EJEMPLO

s i g u i e n t e p r o g r a m a e s u n a v e r s i n d i f e r e n t e d e fe c h a _ h o r L q u e e m p l e a e l

a d m in is tr a d o r d e in g re s o a l s is te m a : / .NoBbra e l arogran-a en I n t e r n e t : lp e d a te d .c

/
* f ctia _ h o ra 2.c Daencn s e n c i l l o para e s c r i b i r 'e c h a y r.ora a un a rc h iv o da r # 5 i s t r o e.toLeondo la u t i lid a d So in g re s o a i B ls te * s y s lo g

I
finciud# <sys< tyces.h> IncLudo <sys/stat.H>

flndtrf* <stdiib.n>
in clu d <fcntl.li indud* <*rrno.h>
in c lu d * < u n i*ta.n > m d u a * < u n e n> fin c i u a * < it r tn g .n > m d u a * s y ils g .h

int itamvoia)

<
310 t pa, j ia ; dor de saaion / od * icuntificaaar do procoso; sic - iden tm ca

int m criptor_arcnivo, longitud; tli9 _ t tltbuT;

r A C rir *1 registro <1I sistema !


openloG{'fecha_nora2*, lQGJ IO, LO C 5 OAEMCfl); pid ^ork >; i?<pia < fli {
s ysio g iL G a _ e fla , * fo rK *>;

xitEXIT.FAILUREJi

if(pid si
En ei orocesc ojora. Aora, s a lir-* / 3xit!=Xir_3UCCESS);
/ w io r a , en *1 d--cc 3 s o h i j o /

I ' Priaero, car coaienzo a una nueva sesin t


if ({3 ia * je ts id O < ) <

C a ftU lo 9: D aem ons

199

sysiog(U)8_Rfl. Hs\n*, s t t s d l; l*t(EXIT_FALUB=J;

}
' * cerstn4cO0, M c * f cwi t o r io r * u ; O ir e c W lo so rris a te de trsoaja sea e l a irs c -

lf((c*ttir{*/*}) < *> { *7*IcqICG _, -vs\r*, c n d lr* !j


cxit:EXlT_FA2LURS);

lU x n tc U l U K iO f l C l 9C3o ! t r c M v o */

tu tu :
./ U r r t r i M l n , itflo a t y it<3rr / ClO Jf(ST0tH ,r:LW ): c io M ts rw M r.F it ): elCt(ST06!W .FXUM i

F ir.U M rt?*. ' l i u r la tr prt#r\(3td V

lo n g itu d

nU|i) {
z t-ir 5u< *4i:o< {LJ?(cnr) {lo ng itu d t|>
I f l S u f * NLL_) (

M itt 8 X ? / A X U * E > ;

J
if((O c r^ t3 r_ jrc M v o s
0_CR*T 0 J G M U

oo*fl{h r log/lpadatl.loQ\
0_AP?EN0, 0 6 M II < ) 1

syiog(LO O JSA , *op'' > ;

>
U a*(& taeouf | ; *trncp(B*if, : : ia i( 4 t ix a a u f) , lo r g it u c i > ; r it ^ w s c r ip t c r . ir t f t lv o , tu r, lo n g itu d * t|; :lo5e{0es< :rictor_arc3ir);

u*to( 6); )
e lo s e io g ,
* ::S
x i t _s u x

=SS>;

Programacin en Linux

Una vez aadida la funcionalidad de ingreso que b rin d a s y s l o g , s i uno trata de ejecutar el program a como u n u su a rio norm al. f e c h a _ h o r a 2 es cribir una entrada en el registro del sistem a (generalm ente ubicado en r v a r /lo g /r- e s s a g e s en os sistem as Linux), la cual ten d r el aspecto siguiente:
345 14 nossr fe c to Jio r* 2 ia i9 2 l: ooen

Esta "atraca de registro indica que en la fecha y hora especificadas, en el servidor denominado hoser, un program a llam ado f e c h a _ h o ra 2 . con un PIO ce Si9'2, ingres el texto open a l registro del sistem a. Refirindose luego al cdigo fuente de fecha_hora 2 . uno e sta ra en condiciones de d eterm in ar dnde ocurri el error. Tocos los mensajes de error que genern f 9C fta_h o ra2 van a ser ingresados en ei registro del sistem a, aunque las fechas y horas en s m ism as van a se guir siendo escritas a / v a r / l o g / f e c h a _ h o r a 2 . lo g . La salida quo se indi ca a continuacin, tom ada dei registro del sistem a, fue generada porque quien intent correr ol programa no ra un usuario root. El nm ero en tre corchetes os el PID do f e c h a _ h o r a 2.
vi'Jl 2S M .34:06 ro ie^ * fC a Jlo ra 2 (B 8 flS ]; opt>n

SALID*

Lo que viene
Es:** captulo explic la creacin do dacmonn, qui on program as do ejecu cin n segundo plano que oatn aiem pro funcionando y que. habitualxnentc, proveon algn tipo do ser/icio. Esto com pleta la cobertura quo b n n d a este li bro u los temas correspondientes a la program acin de sistem an. Con su co nocimiento actual d las h erram ientas bsicas de desarrollos, cu b iertas en Id Porte l, "El entorno de program acin de Linux", y unn slida comprensin de la programacin di* bijjo nivel de sistem as (cubierta en la P arte II. "Pro gramacin de sistemas*), el lector se h alla listo p a ra aprender alg u n as de las API (application programm tng inte.rfcir.es o interfaces d*. programacin de aplicaciones) ms comunes de Linux, en la P a rte III, "La* A PI (Interfaces de programacin de aplicaciones de Linux)".

'

>

>

>

\ ,1

Parte

Las API (Interfaces de programacin de aplicaciones de Linux)


1 0 . L a A P I d e b a s e d e d a to s 1 1 . M a n ip u la c i n d e p a n t a lla c o n n c u r s e s 1 2 . P r o g r a m a c i n a v a n z a d a do n c u r s e s 1 3 . La A P I d e s o n id o : O S S / F r e e 1 4 . C r e a c i n y u tiliz a c i n d e b ib lio t e c a s d e p ro g r a m a c i n

>

>

>

La API de base de datos


Los program adores de aplicaciones a m enudo deben alm acenar sua datos en una base de datos rencilla, sin req u erir todos loa serv ao s (ni dsear lii re s pectiva sobrecarga de trabajo) de u n a b a se de datoa rotacional completa tal como las de Informix u Oracle E ste capitulo e ensea al lector cmo u tiliz a r la bas de datos Berkeley. un e st n d a r d e baso de datos intograble p resente en las bibliotecas de aditam entos add-ons) d las principales distribucionou de L in u x La versin quo se com enta en este capitulo es la 2.7 7. pero la que se m u estre es vlido tam bin p ara cualtjuier o tra vorsin 2.x. O bsrvese que la API 2 x incorpora todas las caractersticas de la API L.X. pero aude asi mismo mucho elem entos E ste capitulo cubre los siguientes tem a: Creacin de u n a nueva base de datoa A pertu ra de u n a base de datos ex isten te Cmo agregar y su p rim ir registros Recuperacin .obtencin) dt registros B squeda de u n registro N avegacin de u n a base de datos C ierre de u n a base de datos Tbdos ios program as de este capitulo pueden 3 e r encontrados e n el sitio Web h ttp : / / . r ccp. ccr m f o bajo el n m ero de ISBN 0739722151.

;
204

,i

>

>

Programacin en Linux

NOTA r. *' sitio Weo que eerrescc-'-de a este loro se encuentra disponible una Estribacin completa de cdigo fuente ce 'a ver$i<^ 2.7.5 Ce a Dase ce oatos Berkeley. T c-dos los eiemc os ce 53*e irero fueron ccrst'uicos err>peando una copia del archivo ce erc3oe:aoo y de la biblioteca presentes en el directorio corresoondic-'te = c6a:go fuente do ssts capitulo.

La base de datos Berkeley


La o aae de dato s Berkeley, a menudo denom inada Berkeley DB o sim plem en te DB. utiliza p a res clave / valor p ara trabajar con los elementes presentes en la m ism a. La clave es el elem ento identificado!-. el valor es cada elem ento de datos c o rre sp o n d a te . P ara encontrar los datus que uno desea, ingrese una clave a la DB y la m ism a le reto rn a r el valor o valores asociada con ella. El par clave/valor so encuentra alm acenado en una estru c tu ra sencilla deno m inada DBT. -D a ta Base T k a n g - que consiste de una referencia a mem oria -e s decir, un p u n te ro - y la longitud del correspondiente tram o de mem oria referenciado, m edida en bytes. La clave y el valor pueden ser de cualquier ta po de datos. La longitud de loa d ato s que se pueden alm acenar es prctica m ente ilim itada, a condicin do que cualquier valor pueda caber en la m e m oria disponible del sistem a (m oraona RAM fsica). Por ejemplo, si uno quisiera crea r u n a base do dato que contuviera los capi tules do este libro, los paros clave/valor podran ten e r el siguiente aspecto:
C la v e ________ Uno
003 Tres

Valor_________________ __ ______________________ Compilacin do program as


Control del proceso do compilacin: el siako do GNU Acerca del proyecto

Cuatro
Cinco

Procesos
Sartales

y as siguiendo. Las bases de dato s DB aceptan tres tipos do mtodo de alm acenam iento y acceso: B-ftrees, dispersiones {hashes) y registros. Las bases de datos b a sa das en registros alm acenan su 5 datos de longitud fija o variable en orden secuencial; se puede in se rta r nuevos registros en tre registros existentes o agregarlos al final de loa mismos. Las bases de datos basadas en kashes al m acenan os registros en u n a tab la h ash p ara p e rm itir una bsqueda r p i da. La funcin de ha3k puede se r su m in istrad a por el program ador o se pue de u tilizar la ru tin a in teg rad a al compilador. Las bases de datos B+tree alm acenan sus dato s en orden preestablecido. El sentido de la ordenacin est determ inado por u n a funcin su m in istra d a por e! program ador o por una funcin p redeterm inada quo clasifica las claves de m anera lexicogrfica La figura 10-i m u estra cmo estn relacionados e n tre si los tre s tipos de al m acenam iento y acceso.

Csc'ulo 10: La API de base de datos

205

B-rw
08.8T7SB

2 3 U S S -I

! -* = y tArtUJ
2 - **_a V a>v_2
J-* * * _ 3 v o u * JJ

i
S *cy_SiVa>v*_S S *_5vb v _3 7 *_7,vx*_r

9co*3 N um M f Datacaia
;D8.flECNOi

i - *9Y_lViKO

F ig u ra 10. . Cmo ton alm acenados loa registros en as bases de datos DB o Berkeley. La verdadera iroplementacin de loa mtodos de alm acenam iento y acceso que adm ite D 3 exceden los alcances de este libro (en verdad, muchos cientficos especializados en informtica dedican toda su carrera a estu d iar algoritmos <lo ordenam iento y de bsqueda), pero Los principios bsicos son simples. La fin i r 1 0 - 1 m uestra una base de datoa q;ue contiene ocho registros, indicados por los nm eros uno h a sta el ocho U na base do datos de tipo B+tree alm acena Ion datos formando una estru ctu ra sem ejante al tronco y las ram as de un ilrbol fr^arbo!!. tal como se m uestra en la figura 10*1. E sta disposicin logra que ubicar un registro especifico sea extrem adam ente rpido y eficiente. Las basca de datos de tipo h ash alm acenan los datos en una tabla. La ubicacin de un registro individual en la tabla depende de un valor arbitrario que se computa basndose n la clave del registro. L as bases de datos orientadas a nm ero de reg u tro alm acenan estos ltimos en orden secuenciaJ. Loa registros son acce dido* y m anipulados por su correspondiente nm ero de registro.

Creacin, apertura y cierre de una base de datos


P ara em plear u n a DB se debe incluir en el cdigo fuente del program a el a r chivo de encabezado <flC.h> y vin cu lar a l cdigo objeto del mismo l i b d b . a ( - l a b ). C ada funcin DB recom a cero si tiene xito y un valor distinto de cero si se produce algn error. En el caso de un e rro r de sistem a, tal como un argum ento no lcito o ur. e rro r de disco, DB re to m a u n valor on e r r n o que puede se r utilizado en conjunto con la funcin o e r r o r . O tros cdigos de re tom o ir n siendo docum entados a m edida que se vayan explicando las fu n dones que los generan.

204

) /> ) J) ) ) )

Programacin en Linux

NOTA
En =: sitio Web cue rc re s C ^ C 3 este libro se encuentra disponible una cstribucln contera del cdigo rente de a versin 2.7.5 de ia Mse de datos Berkeley, ledos los eiemeos do este ibro fueron construidos empleando una cco'3 del archivo de e^c-xSodo y ds la biblioteca presentes n ai directorio corresccrdiente al cdigo fuente ce este cas^tuio.

La base de datos Berkeley


La base de datos Berkeley, a m enudo denom inada Berkeley DB a sim plem en te DB. u tiliza p ares clave ! valor para trabajar con los elementos presentes en la m ism a . La ciave es ol elem ento identificado!-, el valor es cada elem ento de datos correspondiente. P ara en co n trar los datos que uno desea, ingrese una clave a la DB y la m ism a le re to rn a r el valor o valores asociada con ella. El p a r cla ve / valor se oncuentra alm acenado en u n a estru ctu ra sencilla deno m inada DBT. -D a ta Base Thang- que consiste de u n a referencia a m em oria -e s decir, un p u n te ro - y la longitud del correspondiente tram o de m em oria reforenciado, m edida en bytes. La clave y el valor pueden se r do cu alq u ier ti po de datos. La longitud de los dato que se puoden alm acenar es p rctica m ente ilim itada, a condicin do que cualquier valor pueda caber en la m e moria disponible del sistem a (m em oria RAM tsica). Por ejemplo, ii uno quisiera crea r u n a baso de datos que co n tu n e ra los capi tulo do esto libro, los poros clave/valor podran ten e r ni siguiente aspecto Clavo__________ Valor_____________________________________
U'X)
Oos Tros Cual/o Onco

Compilacin d e programa
Contro del txoccao ce compilacin: ol make do GNU Acerca del proyecto Procesos Sertaios

y asi siguiendo. Las bases ce datos DB aceptan tres tipos de mtodo do alm acenam iento y acceso: B -irea, dispersiones ( hasties ) y registros. Las bases de datos b asa das en registros alm acenan sus datos do longitud fija o variable en orden se cuencia!; so puede in se rta r nuevos registros e n tre registros existentes o agregarlos al final de los mismos. Las bases de datos basadas en hashea a l m acenan loa registros en u n a tab la h a sh p a ra p e rm itir una bsqueda r p i da. La funcin de h ash puede se r su m in istrad a por el program ador o se pue de u tilizar la ru tin a in teg rad a al compilador. Las buses de datos B -tre e alm acenar, sus datos en orden preestablecido. 1 sentido de la ordenacin est determ inado por u n a funcin su m in istrad a por el program ador o por u n a funcin p red eterm in ad a quo clasifica las claves de m anera lexicogrfica. La figura 10-1 m u e stra cmo escan relacionados e n tre si los tres tipos de al m acenam iento y acceso.

I
2 0 5

Captulo 10: La API de base de datos

5 - t o
< 0 6 _ B T *E B

3 3

*5

37

\ \ \ ; i ///
rT r T iR il

C8.HA3H)
1- *ry. .vau_1 2 3-*v_3.VW .3 *-

f^ccm

Nur-.C'*' Q i'a b sje O 0.BCNO ?

4 - e ]fJV v afcjg ^S
7 *vy_7*W j 9

F ig u ra 10.1. Cmo son alm acenado* los rehuiros er. las bases do dalos DB o Berkeley. La verdadera implemcntac-.n de los mtodos de alm acenam iento y acceso quo admit. DB d o n los alcances de este libro (en verdad, muchos cientfico* especializado* en informtica dedican toda su carrera a estu d iar algoritmos de ordenam iento y de bsqueda), pero los principios bsicos son simples. La figu ra 1 0 - 1 m uestra u n a base de da to q u e contiene ocho registros, indicado por les nmeros uno h asta el ocho. U na base de datos de tipo B +trw alm acena Ion dntni formando una estru ctu ra sem ejante al tronco y l s ram as du uri rlxil rerbol), tal como se m uestra en ta figura 10-1. E sta disposicin logra quo ubicar un registro especifico sea extrem adam ente rpido y oficionto. Los bases de datos de tipo h ash alm acenan !oa datos en una tabla. La ubicacin do un reg u tro individual en la tabla depende de un valor arbitrario que se com puta basndose en la d a v e del reg atro . L as bases de datos onontadas a nm ero du reg a tro alm acenan estos ltim os en orden secuenrial. Los registros son accedidos y m anipulados por su correspondiente num ero de registro

Creacin, apertura y cierre de una base de datos


P ara em plear u n a DB se debe in d u ir en el cdigo fuente del program a el a r chivo de encabezado <db .h > y vin cu lar al cdigo objeto del mismo JLibdt). a ( - ICO) C ada fu n d n DB re to m a coro si tier.o xito y un valor distin to de cero si se produce algn error. E n ei caso de un e rro r de sistem a, ta l como un argum ento no la to o un e rro r de disco, DB re to m a un valor en e r r n o que puede se r utilizado en conjunto con la funcin p e r r o r . Otros cdigos de re torno irn siendo docum entados a m edida que se vayan explicando la s fun do n es que los generan.

206

Programacin en Linux

C r e a c i n y a p e r tu r a d e u n a b a s e d e d a to s

La fundn requerida para crear una base do datos DB es la nusm a que se nece sita para abrirla. db_opon Si la base de datos especificada no existiera. db_open la crear y luego la abrir. Si la llamada tiene xito retornar el valor 0 y n caso contrario cualquier otro valor. La sintaxis de db_open es la siguiente:
:nx d&_jp9i<cor3T char f i le , 03TVPE typs, u_int32_t fla g s , i n t rod. D 9 _W COm v . O0JNFO 'cbinfa, 06 -dbpp);

En ella: f i l e es la ru ta de acceso a la base de dato s a s e r abierta. t y p e e s u n a c o n sta n te d e tip o D8 TYPE q u e in d ic a el m tod o d e a cceso , e l cu a l p u ed e se r CBJ3TREE, D 8 _HASH, DB_HECN0 o 0B_UNKN0WN; esto
ltim o ?>! dcb<5 u tiliz a r s i no so co n o ce ol tip o do Ja b ase d*; d a to s e x i s t e n te q u e s e q u iere abrir.

f i a g s modifica ol com portam iento de db.opcn. S us opciones son 08_CREAfE. que crea cualquier archivo necesario para el proceso s; ste ya no exiaCittru; DB_RDONLY, que ab re la base de datos nlo p ara lec tu ra (cualquier intento de escribir a olla fracasar), y DS_TRUNCATE. que m iciazar lo datoa a 0 ai la boye de dato s ya exitiern El argum ento mode es un valor yetas que especifica lo perm isos de ac ceso al archivo que contiene la base de datos. Es sim ilar al argum ento mode requerido por la llam ada a sistem a o p e n .
u i Hait*}# *lst#ma opon y su tfgumento modo estn cubiertos en *i moto de un ar cnivo', p&fcina 134.

Loa parm etros dbenv y d b in f o controlan caracteriaticaa avanzadas del comportam iento de DB que se encuentran fuera del alcance de este libro y no sern cubiertos. Para obtener ei comportamiento predeterm inado de DB se le deber transferir NULL en lugar de cada uno de ios mismos. dbpp (database pointcr to pointer), finalm ente, es un handle o descriptor de base de datos a la base de datoa abierta, un puntero a otro puntero que apunta a nna estru ctu ra de patrn DB (base de datos). Si la base de datos debiera ser previam ente creada, dbpp ser inicializado por la funcin db_open al valor adecuado o a NULL en caso de que ocurra algn error. El handle o descriptor de base de datos que inicializa d b_open es la clavep a ra todas las operaciones de base de datos subsiguientes, porque casi toda la interfaz con a Berkeley DB tiene lu g ar utilizando punteros a fundones contenidos en el mismo.
C ie r r e d e u n a b a s e d e d a to s

P a ra cerrar u n a base de datos, utilice Ja funcin cise. El prototipo de la m ism a es el siguiente: Int CS-cl3 S9(!/3 'cb, u_ut32_t fiags); db es el handle retom ado previam ente por u n a ilam ad a a db_o p en . f l a g s debe v a le r 0 o DB_N0SYNC. D6_N0SYNC le indica a DB que no sincronice, o sea que no vuelque a disco los datos de la base de datos que se encuentren

>

Captulo 10 : La API de base de datos

207

presentes en m em oria an tes de proceder a cerrar !a m ism a. S: f l a g s es igual a 8 , los -datos p resen tes se r n escrito s a disco. PR E C A U C I N i C5_S05V,vC es una m sfc opcin! .3 8Jtc t jr 03 mantiene infarmac-n er. su propio zxf-? y ' a -racribc a o'-scc rcBOC Cienr^-ner'.? c e lo c j nticuo ol kem el. Si ^o so 3inz-'ce :z 3 otarr-acir c- -e^o>-a cc-- a se deseo obrenar una oase je datos no ccrf.afe. ircoc^sterey/o ccm.0' 3 .
)! E je m p lo

i l f H> CifMfto

E ste program a. a b r i r _ db. abre y c ie rra uno base de datos en el directorto com ento de trabajo. t-aer 3*1 srograii *a irurr.: oppcc.c / r
is r t - _ ( j c .: - A w rtu -'J y 5 0 t r :o f c io r r n -j una aass uo djto u a erko io y 28

I <jtaLit>..*v>
<**5o.n>

tlM . r t* <*rrno.R>
lA C li X ! * . *

W5 M ir ( 3 ia i

< 33 / H.t/iair o aascriotor J base di oacoi */ un rilor_rtcm flo;


v ilc r _ r * to r i* c * 3 6 j J 0 r ( '* e 5 t .3 0 * , Ca_3T'Rc.

0Q_CATC,
S ir - a r i '3 S _ c e n , l;

MJU.. H iJU. Sn cb ro_03);

Kt{6xrr_FAlW S;

} ob->clds*<0ufl:eroab, );
.itO C!T_3CCBS);

i La llam ada a d b_ o p en ira ia de a b n r u a base de dato s de npo B -tre e deno m inada test.d b er. el directorio corriente. Si la base de datos a n no existie ra, el indicador 0S_CREAT le indica a 0 8 que cree el archivo. Despus de a b n r (o crear, s: fuese necesano la has-e de datos, la llam ada a a b _ c io s e c e r r a la m ism a, ocendfc no produce u n a salida visible, pero un rpido ls en el directorio co m e n te de rrsbajo m u e stra que h a sido creada t e s t . db. A un que el archivo t e s t . db no contar a n con n in g n registro. B erkeley DB escribe en eila. en el momento de c re arla , a lg u n a informacin de tipo adm i nistrativo. Uno no debe preocuparse pe r ello, sin embargo, porque se tr a ta de informacin que =lo es em pleada por la A PI de bae de datos.

;
208 Program acin en U n u x

Para a ad ir registros a u n a base de d ato s se debe u tilizar ia funcin p u t. cuyo prototipo es el siguiente:
i r : C 6->pat(09 G_TXN t'xn ld , C-37 *k<jy, C6 v s - u e , j_ r.:3 2 _ t J l a ; s ;

b es un handle a una base de dat03 previam ente retornado por db_open; -x n id es un ED de transaccin, u n a caracterstica avanzada no cubierta en es te iibro, de modo que se la inicializar a N U L l . f l a g s debe ser uno de los si guientes valores: 0, que perm ite que u n registro existente que tenga la m ism a clave sea sobrescrito; D8_\OOVERWRITE. que invalida el p u t si se encuentra presente un p ar clave/valor oon la m ism a clave; o 0B_APPMD. que se utiliza slo con bases de datos del tipo DB_flCN0. p u t retorna D8_KEYEXIST si la clavo ya e encuentra presente; tam bin tienen lugar los cdigos e stn d ar do retorno. Para ase g u ra r com patibilidad con fu tu ras versiones de la Berkeley DB. uno siempre debe iniciaiizar los argum entos key (clave) y v a lu (valor) que. co mo se vio an teriorm ente, son dos punteros, ante3 de utilizarlos. La m anera ms sencilla de hacerlo es u tilizar la llam ada m em set de la biblioteca e s t n dar de C. Por ejemplo, supongam os quo uno necesite utilizar en un progrurna una clave denom inada d b k e y . A ntea de utilizarla, inicialcela ta l como lo ilustra el siguiente fragm ento do program a:
O0T c la v a , v a lo r ;

M S4!lAclav, .1, U o f (C 0 T 'clavo11; M t U v a l o r . 0. U o ff0 6 T 'v i l o r l i ;

En este ejemplo, memset asigna a todos los bloques de mem oria asociados con DBT el valor cero.
E je m p lo

is A
cjmplo

1 program a del ejemplo siguiente a ad e u n registro a la base de dato s c re da por opendb: m cabra (la! Drognuta an rn to w t: ocidii.s */ / aftioir^iJD iJtro .c Artato un registro a una D3se ce dttO l 3orceIay OB tinelua <staict>.n>
#includ* <s:o:c u rc lu d * <arro o .n > (Liclud* db.li*

it aatn(voKJ)
C6 punterojiD ;
i r r valor.re to rn ad a, i - a;
G8T c la v e , v a lo r ; v a lo r reto rn ad o o s c a n C t e i t . a n ', D3 3Tfl=, 3 3 CREATE, \56&a, S p u n ta ra jo i ;
w jl l .

NUU,

Captu o 10: La API de base de datos

209

v a le r

p9r.-cr{ dbooen*>;

6xit(sX:r_rAIWPSJ; 1
ic ia iix a r s rire ^ ; e l ss'" c la v e / v 3 lo r */

e*set{4cUve, 4, tecfelav#)); s=i*et<ivalor, a. aiiecf(valer]);


/ A s ig n a rle s v a lo -e s i c la v * y v a io r /

ciave.dtta * *uno :
c la v e .s lx e * iz e o f[ 'u n c * l:

valor.cata = *Cc*ci.aci0c de orograiaa;


v a lo r . n i* il2 a f{ 'C o a p ila c to n u erogr.OTa*)l

* *uac*rar i oar :iave/vaio r /


v a lo r_ r tc rn a to

5u itro _C 6 - o u tlC t).

NU LL, 4ky,

A v alu .

Cfl_NO0VJW RITS);

lf{valor_r#torrtaOC *- CejCSYSXISri (
f e r ia t f j j w e r r , Clave Vs ya H U C I l n ', (char *jclave,<int a j ; e n ? (G (:r_ F A iit* |;

>

{
c e r r o r ( 'p u f ) ; M ltta iT / A IU f lK );

e lo a jp u n te ro jjb ,

0);

lt{XrT_3UXSSl; ) O tra vez, este program a de ejemplo, s i todo funciona bien, no produce ninguna salida a pantalla. S in embargo, si se lo ejecuta dos veces consecutivas, la se gunda corrida fracasara porque ei valor de f l a g s , DB_\OOVERVfl I "E, impide la operacin de p u t si !a clave especificada ya existiese en la base de datos. En este caso, la salida dt* ta egunda corrida dol program a seria la siguiente:

jIlT o*

itesu lta de especia: im portancia o b serv ar que, en este ejemplo, los caracteres n u i l 0; de term inacin de la s cadenas uno y C o n p ila c io n d e p r o g ram as quedan tam bin alm acenados e n la base de datos, de modo que los m iem bros s i z e de c la v e y v a i o r deben equivaler a la longitud de las re s pectivas cadenas m s sims a r o s binarios de term inacin.

210

Programacin en Unux

Esto explica por qu razn el cdigo fuente del program a utiliz s i z e o f en lugar de s t r l e n cuando debi com putar la longitud de am bas cadenas (por supuesto, s t r l e n - 1 hubiera arrojado el mismo resultado). C O N S E JO
KabUuaimenre. os programas que utll ra 'a Berkeley DB no ag"3gon a la misma datos esttico, o sea estos compilados con ol programa. En cambio. >os registros se van agregarlo dinmicarrento en tiempo do ciccucin. El programa Oe Cemcstracn utiliz s ix e o f porque esta 'uncin ooera tjiftn con datos estticos (uno y C o n p iia c io n de programas). En tiempo de e|ecjc*n. sin embargo, para determinar la longitud do las cadenes cue componen as claves y os valores uno dobo util:ar llamadas a lo fyncir s t r ie n y aadirte 1 al valor retomaco a fln de tone*- en cuenta i cero binario de ferm-.ac!n Almacenar el ce.*o do terminacin junto o su ro*poctva coseno no es una coocxr.n obl tona, poro hacerlo 'e ocrmte ni orojjrarador utll w r las funciones de se ida ce lecuerci#* do caracteres ( r e .rn ) ce la oibiiotcca estanta' de C. tn es como p uts y p r l n t f . que equiere'* e cero Binarlo do terminacin (\C! para funcionar correctoniente o .l'rectamente para funcionar!.

Supresin de registros de una base de datos


P a ra su p rim ir registras do una base do datos D13, utilice la funcin dol. sta requiere cu atro de loa cinco elem entos que acopta lo fimciOn p u t. El prototi po de d o l a el siguiente:
tnt C8 d*l|0fl *05, 03_TXN tanto, CBr Key, u jflt3 2 _t f U g i ) ;

El significado de los argum entos ea asim ism o idntico qua en ei caso de la fun cin p u t. Como no 30 est interesado on esto coso an los datos, sino que slo le interesa la clave, no existe razn alguna p ara especificar el valor quo se quiero eliminar. La supresin de la clave elim inar su valor asociado. De momento no se han especificado valores para f la g s , do modo que sta deber ser igual a 0. Si la clave especificada no se pudiera encontrar, d e l retom a DB_N0TF0l)ND; en caso contrano, los cdigos retom ados son los habituales.
E je m p lo

El siguiente program a suprim o un registro de una base de datos:


/ seare a ; prsgrtas en Internet: oeldb.c /

UtM PlO

/
suprinir_regi.stro.c - Suprire un raqistro 3 b una tase Se oatos Be^eley 08

V
*irclude stdlit>.ft> firclude <stdio.n> mciude e rrro .n
? m c lu d e s t r i n g . : fin c iu d e t . p *

nt Min(voio) 08 'punterojjc;
m t vaiar_.-etcrna 2 o;
C8T c l a v a ;

Captulo 10: La API de base de datos

211

.3:< r rsto-nsas - o _ : o f - a e \

C8 C&ats,

io-.r<-o_5};
tflv4lo<*_rtorcado) {
perrcr('t&_oo*J;

su.1 . j a .

?*t!xrr_SAIi.^6); }
/ t n i c i m . - ar;n*ro la c in e / * r m t ( 4 c U v , , iu 4 f{ c la v )} ;

*U

lrti

< 5 v* p e rn o s liainar /

c i m . i t i * * ; : i a * o iz # t r l* r ( * u o o * > ;

E U * ln a r l r * g : tr o ' I v i:e .-_ r T C f-JC o - c g n :# r c j:o > a e l(o u n : ro _ d b , NUIL, I c U y t , 4 ); i # ( v * l c v t M m i a o CJiOrfCUKO) { / l a c la v a ro a*ll >

#prtrtCf(TO rr, C la v t Ha no n c o n tr a d '.p , (c h a r ic l a v u .a a t a f ,

ti;(an_FAlLURf);
) * 1 J * i f( ilo r _ r t o r n a o o ) J / O curra alflun o tro tip o o

rro r

G ^rrcrrcs!}; HtiXIT_FA!LLflE);

23->ci3itecrtrerc_J0. );
x tttD irjsu eccss);

> Si uno ejecuta este program a doa veces seguidas, en la segunda corrida ei mismo inform ar que la clave d eseada, uno, r.u fue encontrada:

Ci5vs i 7 -q no sncan^-aaa *,D* D espus de ab rir la base de datos, de Idb traca de elim inar ur. registro que tenga e sa clave, u n o . Si la d a v e ex iste, la llam ada a del La elimina y elimi na ei registro asociado cor. la m ism a. llam ada puede fracasar porque ia clave r.o ^cste, er. cuyo caso del re to m a D5_N0TFCUND. o porque tuvo lugar alg n tipo de erro r de sistem a. O bsrvese tam bin que el programa utiliz s t r i e n (* u n o ' ) - T para d e te rm in a r el tam ao de la clave, en lugar dei operador s - z s c f dei ejemplo anterior.


212

P ro g ra m a c i n e n Linux

Obtencin de registros desde una base de datos


La fundn ge* constituye la m anera m s sim ple de obtener registros de la base de datoa. La m ism a requiere que uno conozca la clave del dato que de sea recuperar. S u prototipo es ei siguiente:
in t 59t(D 5 -db . ca.TXN, * t x a c , 3 3 7 *Jty, DQT -d a ta . u _ in :3 2 _ t r i a s s ) ;

El significado y el empleo de todos los parm etro s de g e t son exactam ente los mismos que p ara la llam ada a p u t , excepto que g a t alm acenar su inform adn en la estru ctu ra referenciada por d a ta . Si la clave especificada no puede s e r encontrada, get re to rn a r DB_N0TF0UND. f la g s puedo se r 0 o D8_GT_80TH. en cuyo caso g e t recu p erar el p a r clave/valor slo 3 tan to la ciave como el valor coinciden con los d ato s sum inistrados.
E je m p lo

El siguiente program a recupera u n registro de la base de datos y lo exhibe.


IlM P tO

/ Norbre c e l prc<jr3na n I n t o r r a t : fls td b .c V

/*
o b : n * r_ r g is T ro .G - OEtflnar un r o g t r o d unB b9e de d ato* B rk l*y DB

*/
in c lu d * < t d li8 .h > in clu d * < jt o io .n > in c lu * <rrno.n > ln c lu d a < trtn g .h > * in c lu s db .h *

in t M Ln (vo id )

i
08 p u n t a n jjlb ;

in t v a lo r _ r a ta r n a c o ; C8T c ia v e , v a lo r ;

va lo r_ re to rn a d o * d b _ o p e r r c e s :.d b , 08 a r t C , 38 CftEATE. 5C 0, NULL, 4 flyn tero _S0 |; lf( v a lo r _ r a to r n a d o ) { p a rro r(*d b _ o p en *);

n u il ,

et|EXir_FA[LlfiE}; >
/* I n t c i a l n a r o r la s r o a i par c l a v e / v a l a r /

MOSatClave, 8, 91290r(Cl3V*));
w n s e :| 4 v a i a r , }, j i z e o f ( v a l o r i ) ;

.*

.i

>

'

.1

> 213

Captulo 10: La API de base de datos

/ Asignarlas valores a clave y valar /


CU ve. sata = uo ;
clave.size = 5Trlfir(*uno*l - t ; v a lc -.c a t = Cccilatiort * orograeas*; valer, s u * strlen ( *Cc-3ilacio 3s srcgranss') - t ;

A ls a c e o a r

s i

p ar

c la v e /v a lo r

ilo--_r*tom *So o u flta ro j

> flet(pw itrojfl6, NUIL, 4clava, iv a lo r . 8);

l? (YalG.-_r8 icrr .350 ~ CSJ'CTrOUC)


f o r in tf ( 5 tc r .- , e ls 9 'C i v f *s r< e n c 8 fitra d a \n * , (c h a r J c la v e .3 a :a ) ; i f 'v a l B ^ - e t c r n a d o )

0rf#r<* 9 * f ) ;
< lu

p r ir t f ( * 6 1 * t o llm c s f lt f O 5

( c h ir J v a lo r.C a ta );

P W W O J >>Cltt(0\iAt*rOjai), );

n;t(atT_SQC55) La salida de este program a es ia siguiente:


l .1 o O ttr rj* Q is tro 1 tita ilu c A M c
M

Ccaplliclon

i* ^

_____
i a l io a

P ara aseg u rarse que la operacin que vaya a realizar g e t tenga xito, el program a prim ero aade el registro quo luego va a obtener. De nuevo, i la clave especificada no ie puede e n c o n tra r o ai ocurre algn otro tipo de error, el program a exhibe un m ensaje adecuado de erro r y term ina. Si todo salo bien, la llam ad a a g e t alm acena en. la e stru c tu ra v a l o r los dato s que co rresponden a key , y ei program a exhibo en p an talla dicha informacin.

Navegacin de una base de datos


Er. el ejemplo an terio r ge vio la m an era de en co n trar un registro especfico, dada su clave A menudo, sin em bargo, uno no conoce la clave de lo que est buscando o bien desea recorrer la b ase de datos e ir viendo, sucesivam ente, cada registro. La base de datos B erkeley DB ofrece un puntero lgico, deno minado cursor, que uno puede m over h a d a ad elante y hacia a tr s p a ra reco rrer la base de datos. A ntes de efectuar operador.es con a i cursor asociado con la base de datos, s te debe ser creado. La correspondiente llam ad a p a ra hacerlo es c u r s o r , cu yo prototipo es el siguiente:
0 3 -> :u rs c -.23 '<&. C3_*XX 'u n a , D6C "c u rs a ra , u_int32_t fla g s );

214

Programacin en Linux

C u rs o r crea un cursor denom inado c u r s o r p que referencia la base de datos db. c u r s o r p es. lo mismo que el handle retom ado por db_o p en , u n handle de bae de datos, excepto que en este caso se lo em plea slo paro operaciones relacionadas con el cursor. Como habitu alm en te, t x n i d debe equivaler a NULL. f l a g s debe se r siem pre 0. c u r s o r re to m a los cdigos DB e stan d ar de error com entados al comienzo de este captulo. P ir a desplazar el cursor por la base do datos, lo mismo que p ara o btener ul registro quo el o c u s jo est sealando, s e debe utilizar la llam ada a c _ g e t. cuyo prototipo es el siguionte: Oa.;u-iOr->c_3t<06C curso.-, D6" clavo, 08r valor, u_int32_t flags C _ g et recupera de la base de datoa un p a r clave/valor utilizando el cursor dado por cursor, quo debe de h ab er sido m icializado por u n a llam ada a Dfi->curaor. Los valores cnmunuQ p ara f L ags (indicadores) er. c _ g e t se lis t n en la tabla 10.1. Tabla 10.1. Valores habitalos para Flags en c jt e t _________________________ Valor do flags _______ Significado_________________________________________
D B _ F IR S T DB_l_A$T DB_ n XT DB_NEXT_OUP Dfl_PREV 08_CURHENT DB J 3 E T 3_SET_RANGE Retorna do la baso do datoa I primor regntro Rotorna do la baso do dato& ol ltimo registro

Reterna do lo base de datos el siguionte registro {o el efmero, si ol cursor acaba de ser notorio) Retorna ol siguiente registro quo oon un duplicado do reg s;ro corriente Retorna de la base de natos ei registro previo

Retorna do la oaso ue datos ol registro corriente Retoma oe la oaso de datos e! regisvo que coincida con le c a ve surrvmstrada Retorna el registro 06 menor orden que sea mayor o igual quo la clave suministrada

Tam bin so puedo u tilizar el cursor p ara a a d ir pares clave/valor a un base de datos por medio do la funcin c _ p u t, cuyo prototipo es el siguiente: 08cursor->c_p-t(0SC 'cursar, D 3T *clav*, C8T valor, u_int32_t fl4C$l C _put alm acena el p ar clave/valor referenciado por c la v e y v 3 lo r , respec tivam ente, e n la ubicacin de la base de datos sealada por c u r s o r . E: com portam iento exacto de c _ n u t se halla controlado por f l a g s , que puede adoptar uno de los siguientes valores: DB_AFTER, que agrega ei registro in m ediatam ente despus dol registro corriente, DB_8EF0RE, que lo aade in m ediatam ente a n te s del registro corriente, o DB_CURRENT, que reem plaza el registro corriente con el nuevo. El p arm etro f l a g s puede tam bin adoptar los valores DB_KEYFIRST o 9B_KEYLAST a fin de cre a r la p rim era o la lti m a de u n conjunto de claves duplicadas, si la base de datos h a sido configu ra d a p ara que pueda adm itir elem entes duplicados. E sta configuracin de u n a base de datos de medo que perm ita claves duplicadas constituye un te m a avanzado, que t encuentra m s all del alcance de este libro.

Caoiuio 10: La API de base de datos

215

Como sera dable de esperar, la lla m a d a a C _ d 9 i elim ina el registro corrien te Su prototipo es ei siguiente:
O0e^rjor->c_dHO0C *uror, -J_:nt32_: U ^ s j;

c _ d e i elim ina do la base de datos el reg istro corriente, retom ando loa cdi gos e st n d a r e e rro r o 06_<EYEMPTY s i ei registro ya ha sido suprim ido. D espus de h ab er completado toda? ia operaciones con el cursor, pero an tes de proceder a cerrar ia base de datos, s * debe utilizar c _ c io s e para elim i n a r el cursor correspondiente a esa in sta n cia de procesamiento. Dicha fu a d a tiene el siguiente prototipo:
03C'..'tor-*c_clow(96C c u r w ) ;

D espus de h ab er llamado a c _ c ! o s e . ya no se puede volver a utilizar el hendie del cursor

Sincronizacin de una base de datos


Cuando se cierra una base de datos, todos los dutoa de la m ism a alrnuconadoa en m em ona son autom .lti enmonte descargados a disco M ientra# so tr a baja con la base do dates, uno puodc d e se a r asimismo volcar a diuco el conte nido do la m em ona. La llam ada n ecesaria p ara esto propsito es sy n c y o en cu en tra prototipada como sigue: ir.t 2 ytve{M *ia. u_ir:32_t fla<ja); db es un hanle de base de datoa retornado por una llamada previa a db_open, El parm etro f la g s no se Utili&a en esta ocasin y debe ser p u u a a 0. Por qu razn se debe utdixar sy n c? Supongam os que so h ayan aadido y supnm :do una g ran canudad de registres. En un sistem a muy recargado, uno debera llam ar a sy n c peridicam ente con o fin do asegurarse que la ba se de datos en cuestin sea escrita u disco p a ra e v itar asi alguna posible p r dida de dato*. La descarga a disco de o? dato s presentes en la m em ona cons tituye tam bin u n a excelente m anera de prevenir las prdidas du datos o la corrupcin de la base de datos en el caso, poco probable pero posible, de una cada dei sistem a o u n a sbita falta de -energa elctrica. De m anera similar, si u n program a ha .nstaiado un h anler (adm inistrador.' de seal para 5I3TERM. se debera llama r a sy n c (y probablem ente tam bin a C b ^ s lo s e ) p ara volcar a disco el contenido de la mem oria.
E je m p lo

E ste program a, c u r s o r , ilu stra alg u n as operaciones simples con el cursor de una base de datos, asi como tam bin ei proceso de utilizacin de la llam a da a sy n c . xotere -el prograu m Ir.Tgrpt: cursor.c l /*
- j t i l i l e s c - d e l cu rao r en jr .a j a s e i e c a t c s 8arsc.eUy 03

I
i if lC l Z

tliS-f1

iineli^s <strrs.K>
? L - c l.:* a a.b *

I
216

Programacin en Unux

Lit inivoid
f 03 *0u^tro_fc; 33C *cjr3or_cC; cer c U v , valor; int vaier_retornado;

v a lo r j- e t o n a d o * d0 jp #n ( t t t t . 4 b * , D3_3THEE, 06_CRATC, 0 0 , NUIL, WJLL, 4 C 'jn tero _ d a ); l* (v a Io r/a to rra d o ) { 0e r-cr<, ctcDn, } e x it ia :T _ f A lL U R 5 ) ;

\
/ Cr#ar L cursor / vi:ar_retornaoo pun:ro_<50 >cur3or(p;wtere_dD, V A L , ScursorjJb, 0 ) :

f(vilor_rAtorrado) {
perror|'cursor*);
x it ( 6 X IT / A I L U flf) ;
i

n*ose?(iciav, o. s l * c ffo la v )); n* nm (4 va lor. o, a lie o (va lo r> j;

/ O io p U u r t i ifrc u tr.c ia ln a n t* >ar la t a s * de d a to s /

*r.il*(|vair_rtornaao cursor_dO*>c_gat{cursor_aa, clave, Avalar,

Ce.NX)) I- OB_MOrF(XlNO| {
priotf|*E1 oar d ,w * / v lo r en V/*s\n\ {cnar icla va -d a ti, lear Jv a lo r.d a ta );

3 in c r o n u a r la oaso de datos /

3cn ro_dfc >sync((Xjnt8ro_dt>, *i};

/ C r-a r 1 cursor / cjrsor_a&->c_close(cursor_db(

/ Cerrar La saae <J datos / ?untro_db->close(P'jnt8ro_oa, 8|; ixitixrr_succssi


i

_______ ________

> )

>. )

)
217

Captulo 10: La API de base de datos

L a salid a de este program a es la siguiente:


S .1 curso r
s i p a r c la v e v a lo r s C iW / S a A a la s
S A L IO *

El ; r

c l i r t / v a l o r e s r e . 'b r o c e a o s

=: ca ' C l .e ,'v a le r e j 3c$

CQfltrol l proceso C9 c o n p ila c io r: 9 . aaxe ce GNU

1 e-ar c la v a / v a lo r es tre s fte e rc s

2L Proyecto

1 z i- c la v e /v a lo r es jnoCo*c;U<Lcn fl# Prc^-snas

Como se puede ver. al recorrer scuencialm ente la base de datos. SU3 regis tros estn, en realidad, alm acenados segn un orden basado en la clave de cada registre Luego de a b rir la b ase de datos y cre a r el cursor, el program a l la n a continuam ente a c _ g e t p ara o btener el siguiente registro de la m is m a y luego exhibe en p an talla ta n to la clave como su valor asociado. C uando C _ g et re to m a OB_NOTrOUNO. significa que no existen m s registros que re cuperar. La llam ad a a sy n c no es verd ad eram en te necesaria porque no se ha modificado ningn dato, pero se la incluye p ara ilu s tra r 3U empleo. Ob srvese tam bin que el program a c u r s o r c e r r a ol cursor de la baso do d a tos. C u rso r_ d b . an tes de proceder a c erra r la mism a Aunque esto no o obligatorio, el ad o p tar m edidas paro aseg u rarse de qu todo loa recurso asignados por la interfaz D 8 sean ad ecuadam ente retom ado al alaterna operativo es un buen hbito p ara so r desarrollado.
NOTA no m io r-a commjco eo tste caostuio. n ti iUo Weo corrcspondionto a oslo
.ero m

n nciuioo :re-r. w procramo J d d o r # .c (a g r o g a r jn a a .c ). pora artodlr

rastros a ia oate O 5*tos. Q m ivro forma pa/to de la makefllelwrnwoondiant o o#t c*p>ts-Jc. modo cu* *> lo 0UK>} coftipiior pora corrolew estos ejemplo*. 1 mis mo v y o ' j ai usuario irgresar Cinw re^at/os por ve/.

Lo que viene
E ste capitulo ha presentado al lector la base de datos Berkeley, que es la p ri m era de v a n a s A PIs de Linux que se irn aprendiendo. Loa dos captulos s i guiente? le m o strarn cmo u tiliz a r las ncurses p ara controlar la apariencia de las pan tallas en modo texto. El lector ap ren d er tam bin a in te ra c tu a r con el ratn, a cre a r m ens y a d is e a r form ularios.

Manipulacin de pantalla con ncurses


Este capitulo le p re se n ta al lector las ncurses (pronunciadas ene-curse."' unu iraplom entaan libre de la clsica biblioteca de m anipulacin de p a n ta lla de UNIX, c u n es. N curses proveo u n a interfaz sim ple do alto ruvol p ara el control y m anipulacin de la p a n talla T am bin contiene potentes rutinos p ara m an ip u lar el ingreso de datos desde el teclado y el ratn, crear y ad m i n is tra r m ltiples ven tan as y u tilizar m na, formularios y paneles Este capitulo cubre los siguientes terna*. Prestaciones de las ncurses Terminologa y conceptos relacionados R utin as p a ra im cializacin y term inacin Ingreso de caracteres y cadenas S alida de caracteres y cadenas Tbdos los program as de est* capitulo p u ed en ser encontrados en el sitiu Web n t t p : , vAv.ficp.C03 i n f o bajo el n m ero de ISBN 0789722151.

>

'

>

>

>

>

>

Programacin en Linux

Prestaciones de las ncurses


Las ncurses. cuyo nombre es en realidad u n a abreviatura e nuevas curses" son clones de libre redistribucin de las bibliotecas de curses que vienen in cluidas en la System V Ralease 4.0 (SVR4) de UNIX distribuida por los Labo ratorios Bell. E l nombre curses'* (que, a ttulo de dato anecdtico, significa en ingls "maldiciones") se deriva de la expresin "cursor enhancem ents o mejoras de cursor, que describe sucin tam en te lo que hacen las cu rses.
In d e p e n d e n c ia d e te r m in a le s

ncurses generaliza la interfaz e n tre u n program a de aplicacin y la p an talla o term inal en la cual se est ejecutando la m ism a. D adas las, literalm ente, cientos de variedades de term inales y pantallas, y en p articu lar la s diferen tes caractersticas que poseen y los comandos que las invocan, los progra m adores de UNIX necesitaban co n tar con u n a m anera de independizarse de la m anipulacin de p antalla. En lu g ar de verse obligados a red actar una gran cantidad do cdigo adicional p ara to m ar en cuenta los distin to s tipos de torm inal, m ediante las ncurses los program adores obtienen una interfaz uniformo y generalizada. Las API pura ncurses independizan til p ro g ram a dor dei hardw are sobre ol cual van a correr su s program as.
C a p a c id a d e s

Las ncursea le su m in istran a las aplicaciones en modo texto m uchas de lun m ism as caractersticas que se en cu en tran on las aplicaciones grficas de X Window: mltiple ventanas, form ularios, m ens y paneles. C ada v en tan a realizada mechante uno ncurse puedo se r ad m in istrad a de m anera indepen diente, puede contener el mismo texto u otro diferente, puede o no d esp la zarse. y puede so r ocultada. El editor V i y el popular adm inistrador de a r chivos M idm nht C om m andcr h a n sido oscrito3 utilizando ncurses. Los formulario* le perm iten al program ador crear ventana.! sencillas de u ti lizar p ara ol ingreso y exhibicin de loa datos, simplificando asi lo que habtualm onte constituyo u n a ta rea de program acin difcil y especifica de la aplicacin de que se tra te . Los paneles extienden la capacidad de las ncursea de m anejarse con ven tan as superpuesta y upiladas. Los m enus, que le pro porcionan al usuario una sencilla intorfaz p a ra invocar la opciones que ofrecen las aplicaciones, son im plem untados do m anera sencilla utilizando la sim pie y generalizada interfaz de program acin de m ens de las ncurses. La versin utilizada en este libro es la 4.2, au n q u e a la fecha de publicacin de! mismo se encuentra en su e tap a b eta la versin 5.0.

Compilacin de programas que incluyan ncurses


P ara compilar un programa que contenga ncurses, se necesita de las definicio nes de sus funciones y variables, de modo que se debe incluir < c u r s e s . h> en el cdigo fuente del mismo:
raluce cursa s.!

Muchos sistem as Linux hacen que / u s r / m c l u d e / c u r s e s . h sea un vincu lo simblico a / u s r / m c l u d e / r c u r s e s . h. de modo que resu lte posible in-

C apftuio 1 1 : M a n ip u la c i n d e p a n ta lla c o n n c u r s e s

221

ciuir < r .C u r s e s . tt>. S in embargo, p a ra obtener la m xim a pnrtabilidad de u n a aplicacin, utilice curses.h> p erq u , crase o no. ncurses no se encuen tr a disponible er. todas las p ista form as UNIX y afines a UNIX. Tam bin se necesitar n k ear las bibliotecas d e ncurses.. de modo que cuando se lia k ea se deber u tiliz a r :a opcin - I c u r s e s . o a ad ir - l e u r s e s a la v ariable L0FLA6S o a ia variable de entorno SLDFLAGS de rnake: S :a-s ^.-o g .c o :-.-_profl icurs*$ En los program as que em plean ncurses el com pilador tiene deshabilitada, como opcin predeterm inada, el seguim iento de errores, P a ra h a b ilitar la depuracin h a r falta lin k ear la biblioteca de depuracin de ncurses, n c u r s e s _ g . y ya sea llam ar a t r a c e (N) en el cdigo fuente del program a asignarle a la variable de entorno $?JCURSES_TRACE el valor N. donde N es un entero positivo y distinto de cero H acer esto obliga al compilador a enviar una salid a de depuracin a un archivo denominado adecuadam ente t r a c e (seguimiento), ubicado en el directorio corriente. C uanto m ayor aea el valor do N. m3 detallada, y per lo tanto m s volum inosa, er la salid a de d e p u ra cin. Los valores tiles p a ra N e stn docum entados en < n c u r s o s . h>. Por ejemplo, el nivel de seguimiento estn d ar. TRACE_OROENARY. es de 31.

r j r m i*i.o

li

E je m p lo s

1 Este es el program a m s sim ple posible utiiisando ncuraes. M eram ente arran ca y detiene el subsistem a do ncurses, no se genera n in g u n a salida. / *er oL 3r>jrjju sm ola.e / /
M n e tllo .e m i* n c lU 9 can tKuros

/ #;r:i.C9 <curtiid> irt uin{*oid) ( rtum ; > P ara compilarlo y ejecutarlo se debo tip o ar lo siguiente:
S ;c s u p l . c -o i u p l e lC u r u s

iA |0A

2 El prximo program a utiliza la biblioteca de depuracin y recurre a un par de otra.; llam adas adicionales a funciones a fin de g en erar u n a salida: - Moabr* dI 3'ojraaa i< - IflTerci: ae&ugit.c ( r
Se p y rad o - c * ? r c g r a
coa

o c u rso s

lla n a a t r a c { )

JtM P L O

*/

tinclMdt curses..'> ifit tuinirois; {

2 22

Programacin en Linux

W ltscr(); t ^ c t itracs. cau.sk arirtirCEstibiecB'- nivel de daouracion para T RAC=_CALlS );


n * rtn U ; rcturn 0 ;

> Las lincas de comandos necesarias para com pilar y ejecutar este program a son las siguientes: J 3C C Qouracor.s -o tpundor -lncursesj
S ,/dtpurador

...< 4 r~ ^
* A t i OA

Si uno es verdaderam ente rpido, ta l vez pueda ver el mensaje quo aparece fu gazm ente en la pantalla. La llam ada a t r a c e da como resultado que enda lla mad.! a una funan do ncurses seo escrita al archivo t r a c e que m crea en el di rectora com ente A continuacin se reproduce un Iranmuato de dicho archivo W CING M C U ftSE S vriten 4.2 (952213 prirw<*Em6Ucr nival aa dapurtciee par# TftACE.CALLS*, . . > caii* callad *a<Jdn:r|a0M?srB,*Sta0 lcer mvol de oepjracion para TfW C_CAUS*. i)
... c u rr * d t (AJWRVALJ

^*:urn callea *r*frein{a<Mfl75r8| clsarm j and uadatir-g tro r scra:sn Cirjpoataj) callad Clearscreeno callea sc'efln claarad uwatlng aereen trut 3cratch rttuffl i rransforra.ina(0 ) callad rransrornLine'i) calleo rransfornLira;24> callad rsturr 0 callea enominO
return 0 *

C O N S E J O

a c^Quts ae ncwttes viene con jn un, tracem unch, que comprime y .-esurr^ a nformacin de depuracin ar un 'om atc ms legiijie y amigable.

Captulo 11 Manipulacin de pantalla con ncurses

223

Terminologa y Conceptos
E sta p a rte explica algunos de los trm in o s y conceptos que aparecen fre cuentem ente cuando se com entan las ncurses.
T r m in o s

La palab ra p a n ta lla ae refiere a la p a n ta lla del term inal tsico fur.cionundu en modos texto o consola. C uando se e s t en un 3istem a X Window. p an talla significa una v en tan a de emulacin de term inal. Ventana ae utiliza p ara r e ferirse a u n a zona rectangular independiente exhibida en una pantallu. La m ism a puede ser o no del ma reo tam ao que la pantalla. La programacin con ncuree'. w apoya en doa punteros a estructura* de datos do patrn WINDOW ( decir, s t r u c t V/INOOW *) Fx* nombras de e sta s 08 trse tu ra s son. respectivamente, s t d s c r y c u r s c r La estructura tdscr reprftser.ta lo que uno ve en la pantalla Puede se r slo una ventana o un conjunto do ventanas, pero Ucna la p an talla Se lo puede considerar como unu pulo tu -.obre la cual uno pinta utilizando rutina de ncurses. c u r s c r contiene la idea do ncurses sobro el aspecto que tiene en esc momento la pantallu. I^ual quo s t d s c r . su tam ao es del ancho y a ltu ra do la misma. Laa diferencias entre c u r s c r y s t d s c r son las m odificaaooej que aparecen en la pantalla. R efrescar se refiere tan to a una funcin de ncursen ( r a re s tti como a un proceso lgico. La funcin r e r e s h com para c u r s c r , la nocin de ncurse3 sobre cmo luce com entem onte la p a n ta lla , con s t d s c r , copia cualquier d i ferencia en tre s t d s c r y c u r s c r a c u r s c r , y luego exhibe dichas a c tu a liz a ciones en la pantalla. Refrescar tam bin se r fiera al proceso lgico de a c tu a lizar la pantalla. Cursor, lo mismo que refrescar, tiene d as significados sim ilares, pero siem pre se refiere a !a ubicacin sea sta *n la pantalla o en u n a v en tan a ; donde ser exhibido ei siguiente carcter En u n a p a n ta lla (la p an talla fsica de un m onitor), cursor se refiere a la ubicacin del cursor tsico. En u n a v en tan a u n a v en tan a de ncurses . cursor se refiero a la ubicacin lgica donde sera exhibido el siguiente carcter. En este captulo, generalm ente, se utiliza el segundo significado del termino. P ara ubicar el cursor en u n a v en tan a las ncurses utilizan u n p a r ordenado de coordenadas (y, x).
D is p o s ic i n d o c a d a v e n ta n a

Las ncurses definen la disposicin de cad a v en tan a de m anera inam bigua" y predecible Las ven tan as son d isp u estas de tal m anera que la esquina s u perior izquierda posee coordenadas (0,0 >y la esquina inferior d erecha las coordenadas LiE-AS-I. COLUMNAS-1), como lo ilu stra la figura 11-1. n c u r s e s m antiene dos variables globales. LINES y COLS. que contienen lo . que es :dea de ncurses sobre ei nm ero de filas y colum nas, respectiva m ente, que corresponde al tam ao co rriente de ia ventana. E n lu g ar de u tili z a r e sta s v ariables globales, sin embargo, p a ra obtener el ta ma o de la v en ta n a donde se est trabajando en un m om ento determ inado se debe u tiliz a r la iiim ari0 . a la rn a n getrcaxyx.

>

>

>

>

>

>

>

>

224

Programacin en Linux

F ig u ra 11.1. Disposicin de una ventana con ncurses.


E je m p lo

Este program a de ejemplo utiliza g etm ax y x para obtener c u n ta s lneas y colum nas tieno la v en tan a corriente. r Ncitors <iai progr.iita fl tnw n gt: co b ,c *f r
*:l9ycolJnr.is.c CuntM flia o y colunnas tiono 2a vontana corrlonte?

/ a tic ludo <curtti.l tnt nain(voxd) < tr.t x, y; in ittc ro ;


g*o x yx m a sci 1 y, x ) prtntwfCantidad de linoas W \n ', yj ; ' o rirtf( Cantioad do coluwas - W \ n \ x|
r * fr a n ( ) ;

sleep(3);

4/idinl); rotum ; J La v en tan a que craa este program a ae encuentra ilu strad a en 13 figura 11-2.

>

) ) 225

r~

* F ig u ra 11.2. getm axyx retorna l n m ero total de lineas y de colum nas de una tntana
C o n v e n c io n e s s o b re n o m b r e s d e fu n c io n e s

Aunque muchas de laa fondones de ncurses estn definidos de modo de utili zar s t d s c r como opcin predeterm inada, exisrpn muchas 3tuacione on la cuales uno quiere operar en una v entana diferente a s t d s c r . Loa ncurses u ti lizan para sus runaa una convencin sobrw nombres .-latemtica y consisten tem ente aplicada que pueda 5er utilizado coa cualquier ventana. Laa funciones que pueden operar en una v entana de tam ao arbitrario llevan como prefijo 1 carcter y aceptan como prim er argum ento una variable (WINDOW ). Por ijemplo. la llam ada a n o v e , q u e desplaza el cur3or *obre s t d s c r , pue de se r reem plazada por / n o v e , q u e desplaza el cursor sobre u n a v entana especfica.

NOTA
& .*sad. -i mayor* Oe x i ^nacnei ouc son vftvoao pun> s to s cr ion p$<n;rio-r.ircione*.

Son rnecro* oe cm rxtm ilor oeflrntos ccn <-ra ckectlva dof Lno quo en laa ilnmoflaa a as Krcona espectfcM Oa .enanai -jalan std sc r como ventara prccetemiinaca. Eira os un dautfe da nwnereaddn *ocn* al cuai uno no an# per cu* preocuparsa. pero o poeco > t> u asr a aonvrtooer mnjor a cabxaca oa ncunas. Emtianoo desda la linca oe comnrdoa in nss jcongrep afin e* /usr/incluJ/ncur3es.fiief*.aiarfloigfttWenQual.ia rexsej utsuan macres y < sartr* tamo*n como un txn *mpo de uno dei croprccesodor De m anera similar, m uchas funciones de en trad a y de salida con ncurses tie nen formas que combinan un desplazam iento y u n a operacin de E/S en una dnica llam ada. E sto s m aonea propenden concatenan al comienzo en vez de al final) la expresin mv ai nom bre de la fu n a n y ias coordenadas (y, x) deseadas a la lista de argum entos. De modo que, por ejemplo, una move se guida de a d d c n s t r puede com binar los nom bres de am bus funciones y crear
a v a c d c h s tr.

El lector ya debe h ab er pensado q u e probablem ente ex istan tam bin funcio nes que combinan u n a E/S y u n d esplazamiento dirigidos a una v en tan a e s pecifica. Por lo tan to , waove y w a d a c h s t r equivalen a m v w a d d ch str. E sta especie e abre-.-ara ras rie se vigencia en todas las ncurses. La co:cin es simple y contribuye a p od er u tilizar menos lin eas de program :

)
228

'

Programacin en Unux

osio();

S . / in ic y tn in ^ c u rsB S

. i ---------SALI DA

Figura 11.3. Ventana obtenida con ncurses lucffo de ser tnictalizada. La declaraciones do funciones y definiciones do variables nflceuurias so en cuentran on < c u rse s.h > . Como no existen instrucciones p a ra el inicio, inicialico las ostructuras de datos de ncurses con la llam ada a i n i t s c r . (N or malmente uno guardara ei puntero WINDOW " que retorna C3ta funcin para uso posterior.) Por medio do la funcin p r n t w (cubierta .* n m ayor de tallo er. i.i prxima seccin), 1 program a exhibe alguna salid a en la v entana despus do haber Humado a r o r e s h para aso g u rar quo la salida aparezca realmente < ?n la pantalla. Luego de u n a pausa de tre s segundos, la llam ada a endwm, cubierta en ei prximo titulo, Term inacin d* ncurses", finaliza el programa y libera les rucursos asignndoa por i n i t s c r
Term inacin de n cu rses

Aates de salir de una aplicacin basada en ncurses, uno neetnita re to m a r al sistema operativo los recursos de m em oria que h u b iera asignado ncurses y retomar el terminal a su estado original, pro-ncuraes. Las funciones de inidazacin asignan recursos de m em oria y establecen on el term inal las con diciones adecuadas como para u tilizar ncurses. Por io tanto, uno tiene que liberar la m em oria asignada a tales nes y re s ta blecer e! termina! a 3u estado pre-r.curses. Esa ta re a la llevan a cabo las fun ciones de terminacin endwin y d e l s c r e e n . C uando se deja de tra b a ja r con una estructura de patrn SCREEN, y ancos de que ningn otro term inal p a se a ser el u-nr.inal comente, 3e debe llam ar en el term inal que se est por abandonar a sndwin y luego a d e l s c r e e n para lib erar los recursos asig n a dos al mismo para SCREEN, porque endw in no libera ia memoria asignada a las pantallas creadas por n e w te r a

I
C3C?':o 11 : Manipulacin de pantalla con ncurses 229

Si no se h a llamado a n e w te r n , sin embargo, y se h a utilizado nicam ente c u r s o r 7 s t d s c " . lo rico que se n ecesitar es u n a nic3 llam ad a a endw in antes de salir, endw in desplaza el cu rso r h a d a la esquina inferior izquierda de la pan talla y restablece el term in al a su estado no grfico anterior al em pleo de las ncurses La m em oria asig n ad a a c u r s o r y a s t d s c r no q ueda li berada porque el program a puede su sp en d er tem porariam ente los acurses llam ando a endw in, llevar a cabo alg n otro tipo de tarea y luego llam ar nue vam ente a r o f r e s h para re s ta u ra r la p a n ta lla a su estado anterior.
E je m p lo

M* L0

El siguiente program a de dem ostracin, n u e v o t e n n i r a l , ilu stra la niciaiiracin y term inacin de las ncurses por medio de new term y d e l s c r e e n . / Noera 4ai 2 ros<-iaa n r,temt: M tani.c ! /
v j c t re ir4 :.c - t n ic l a l ir a c i o o y S a ra in a c io n < $ e ncurses

/
iftClwOa < JW li6 .h>

#ir*clu
y tt *ain( volC)

SCAEEX *vantaM;
naartarttWAl, M O U t, parrr( Mwtirn*); M JU } (

ati:texiT_fAtcu*); }
if( ia t_ :* r a (v a n t* n a ) MJU.) C

(Jalieraan(vantana);

?a^rer(*t_:ero);
a * ittO IT _ F A lL ifl } ;

> 5rint<sta vectim n cjrsti nt u o :r93da aor newtarri\n | ;


r fr sn [J;

sleo{3); 3.-int(, "5r*tA*r a n c n U varrtanaVn*); rsre sa o j

Programacin en Linux

3 la e p ( 3 ) ;

fldir.(); 3sUcrser.iventanal ) La salida de es:* program a w parece mucho a la ventana de la figura 11-3. En si mismo, new term inicializa el subsistem a de ncurses. sim ulando e sta r intemctuando con u n term inal distinto. Sin embargo, la entrada de datos seguir siendo obtenida de s t d i n y la salida dirigida a s t d o u t. respectivamente, por lo que ios punteros a FILE para o u tf d y i n f d siguen siendo s t d o u t y s t d i n . Antes de que el program a pueda u tilizar s e r , sin embargo, debe convertira n rI term inal corriente: de ah In llam ada a s e t _ t e r n Si la llam ada iraca3, uno debe aseg u rarse de todos modos do llam ar a endw in y n d e l s c r e e n a fin de liberar la mem oria asociada con s e r ; a ello so debo la presencia dol cdigo aadido a n te s de la llam ada u e r r _ q u i t . Luego de dirigir alguna s a lida hacia el term inal", ol program a cierra ol subsistem a di* ncurses por me dio de la llam ada a delscreen requeridu p a ra ello

Rutinas de salida de datos


El subsistem a de ncurses cuenta con m uchas funciones poro enviar salid :i pantallas y ventanas. Resulta im portante com prender que las ru tin a s estn dnr de C np funcionan con las ventanas gen eradas por ucurses porque ncurses asum e el control de la salida al term inal. A fortunadam ente, las ru tin a s de E/S de las ncu rses'ae comportan de m an o ra m uy sim ilar a la de las ru ti nas de E/S e st n d a r presentes en < S t f li o . h>. de modo quo la curva de aprendizaje p ara as m ism as es tolerablem ente piaa. A los propsitos do s te anlisis, !.-< ru tin a s de salid a de las ncurses h an sido divididas en tres ca tegoras caracteres, cadenas y m iscelneas. Las secciones que siguen a con tinuacin com entan cada una de dichas categoras en detalle.
S a lid a d e c a r a c t e r e s

La principal funcin do salid a de caracteres de ncurses es a d d c h , protocipada en < n c u r s e s . h> como sigue: iit aadchcnt /pe cr>|; Casi tedas las dems funciones de salida de caracteres realizan su tarea m e diante llam adas a add ch . La funcin ad d ch exhibe e! carcter ch en la v en ta na corriente {habitualm ente s t d s c r ) a la a ltu ra de la posicin corriente del cursor y avanza este ltimo hacia la posicin siguiente. Si dicha accin fuese ?. colocar el cursor m s all del m argen derecho, esta funcin lo desplaza auto m ticam ente h a d a el comienzo de la lnea siguiente. S i el cursor estuviera ubicado en !a ltim a linea de la ventana, aparecer autom ticam ente ia lnea siguiente. Si c f fuera un carcter de tabulacin, o nueva lnea o de retroceso, el cursor se desplazar acordemente. Los dems caracteres de control son exhibidos empleando la notacin ' X , donde X el carcter de que se tra te y ei acento circunflejo (A) indica que el mismo es u n carcter de control. Si se nece

Capsule 11: Manipulacin de pantalla con ncurses

231

sita que si carcter ce control Heve efectivam ente a cabo su funcin se deber enviarlo a p an talla por medio de la fu n d n e c fic c h a r ( c h ty p e c h ).
N O T A

^3 30Cu-nefjor ce las 'curses ? refera a 'as caracteres peados en formato c h ty

ce c<xt\) *5 $ewjocy->sf*s* las x u r v declaran .3 es oseudoca-acteres canjo vao? enteros s-'- s j r o m too lo .-g .. emoa os &its superiores de ios rrismoa para orv atfcon*. taf con-o occ ejemplo sus gtnbutos de video. Esta cust'ncfOn t m t 2 se-.*cae:e'es y ca r c te r nrmeles de C lef tco cftar) uon>senta sutiles dlV?>-c.as 3 e ccrTserjiT^rto -*a ss fundones que administran cada uno de arreos i. res $3S d<erenci je corre<*t3r en este cootulo Cuando y donto resulto adaejodo

Corno se mencion anteriorm ente, m vaddch aude un caracter a la ventana que se le especifique despus de d esp lazar el c u n c r hacia la ubicacin desea da; sw rad d c h combina un desplazam iento y una operacin de salida hacia una v en tan a especifica waddch exhibe u n carcter en una v en tan a especificada por el usuario. La funcin e c ^ o c h a r y j u contraparte especifica para ven tanas. w ech o cfiar. combinan una llam ada a addch con otra llam ada a retresh o a w re^resH . E sta combinacin perm ite obtener im portantes mejoras de desempeo cuando se la utiliza con caracteres que no sean do control. U na caracterstica particularm ente til (que se discute a continuacin) do las rutinas de ncurses que utilizan la funcin C h ty p e para generar su salida de caracteres y cadenas es que el caracter o cadena a ser enviado puede ser objeto de una operacin de O logico. antes de ser exhibida, con una diversidad de a tri butos de video. Un listado p a rc ia l dichoa atributos incluye los siguientes: A_NCRVAL A_STANDOT Modo norm al de exhibicin de caracteres U tiliza el mejor modo do resaltado dol term inal Video inverso Texto parpadeante Medio brillo C aracteres en le tra n eg rita Texto invisible

AJUNDERLINE Subrayado A_fiVERSE A_8LINK A_DIU A_80LD

A _rwis

A_CKARTEXT C rea una m scara p ersonalizada de salid a del carcter Sin em bargo, y ;-egn sean La capacidad e em ulacin do term inales o el hardw are de la p an talla, puede que no todos los atrib u to s resu lten posibles o se exhiban correctam ente. Ver ia pgina c u r s _ a t t r ( 3 ) del m anual p ara obtener m ayor informacin al respecto. Adems de les caracteres de control y de los caracteres realzados con a trib u tos de vdeo, las funciones de salida de caracteres tam bin pueden exhibir caracteres grneos de lneas caracteres i e ia m itad superior del conjunto de caracteres ASCII, 128 a 255;. tales como caracteres de cuadros y diversos rlmboles especiales. L a lista completa de los mismos se puede obtener er. la pgina c j r s _ 2 ascr- <3 1 dei m anual o en los apndices de la m ayora de los

) ) 232

>

>

>

>

>

>

>

>

>

Programacin en Linux

libros de programacin. Los nom bres de as constantes em pleadas en Linux para designarlos em piezan todos con ACS <Ascii Character Set). A contigua cin se listan algunos de los caracteres grficos m s comunes. E n e sta breve lista, CORNER significa esquina. E l listado os ei siguiente: ACS_ULCORNER E squina sup erio r izo.uierda (+ ) ACS_LLCORNR E squina inferior izquierda (+ AC3JJRC0RNER E squina su p erio r derecha { +) ACS_LRCORNER Esquina inferior derecha ( +) ACS_HLINE ACS_VLINE ACS_8L0CK Lnea horizontal () Lnea vertical ( | ) Signo de nu m eral W U L=Upper Left LL= Lower Left B = U p p er Right LR=Lower Right

Las funciones doscriptas h a sta a h o ra artuden" efectivam ente caracteres t una ventanu sin incidir sobre la ubicacin de los dem s caracteres que y a se encuentran presentes. Existe otro grupo de n itin a3 quo in serta caracteres en ubicaconos a rb itra ria s sobre texto ex istente en la ventana. E stas ltim os funciones com prenden a m s c h . w in s c h . m v m sc h y tnvwinsch, Continuando con la convencin de nom bres com untada an terio rm en te en e s to mismo captulo, cada una do e sta s funciono* insoria un carcter d elan te (antea) dol carcter quo tic encuentre debajo do! cursor, desplazando los de ms caracteres una posicin hacia la derecho Si el ltim o carcter se e n cu en tra sobre ol nuirgon derecho, so perder. Obsrvese, sin em bargo, que la posicin del cursor no .10 modifica luogo de una operacin de insercin. Las inserciones e st n totalm entedocum ontadas en la pgina c u r s _ i n s c h ( 3 ) del m anual. Lo prototipo de las funciones m encionadas h a sta ah o ra so en cuentran en la lista siguiente:
Ir.t wdchtchtypfl ch|;

tnt #.n<icn(w:M>cw **111 , chtyp* en);


ir.t ivadtcnuiu y, int
a

chtvfl ChJ

int nv-iaacR|:N!>/ *wui. in t y, int x, citypo ch), int eciocharfcntypo ch); lrtt *cfcocnr|*INDQW "in , chtypa ch),

int mscn(cntypa ch); tnt mscrt (HINCO* if, chtyce c!j) int nvuiscniint y. ir.t x, c.ntype ch }; int avwin3cn(WIH0C m, int y . int x, cfttype en); Salvo indicacin en contrano, todas las funciones que reto rn an un en tero re to m a n OK si tienen xito o ERR fracasan tan to OK y E.RR como otras con stan tes m s estn definidas en <ncurses.h>). Los argum entos w.n, y , x, y en son. respectivam ente, la v en tan a en la cual se r exhibido el carcter, las coordenadas (y. X) on las cuales se ubicarn el cursor y el carcter a se r ex hibidos ' incluyendo los atrib u to s opcionales).

>
Cac.T-o 11: Manipulacin de pantalla con ncurses

),

233

A m a n e ra c e reco rd ato rio . i a i r a t i n a s cuyo no m b re se in icia con u n a > /" u ti liz a n u n p u n te ro w in , el cu ai e sp e cific a la v e n ta n a ta rg e t; el prefijo (nv" com bina u n a operacin c e d e sp la z a m ie n to h a c ia ia ubicacin (y, x) con u n a o peracin d e sa lid a

l T cmTT o

pos q u e v ien e n a c o n tin u a ci n ilu s tr a n e em pleo d e a lg u n a s d e las ru tin a s c o m e n tad a s e n e s ta seccin. P a ra lo g ra r a c o rta r e n a lg u n a m edida os ejem plos, ei cdigo d e im c ializa ci n y d e term in a c i n d e las n c u rs e s h a sido colocado e n u n archivo se p a ra d o , u t i l f c n s . C. T am bin ge in clu y e el archivo de e n c a b e z a d o 'u t i f c n s . h ) q u e c o n tien e e s ta in te rfaz . A m bos a r chivos so e n c u e n tra n en la c a rp e ta c o rre sp o n d ie n te a e3te c ap tu lo q u e h a lla u b ica d a e n ei sitio W eb q u e c o rre sp o n d e n a esto libro. El sig u ie n te p ro g ra m a ilu s tra a lg u n a s d e la s funciones d e sa lid a c o rre sp o n d ie n te s a la s n c u rse s. La fig u ra 11-'. m u e s tra Ia sa lid a d e caru ctere3 d e las m ism as.
f t e z n y r u i *n I r t f r n e t : O ir s c U r . c /
*

/
- Ft.c;c*s
48

ncurss cara

; a l i d a de

carct*rs

*/

I
t in c i n <ctrsti.ft>

incide*

irrso .

I-J K lwfl* Jtlifcr.J.n*


; r t uW(<ot<l)

(
ipp_lM t<|;
i fl O ftCX' i ;

IflicnC* . A.SEVcftSH avaccnt2. l , Z' . A_9X2);

e l r();
ifiaccjtajcf, X J;

ijc c n u ts c r , rs frts n O ; slt p (3 |; ip p _ e* ltn ;

A_?EV=RSj;
2 A_3CU3;

v3ecn{*:s3cr, 2, ?.

>

Programacin en Linux

F ig u ra 11.4. S a lid a de caracteres por m edio de ncurses. La ru tin a ad d ch da suliiia al carcter deseado y av an za el cursor. Li> dos llam adas a w addch ilu stran cmo com binar los atributos de video con el ca rcter a exhibir. El program a tam bin d em u estra una tipien fu n d n de las de nom bre comenzado con "mv". Luego do rofrescar la p antalla, u n a brevo pausa 1* perm ite a quien corra el program a visualizar la salidn del mismo. La segunda m itad dol program a m u estra cmo u tilizar ios ru tin a s especifi cas de ventana, empleando 3 t d s c r como v en tan a target
S a lid a d e c a d e n a s

Las rutinas do ncurses para salida de cadenas se comportan generalm ente de mandril am ular a las ru tin as de caracteres, excepto que tra ta n con cadenas de pseudo-caracteres o con cadenas norm ales term inadas en ceros binarios (\C). Inaisumos, loa diseadores de las ncurses crearon una notacin estn d ar que perm itiera a los programadores distinguir e n tre ambos tipos de fundones Los nombres de fundones que contengan en ellos la secuencia C h s tr operan sobre cadenas de pseudo-caracterts, m ientras que los nombres de fundones que contengan slo S t r operan sobre cadenas e stn d ar de estilo C (term inadas cada una de ellas en un cero binario). El siguiente es un Listado p a rd a l de las fundones que operan sobre cadenas de pseudo-caracteres: n: adacns:r(cors: chtype *crstr);
: n : a S d e m i t r c a s t cntype c n s t r , i n t n j; l r.z watfCCTsrriWlNOCW certSt cn typ e c ^ s t r ) ;

in t waaccwtstriwiNDO# * u i, c s n s t s h ty p t * c n s t r , ir.t n ) ; irte t v id S C jt r iin t y , .n t x. s o n st en ty e e 'c h s t r ) ; i r : j v a a c c m s t r d n t y , in t * , COnt en ty e e * c h s * r . i n t n ) ; I n t ivMic:-:nstr(WlHOCW 'w in . i a t y ,

in t *, con$: chtypa *cnstri;

in : iv w a o c c n n s'r'.n D iK w in, i n t y , i r .t x , co n $t ch typ e ' c i s t r , in t .i) ;

Capftufo 11: Manipulacin de pantalla con ncurses

235

Todas ias fundones listadas copian c h s ' r a la v entana deseada comenzando per la ubicacin corriente del cursor. perc este ltimo qo es avanzado (a dife rencia de lo que hacer, las fundones de salidas de caracteres). Si la cadena no cabe en la lnea corriente. Ia misma es truncada en el margen derecho. Las cuatro rutinas que aceptan un argum ento n t n -a d d c U n s tr, w a d d c h n str, - v a td c n r .s 'r y -rv w ad d cn n str- copian h a sta la cantidad de n caracteres, de tenindose en el m argen derecho Si n vale 1 ser copiada toda la cadena, pe ro ser truncada en el margen derecho si llegase a ten er que excederlo. El siguiente conjunto de funciones de sa lid a operan sobre cadenas te rm in a das en u n coro binario. A diferenda del conjunto anterior, e stas funciones avanzan el cursor. Adems, la cadena a la que 3e est dando salida co ntinua r desde el m argen izquierdo ds la ln ea siguiente, en lugar to ser truncada. En todo lo demi>, estas funciones se com portan igual que sus contrapar ton c h ty p e de nom bres emoiantes. ir : MCtncofl*: Z f * r MtrJ; int w an tr(cc/m Ciur **;p, iftt nj; t t t a$s:rfwjNOC* **m. cfwr M tri;
*>Sn 5 trttH O Cw ! * , o n t c h a r M t r , in t n ); l t 3 V M t - |t n t i .
ir.: in i y, v m c fiH rn iN O a t

Iftt . ic o ; c n a r * : r ; r | ;
:n : x, con*? w t y

:nar
in t

* jr. *.

tn t n |;

* * tn ,

o n * t cn a r

m *vwtfO0i*r(twOOS ia. u>t y, tu: * eonst Mr * itr, me n}; Recuerde s t r en estas rutinas es un arreglo e stn d ar C de caracteres te r minado en u n cero binario
E je m p lo

Este prugram a de dem ostrador, perm ite apreciar el empleo da las funciones para salida de cadenas de caracteres. / scao'-e el prosraa sn cu rjstr.c */ / rv:jrse_>2ii3iCM e^.c - ru fia n e s ca s a lica i m ;adaras de ea.-sc:ares d* 1.35 rvrjrtss */
* i r c i L -r ; < 5 io IiS .ft>

s . r z W : t < * r - '3 . - >

i^cluJe jtilc.'V.v int ir t n a , yt=x; IV

Programacin en Linux

E p a _ lr ir (}; g etn ax yxstd scr, ynax, x .Tax );

a d d s t . T U t i l i z a c t t f l 58 la a n i l i a l i n e (A C S J R .IH E , x n a x ); n v a c c jti* ( 3 , o ,

s t r (> \ n ) ;

* g s ; a c a d e n a a p a ro c o c a n a l e t a

\o * | ;

n v a d d n s :r ( 5 , . E s t a c a d e r a r M u i t a r e fr e s if) ; s io * D ( 3 ) ;

tru rc 3 d a > , n * , 2 0 > :

t ( V 9 n t a r a _ :e n p * n w v l n ? , 0 , ,

0 )> * H U III

,alir s i ercar(*!ieiw ijr); / 9r e qutt, on l a versin cruente en Internet */

J5vwadd5tr(v9ntana to n o , 1 , I ,

Esta ner.su]o oo fioria apa re cer on una nu*va

vntara*);
jnJJ(venT.ina_:onpl 0, toucnw.n|v.*ntana- te(tpl;
r ? r a H v o t a n a _ :e n p | s lP (3 J .

i, O, <1, 0. 8, 9, | ;

a o lw in ( v it n t a n a _ t io ) ; a p p _ * i.s O ;

> La Llamada :\ g etm axyx de la linca 14 obtiene el nm ero de filas y colum nas p ara s t d s c r . E sta ru tin a est h ab itu alm en te m plem entada como un macro. de modo que la sintaxis necesaria p a ra llam arla no requiere que tan to ynax como xmax sean punteros. La llam ada a mvaddnstr con un valor para n igual a 2 0 obliga a que la cadena im presa sea tru n cad a antea de la letra *f de truncada. Luego, el program a c rea la nueva ventana, ventana _tem p, con las m ism as dim ensiones de la pan talla corriente. Luego im prim e en :a nueva v entana un m ensaje, d ibuja un borde a todo lo largo de su p e r m etro y Uama a r e f resh p ara exhibirlo en p an talla. A ntes de term inar, la llam ada a d e lw in p ara la v en tan a recientem ente creada libera los recursos de m em oria asignados. La salida de este program a He m u estra en las figuras Ll-5 y 11-6.

>

'

'

>

Capftu o 11: Manipulacin de pantalla con ncurses

237

F ig u ra 11.5. Funciones Upo *strfj d e sa lid a de ncuntes.

F ig u ra 11.6. S a ltd a de une cadena hactc una ventana.


S a lid a m is c e l n e a

El siguiente y illum o grupo de ra tin a s de salid a que considerarem os es una sen e de que dibujan bordes y lineas, borran y establecen el fondo background) del sistom a, controlan las opciones de salida, desplazan el c u r sor y en v an salid a form ateada a a n a v en tan a obtenida con ncureea. E staa ru tin as de salid a m iscelneas com prenden una extensa v ariedad de funcio nes. E n e sta p arte se com entarn lo s m s com unes de ellas P a ra comenzar, se puede establecer las propiedades del fondo de u n a v e n ta n a por medio de ni Llamada a la funcin Dkgd (abreviatura de background, fondo o segundo plano), cuyo prototipo es el siguiente: m t skjciccns: cfltyp* caj; c h es u n a combinacin obtenida m ediante un 0 lgico del carcter que se quiere exhibir y uno o m s de los atrib u io s de video listados anterio rm en te. P a ra o btener el estado co m en te del fondo de u n a ventana, llam e a g e t bkgcJ, cuyo prototipo es el siguiente:
ckym

set50{TS0C *wn);

238

Programacin en Linux

En este prototipo w in es la v en tan a e a cuestin. Se pueden o btener las des cripciones de las funciones que establecen y obtienen los fondos de las v e n ta nas en la pgina c u r s _ b k g d ( 3 } del m anual. Existen ai menos 11 funciones de ncuraes que dibujan cuadros, bordes y li neas en Ia3 ven tan as obtenidas con ncurses. La llam ada box es la m s sim ple de todas; dibijja un cuadro en una v en tan a especificada utilizando un ca rcter p ara la s lineas verticales y otro p a ra las lineas horizontales. Su prototipo os el siguiente: im cox'wtsixw *wln, chtyp* verch, chtyp* h o 'C N ; v a r c h (vertical cAaracter) establece el p3cudo-carcter a se r utilizado p a r 3 tra z a r las lineas verticales, m ientras que h o rc h (horizontal rA aracter) hnce lo mismo p ara el carcter correspondiente a la lneas verticales. L i funcin box os on realidnd un raacro, y ea u n a simplificacin de la fun cin mito gonernl w b o rd e r, cuyo prototipo es: w t bord<*-iwNOW ' i r , entype l , cneyp* r, chtyp* to>, chtyp* as,
cntyp* t i . cntyp* c t r , cntyoe
b l

, cntyoe u r l;

Los argum entos de e sta funcin non loa siguientes, que son sencillos de re cordar teniendo en cuenta que corresponden a las inicalos de su descripcin en ingls: lS rs ts bs ti tu bl b* Coatado izquierdo Ueft aide) Costado derecho [right side) P arte superior (ludo de arriba'* o top side) P a rte inferior ("lado de abajo" o bottom side) Esquina superior izquierda (top-left comer) E squina superior derecha (op-right crner) E squina inferior izquierda (bottom-lcft. comer) E squina inferior derecha (bottom -right comer)

Tanto las funciones box como w b o rd e r dibujan un recuadro en la v en tan a a lo largo de su permetro. Utilice la funcin h l i n e p ara tra z a r en la v en tan a corriente una lnea hori zontal de longitud arb itra ria, v l i n e , anlogam ente, tra za en la m ism a una lnea vertical de longitud arb itra ria.
n;.r{cn ype e n , :n: n} n t vlna<chType en, n|

Siguiendo la convencin de nom bres p ara las funciones de ncurses, se puede tam bin especificar una v entana en la cual tra z a r lineas utilizando las fun ciones que se lista n a continuacin:
i r t ittlinai'ttlNOOw *wan, chtyp* cti, in t n}: in t 'w in, chtyp* en, nt n);

C s p fjic 11 M anipulacin do pantalla con ncurses

239

Si ur.o lo deseara, antes de dibujar la? co rresp o n d ien te lneas puede desplazar ei cursor hacia una ubicacin especfica por medio de las siguientes funciones:
ir .-.

T h l i ^ 'i n t

i.

i3 t

X,

cftyo<

cft.

m t a j;

ifl? w I : n ( i T y. irrt x. cntya* c*. m t

Con las dos A c io n e s siguientes se puede inclusive especificar una v entana y req u erir u n a operacin de desplazam iento: o; /nLl.slW W OO Ufin, ir? y, mt , cyp :h, mt n);
mt ovwvlm 1*1* 0 *m. int y, n t *. chtyo* en. inc n):

Como es h abitual, e sta s n itin a a re to rn a n OK r. tienen xito o ERR si fraca san w in indica la v en tan a tanjot; n especifica la longitud do la lnea, que puede alca n zar ei mximo de la v en tan a U n to vertical como hor.zontalm ent*. Las funcionen de trazado de bordea L in e . oox y b o rd e a no modifican ia posicin del cu rso r Las operactones do salid a subsiguiente:* pueden llegar a sobrescribir loa bordes, do modo que uno dobe aseg u rarse de ya soa incluir llam adas que perm itan m antener la in teg rid ad de los borden o establecer sus llam adas a las funciones de salido de datos de m anera ta l quo las m is m as no sobrescriban los bordes. Las funciones que no establecen especficam ente la ubicacin del cursor l i n e , v l i n e , w n lin e y w v iin e ) com ienzan a dibujar en la posicin co m e n te del m iso . La pgina del m a a u n t que docum enta atas ru tin a s es la C u rs _ D o rd e r(3 ) La pgina o u r s _ o u t o p t s (3 ) contiene asim ism o infor macin relevante sobre el tem a ultimo conjunto de funciones m iscelneas que veremos borran coda la pan* talla o p a rte de ella. Como de costum bre, estas funciones se en cuentran dispo nible' tanto en variedades p ara p an talla com pleta como solo p a ra ventanos:
1

mt mt mt mt mt mt mt mt

ent|voio); !); citar(oa); cieir!* *mj; clrto&otivow); cIrtoot(I>eO n o ): cl.-towMvoio); cirtcM lIK * *m);

El p a r de funciones e ~ a s e escribe espacios en blanco a cada posicin de una pan talla o ventana: ei p ar c l r t o b o t b orra la p an talla o v en tan a desde la ubicacin corriente del cursor h a sta la p a rte inferior de la m ism a inclusive; el par c l r t c e o l , finalm ente, borra la Unes co m en te desde la posicin del cursor h a sta el m argen derecho, inclusive. Si se h a utilizado 0*03 o VibKgd p a ra establecer las propiedades de segundo plano en ven tan as que se r n b orradas, ese conjunto de propiedades (deno minado 'rendicin* er. la docum entacin de las ncurses) es aplicado a cada uno de ios espacios en blanco creados, l a correspondiente pgina del m a nual p a ra e sta ; punciones es c u r s _ c l e a r ( 3 ) .

240

Programacin en Linux

E je m p lo

E JE M P L O

Este program a ilu stra el empleo de caracteres grficos de lneas y de las fundones b o x y w b o r d e r . A lgunas ru tin a s de salid a de las ncurses despla zan el cursor u n 3 vez que tiene tu g ar la salida, y o tra s no. O bsrvese tam bin que la fam ilia de funciones trazad o ras de lneas, tales como v i i n e y h i i n e . trazan de abajo hacia a rrib a y de izquierda a derecha, as que c u a n do las utilice ten g a cuidado con la ubicacin del cursor r NOTtcr? cel proaraoa sn Ints.-net: cur$bOx / r
c u r s e o x . c - F u n c ic f ls s d t r a z a d o d l i n e a s y <je c u a c r o s Que o f - e c e n c u r s e s /

/
n-.ncluo o < 3 t a li0 .lt > # Lnclw Jo < cur 3 9 3 . i 1> l ic L u d e <errno.fc> * tn c lu d e j t i l f c n s . h *

Int aaLn(vaid)

< un /a*. kmx;


p p U U t(l; g*i*axyx(td3cr, y x , xnax): nvaddchfa. 0. AC3_LC0R:SR); hUn<ACS_HLI.SE, xnax - 2>;
*vadacti{y.fitx I , 0 , ACS_Ll.COR.Scfl); 2);

n lrn iC S_m .:N E , ax

a v M flc n (|, ttax t , ACS_UftCQflNEB]; vlin e *C 3 _ V L IN , ynax 2 ) ;

flvvi-n*|1,

xnax

1 , ACS_VL!ME, ynax

. 2);

SY50Ccn<yiax - I , x.T.ix I , ACS J.RCOflNER}; n vorintw iypax / 3 - t , (xnax .30) / 2 , *&ordo d iC o jw o de ranura L a o o r io s a ') ;

r fra s n (); sle e p (3 ).

C le a r{);
tw x {3 td 3 c - ,
a c s v l ih g , a c s h l in s ) ;

>

) . )

> 241

Captulo 11: Manipulacin de pantalla con ncurses

y r.z t -2 f-ssn();

i,

a*

- 23)

/ 2 , * S c r;9 d ib u ja d o 35 n a -iara s f r i l l a j ;

1?

(3);

:l53r();
A C S.V '-fS ACS r t i n e A_3C'-0. ACS_VU?<E A _ 30 10 , ACS_HLIKE A 301.0, A _ 30 10 , i 3 0 0 ), ACS UtCOWEfl ; A 301.0, ACS UBC0RN6H
aJ b l d .

Acs_acofWf :

*cs.uccfi.ss?i : A_90-0>;
/ 3 t . (JOJ3X - 2 S | / 2 . - 3 0 r<it JiiU ja d O c o r c r o e r * ) ;

sI m o (J);

jc o .e x itu :

) Las figuras 11-7 y 1 1 - 6 m u estran la salid a de esto program a.

F ig u r a 11.7. Trazado de un barde p o r m edio de lineas. Como e ra de esperar, la uncin m v v lm e mueve el cursor an tea do tra z a r una lin ea vertical. D espus de to d as las complicaciones necesarias p a ra d i bu jar u n sim ple borde, la funcin b o x re su lta un verdadero alivio. La fun d n w b o rd e r es m s com unicativa que b o x , pero perm ite un control m s preciso sobre los c a ra c e re s utilizados p a ra d ibujar ol borde. El ejemplo ilu s tr el carcter predeterm inado que se em plea con cada argum ento, pero cualquier carcter (y sus atrib u to s opcionales de video) tam bin servir, siem pre y cuando el mismo sea aceptado por el correspondiente em ulador de term inal o el hard w are de video.

----------------------------------------- "

242

P ro g ra m a c i n e n Linux

F ig u ra U .S. Borde tn u a d o tiuartdo Uibordcr.

Rutinas de ingreso de datos


I-ia rutinas de ingreso de datos, tal como suceda con las rutinas de olida, com prenden diversos grupoc?. Este captulo so concentra, sin embargo, slo on entra da rencilla de caracteres y de cadenas por dos razonas. Primero y principal, las rutinas que se comentarn en esta seccin satisfacen ol 90 por donto de las ne cesidades de programadOn. Segundo, las funciones do ncurses para entrada de datoa son muy similares a sus oontrapartos de salida, de modo que m atenul del punto anterior se puede aplicar en este caso con mnimas modificaciones.
In g re s o de c a r a c t e r e s

Las funciones principales de ingreso de datos so reducon a tres: g e tc n , g e t s t r y scanw . El prototipo de g e tc h os el siguiente:
i r : getchivoioj;

g e tc n busca en el teclado uu solo carcter por vez, retornando dicho carcter si la operadn resulta exitosa o ERR si fracasa. Puede o no euviar el carcter obte nido a s t d s c r , segr. sea que dicha operatoria se encuentre o no habilitada on el term inal (por la misma razn, w getcn y sus variantes tam bin obtienen ca racteres individuales desde el teclado y pueden o no enviarlos a una ventana especificada por el programa). Para que los caracteres sean enviados a la p an talla o a una ventana, primero ae debe efectuar una llam ada a ech o en este caso, enviar ); P ara deshabilitar el correspondiente envo se deber llam ar a n o e c h o . Se debe tener en cuenta que. con el envo de caracteres a s t d s c r ha bilitado, loa mismos son exhibidos por waddch er. una ventana er. la ubicacin corriente del cursor, que luego es desplazado una posicin hacia !a derecha La cuestin se complica an m s por el modo de en trad a de caracteres que se encuentre vigente, e cual determ ina la cantidad de procesamiento que efecta el kernel sobre dicha entrada an tes de que el programa reciba finalm ente el carcter. Er. un programa que utiliza ncurses, uno generalm ente desea proce sa r por si mismo la mayora de las pulsaciones de teclas efectuadas por los usuarios. Para poder hacer eso se requiere ya sea una llam ada a e n ro d u operar en raw rnotie modo crudo). Las ncurses comienzan en su modo prede term inado, que significa que el kernel enva los caracteres a un bu/fer de me-

C a c i t o 1 1 : M a n ip u la c i n d e p a n ta lla c o n n c u rs e s

243

m ora, donde los va acumulando m ie n tras espera recibir un carcter de nueva h'nea an tes de tran sferir los caracteres acum ulados todos juntos a las ncurses. Uno raram ente desea este tipo de ingreso de caracteres. E n r n o d o c r u d o , el k em el no enva los caracteres a u n burfer a i los procesa de cu alq u ier otra m anera, m ien tras q u e en c -m o d e , el kom ol procesa los caracteres de control del term inal, ta le s como AS, AQ. *C o *Y, y transfiero todos los dem 3 a tas ncurses sin que s e a n perturbados. En algunos siste m as, la constante carcter siguiente*. A Vf puedo req u erir se r repetida. Se gur, sean las necesidades de la aplicacin, erm ode debera bastar. En uno de loe s i l e n t e s program as de dem ostracin, se utiliza erm otie y el envo do caracteres a s t d s c r es habilitado y luego deshabilitado con ol fin de sim u la r obtencin oculta de contraseas.
E je m p lo

E ste program a utiliza e n ro d y n c e c h o p a ra aim u lar un program a verifica dor de c o n trasetas.


s o t r t i i :<->3ra*4 / Crm cn.c /

/ ncvn_:> i-vxtr.z - ^ukOM 3 ncura* car ingreso < 1 * cnr.ictnr#5 I


incluea <itciio.-*>

lir-clx* tiacluCt <rmo.!v ix lu M VtilfeM.i* JHt MlPCrOi) < iflt c, i


in t

C;

r f l& x , f t i i ;

c t.tr

luco ptfittro.vw .w a;
a p c j in it o ; :n a e ();
; a : s a i ;j:c c r , ,n i, );

lf{{puBTro ntSiU >U_|


Inte.*''*:

suOfl(ttser, 2, *0, y-ux / 3, (xmx 4 3 )/ 2 )) " I* e r r j j u i t , sn la v r * U presente en

s * lir_ s _ * rro rfJu b w * | ;

)
*CS_ h l : \ c ) ;

& 5 x ( p m , A C S .W IH g ,

vjrt0Mtr(p<irv:ro_v*fltafU, . t , C ao trise s: *|

r.MCi*:!); r:s{(c = ?*::n{)) ! \n- U i < W *) { C32rjir-] = c; 3 dCc|purcero_vefftana, ); .-frssn{0rtXiro_/tsKa);

>

)
244

>

>

>

P ro g ra m a c i n e n Linux

* cftoo;
caden3{i] = *\0 ;

rr*fcisn<oi;rtero_veitar3);
nvw3rin:w<pumero_vsntar.a, I, I , 'Ss tio o : scxlauntarojentana, *CS_VIINE, ACS_HL>); i*fr9sr :untro_ventana|; cadena);

s lM p {3 ); delwtn{puntro_vencana|; aflojjxit ( l ;

Las pan tallas que crea este program a se ilu stra n en las figuras 11-9 y 11-10

F ig u ra 11.9. Pedido de contrasea y modo noecho.

F ig u ra 11.10. Exhibicin de contrasea.

.*

"

t
245

Capitulo i i : Manipulacin de pantalla con ncurses

In g re s o d e c a d e n a s

La fu n d n g e t s t ~ . cuya declaracin es la siguiente: i s t ; e t i ' c~-ir * str); llam a repetidam ente a g e t c r h a sta quo encuentre un caracter de nueva lnea o de retom o de carro '"que no fo rm ar parte de la cadena retom ada). Los ca racteres ingresados son alm acenados en s t r . Como g e t s t r no efecta verifi cacin de lim ites. se debera em plear en su reemplazo g e t n s t r , que acepta un armamento adicional que especifica el nmero mximo de caracteres a ser almacenados. Independientem ente d e que uno utilice g e t s t r o g e t n s t r . el buffer s t r de alm acenam iento debe ser lo jufirientem ente grande como p ara alm acenar la cadena recibida m s u n cero binario ( \ 0 ) de terminacin, que de be ser agregado por ei program a. El prototipo de g e t n s t r es ol siguiente: ipt 9*tfl*tf{cn*r *3:r, i r t i); g e t n s t r copia un mximo de n caracteres desdo s t d s c r hacia el buffer al cual a p u n ta s t r . C 3 d a carcter q u e q u iera se r ingresado despus de que se alcance el m jam o r. especificado hace sonar el tim bre de la com putadora. scanw obtiene ingreso formateado d e caracteres desde el teclado al estilo de s c a n f (3 ) la respectiva fam ilia de funciones En verdad, laa ncurnes tran sfie ren los caracteres recibidos como e n tra d a a SSCanf ( 3 ) , de rrnkio que lS ca racteres que no se correspondan con los argum entos disponible en ol campo de form ato sern deaechados. Como de costum bre, scanw tiene v arian tes que incluyen operaciones de desplazam iento (las funciones precedidas por mv") y v an a n te s que son aplicables a v en ta n a s especificas ras precedidas por aw">. Adems, la fam ilia de fundones scanw incluyo un miembro, vwscar.w, que opera sobre listas de argum entos d e longitud variable. Los prototipos do la mciones relevantes de esto grupo san lo siguientes: lt KMfim(cW *fn: {. jrgJ w t nncs-ia:*oai *in, :> * 'a t, < _ lu t v rg list); Las pginas del m anuai c u r s _ g e t c n ( 3 ) . c u r s _ g e t s t r ( 3 ) y c u r s _ s c an w (3 ) docum entan plenam ente estas ru tin a s y sus diversas v ariantes.
E je m p lo

V:re 5*1 sr-sg.-ja* *r. r

cursgstr.c /

ftcv.s_os::j-3ni.c Funciares ae icu riej pira ingreso e cadenas. / / Slt: x ii -v;rj_cotCiC9ii cadena */
t

irclue ol. <C j : .1 i^clt-de <rno.P> t inelj* <t'ing.> htcI.:* jtilfc.S.* fCafiTB tAM AO.SLf 20

246

Programacin en Unux

ln ; nain^ int argc, cnar *3f3v[])

(
Lie c, i * 3; cnar ca<Jna(23]; cftar pvatro_caoera;

a o o _ lo it (

crnouelj;

prirtf*('Archivo para a b rir: *l r * frs n (}; 3tn:r(ea4fla, rAVAioeuF); prifltw l 3* tlpao: xsln , endona); rfr*ah||;

Uep(3|i

ir<(pintro_ead#na - M lluclsi/oo f (citar) rA*wto_8F i ) ) n u il } ia U r _ n _ r ro r| nalloc'}; tncarne /

r *rr_q uit,

1 :a v#ralon proentf *n

p rm t* ( *lityrese su nc<iori>: *); rrr#sn<);


5 t:ntr{puniBro_cacr>a1 2 0 }

prin rW U tfrfl ingrato: x s w , puntaro_cadna); re fre h ()j sle#p<3>; reei3untoro_cacena); a p fljM U O ;

> La figura 11-11 m u estra el resultado de u n a corrida del program a. E n este program a el envo de caracteres a pantalla perm anece habilitado porque probablem ente los usuarios deseen observar lo que esten apeando. El program a u tiliza p nm ero g e t s t r p ara obtener el nom bre del archivo a se r abierto. En on program a real, uno in te n ta ra a b rir el archivo cuyo nombre ha sido tipeado. g e t n s t r ilu stra el com portam iento de las ncurses' cuando uno crata de in g resar u n a cadena m s larg a que lo especificado por la longitud m xim a n, en este caso 20. En ese caso, ncurses detiene la acep tacin y el envo a p an talla de los datos ingresados y la com putadora em ite un sonido cada vez que ei usuario in ten te in g resar u n nuevo carcter.

Captulo 11: Manipulacin de pantalla con ncurses

247

F ig u ra U A L Utilizacin de las ru tin a s de ingreso d<' cadenas de ncurses.

Lo que viene
E ste capitulo present ai lector la API do ncurses. a n a interfaz diseada p a ra poder controlar la pan talla en lo programa. de modo texto. Aunque Li nux es un sofisticado sistem a operativo da avanxuda. an poseo muchas aplicaciones en modo texto (no-CUI) q u e son muy populares, do modo que resu lta im portante com prender cmo re d a c ta r aplicaciones que m anipulen la p an talla un modo texto El prximo cap itu lo contina con la exploracin de las funciones de ncurses concentrndose en las qun son utilizadas para em plear color, crear m ens, acep tar ingreso de datoa desde el ratn y tra za r form ularios y paneles.

'

>

Programacin avanzada con ncurses


E ste captulo contina con lo iniciado en el captulo anterior. Explora m u chas de laa caractersticas av an zad as do las ncurses quo le perm iten a uno crear u n a in te rta ; rr.aa atractiv a y iencilla de utilizar en su s program as de modo texto E ste capitulo cubre loe siguientes tem a:

Utilizacin del 9ub3istema de color de las ncurses


Creacin y m anipulacin av a n za d a de ventaniw Cmo in te ra ctu ar con el ratn Trabajo con m tn s U tilizacin de form lanos y p an eles en progrumna m ediante ncurnea Todos loa program as de este capitulo pueden ser encontrados ti el sitio Web n t t p : / / * w * . c c p . c c n / i n f o bajo el num ero de ISBN 0789722151.

2S0

Programacin en Linux

Utilizacin de color
Ya se ha visto que las ncurses aceptan varios modos de resaltado. Como dato interesante, tam bin adm ite color de la "misma m anera; es dedr. uno puede efectuar un 0 lgico del valor deseado de color con los argum entos que corres pondan al carcter en un3 funcin addch o cualquier otra ra tin a de salida (c h ty p e ) que acepto pseudo-caracteres como argum entos. Este mtodo resulta tedioso, sin embargo, de modo que las ncurses tam bin disponen de un conjun to de rutinas p ara establecer los atributas de pantalla ventana por ventana. Tambin para utilizar las prestaciones p ara color do laa ncurses, uno debe ase gurarse de que el term inal corriente adm ita color. La fundn h a s _ c o l o r s re torna VEROAOERO o FALSO s<j{n 3 ea que el term inal corriente dinpon^a de ca pacidad para color o no. h a s _ c o lo r s tiene la sintaxis siguiente: bw l nt_color<(void); El tipo b o o l {booicano) de vaJor reto m ad o so encuentra definido en < c u r s e s .h > Los colores predeterm inado# de las ncurses son los siguientes: COLOR_8 LACK (negro, valor num rico l ) C0L0R_RED (rojo, valor numrico 2) COLOR GREEN (verde, valor num rico 3) COLOR_YELLOW .amarillo, valor num rico 4) C0L0R_8LUE (azul, valor numrico ) COLQR_\IAGENTA (m agenta o p rp u ra, valor numrico 6 ) COLOR_CYAM (cian o azul verdoso, valor num rico 7) COLORJVHITE (blanco, valor num rico 8 ) D espus de haber determ inado que el term in al efectivam ente adm ite color se deber llam ar a la funcin s t a r t _ c o l o r p a ra iniciar el subsistem a de color de las ncurses. El prototipo de la m ism a es: mt jcartj:aloi*<voi.aj;
N O T A

L55 p a r a m a s que u*jlzan rutinas c e color Os tas rvcu.'Ses deben s s r co rre o s en un e n a ^ o o r d e term ina c u e cep tt color, tai ccm o u r x t e r n , rx v t c nxtarm con co<Of.

A ntes de poder u tiliz a r colores, sin embargo, se deber inicializar u n conjun to de pares de colorea. Dicha accin asocia los p ares de colores a ios colores de la lista anterior. La funcin que realiza esto es i n i t _ p a i r , cuyo prototi po es el siguiente:
in r in it _ p a ir ( $ h o r t o a i r . sfio rt r , $ io rt 3 ) ;

E sta funcin a so d a p a i r con un color f (por foreground. frente o prim er pia no;. que represen ta el co3or de fuente, y otro de fondo b (por background, fondo o segundo plano;, y reto m a CK i tiene xito o RR si fracasa.

Capitulo 12: Programacin avanzada con ncurses

251

E n t u g a r d e t e n e r q u e e f e c t u a r p a r a c a d a l l a m a d a a c h t y p e u n t e d i o s o O l g ic o d e lo s v a l o r e s d e c o lo r , u t i l i c e l a s l l a m a d a s a a t t r o n p r o to tip o s d e e s t a 5 d o s f u n d o n e s a o n lo a s ig u ie n te s : i n t * ttr o < i! .i a t t r s ) ; ir: a ttro f* (n t i t t r j ) ; y a t t r o f f . Los

a t t r s p u ed e se r u n a o m s co m b in a c io n e s o b te n id a s m ech an te u n Q lgico d e co lo res y a trib u to s d e vid eo. A m b a s r e t o m a n OK s i tie n e n x ito o ER R ai o cu rre a lg n tspo d e error. E je m p lo E l a g u i a t progra m a traza sob re la p a n ta lla ln e a s do colorea
0*'. rogr*B * Intrnt: c o lo r .c . */
(IMPLO

fct* prog-*aaa m junto cor. ; o j d * l C a p itu lo t t v

r
s o le r .c - AC*lU*treio 3*1 c o lo r con ncunjt

;
ir c lu d # *-tello.n>

ilfC lu O * <cyrt.f*> incloe* <*rr*.n>


in c lu * < u n u t 0 .n >

li'd u c* *tilfcfl.n*
m t M iA ( o id )

ir t n, t u i , *ay,
y it BLAttOJtfOM)* 5.
tftir s y r tra _ t4 0 s ra ;

.SC \fOJG- 2,

3, Cl>.N_*EOAO- , S. t l. N B f lO - 7, AUASt'.I.O.SEGPO* 8

a p c _ in it();
D rtc r u r ir t i

t
{

u r* in a l

ic o it

c o lo ra s

if(lfu s _ c a lo r* ())

p r i it t* E a M ra fre in f);

t e r a i u l *e a a n t a c c l c r 'n * ) ;

sleep ta j; *Xlt;EX"_FAIUf!:;

>
In ic ia r i l : c o la r s= l a s o c u rse 9

i-* -su r recci n


In te rn e t V

flfi
rrjjy it, in .a v e rs i n p re s e n ta 9n

s a l i r 5i _ r r r o r ( 3 T r t _ c o l o r , t ;

E fe c tu a r i l 7 > - a ; 5 s 15 n a c 1cr.e s s ia p is a e p a re s 3 c e lo - ' ) m it _ S i- :* 5 > 0 J w fi0 , CC<.0*_9LACK, CCLCPLAOO; i r i : _ : i . - vSPCS.NSftO, CetP_Gft3<. CCL0RJ3LACK);

..
252

>

.1

Programacin en Linux

in i t j)aLr(ROJO_HEGRQ, COLORJ c O . CO LO fljW CX); lflit_D4ir(CAM _NE0a0, COLOlNr'AV, CC: - 0R_5W CK}; in it.Falr(gU N C O _N E5aO , C a O R JH IT S , cr,LCfl_3'-ACK): iritjjairlW AG EN TA JtEG R ), CCLCTJAGEVrA, COlCa_BLAC<,1 ;

Lit_fair(A2L_NEGfiO,

CO tO RJUJE, CCCR.BLACK?;

l.-u:_parfAJMfln.LO_NE(iHOt CCt.OR_r=LLO(, COtORJLACK}

;atnaxyx(3td$cr, naxv

xaxx};

i{(w ntoro_cadera - allocfsizeofnar> nsxxj) == SULLI s a ilr s i e r n } r ( *ali</C');

! g rr q u it, on la versin nr esente on Internet

lista

fcrtr. = i ; (i < 3; i**l { de la oQ. 250 /

/ Estos sor lo cdigos de los colores n ;a /* Ver *ibla de ACS en Cp. 11.

-enatiourtero c n d ^ i, ACS 0LOCX, naxxl; oaj. 232 ;

ffrcn(CLOR_P*H(n)> / COLCfl_PA:R ss un sacro yu* 9$ parte 00 las r.oi.-sBs. qu O tite valoras er.tre ! y 9, araos inclusivo /
o r:r.tw (* V j, 1 s u n te ro .c a d e r.a );

refreinO; }
sl(i#oi3>; 4PPXI()

*it(Ex:rjuccESS>. El primer bloque condicional do este programa comprueba que r;l torminal ad mit color :i fin de deridir .ii continuar o no; si el term inal no admite la aplicad in de colore ei programa tcrminu. Luego do micializar los pares de colores, oectila algunas asignaciones simples de color utilizando m i t j : a i r Despus, d programa dibuja lineas en el term inal, compuestas por el carcter 9 :.ACS_8 LOCK). utilizando nem sat y a t t r o n para establecer los atributos correapondientes do exhibicin para la ventana corriente, en este caso s t d s c r . a t t r o r 'f cancela el modo en vigencia antes de- pasar al siguiente par de colore.-,. Como de costum bre, las ncurses proveen un extenso conjunto de funciones de manipulacin de los atrib u to s de la exhibicin en ventanas. Los mismos estn totalm ente docum entados en la pgina del m an u al correspondiente a c u rs _ 2 t t . '\ Las pginas del m anual que corresponden a C u r s _ c o lo r co mentan con aumo detalle la interfaz de m anipulacin del color que ofrecen las ncurses. La calida de este program a se m u estra en !a figura 12-1. L am entablem ente, los colores aparecen en dicha figura slo como tonalidades de gris.

J .

) 253

C apraio 1 2 : P ro g ra m a c i n a v a n z a d a co n n c u r s e s

F ig u r e 12.1. ncurses usa color en u n a term inal de coloras apta.

Administracin de ventanas
U na de iaa principales v en tajas de las ncursea. adem s de la total ind ep en dencia que p erm iten obtener do los term inales donde 3e correr el progra ma. es s u capacidad de cre ar y a d m in istra r m ltiples ven tan as adom s do la s t d s c r provista por las ncurses E sto s ven tan as definidas por el p rogram a dor vienen en dos variedades: sub*voncanas y ventanea independientes. To das las ru tin as do m anipulacin do v e n ta n a s que se com entan en e sta se c cin e st n docum entadas on la p g in a del m anual cu rs_ w in d o w .
CONSEJO
EttesW conoe o ~3ga *o*ar *(wrfleamenw, a -c u n o mano|.in les cdigos tic wsrro f rr.r*ra r*jy cstrente: las tonctortes cue 'otoman un valor ntoro rotor*on OK v tfenm uto o E M * fracnuar, 'a i que retoman ounteros rfttornart NUIL en caso

de cue je oradme* u-i error Las sub-ventanas se crean por medio de la funcin sutjv/in. So denom inan asi porque constituyen ven tan as b asa d as en una v entana existente. A nivel del lenguaje C. las sub-ventanas 3a n p unteros a otros punteros que se alan a un subconjunto de u n a estructura, de dato s de patrn WINDOW ya existente. E ste subconjunto puede incluir toda ia v e n tan a o slo parte de ella Los subventan as. tam bin denom inadas v e n ta n a s hijas o derivadas, pueden so r a d m inistrad as prescindiendo do su s v en tan a s m adre, poro los cambios hechos en las v en tan a s hijas quedan reflejados en las ventana* principales. Las nuevas ven tan as autnom a* o independientes se crean m ediante la fun cin nemmin. E sta uncin reto m a u n puntero a una nueva estru ctu ra de p a trn INCOtf que nu tiene ninguna relacin con las dem s v entanas. Los cam bios efectuados en una v en tan a independiente no aparecen en p an talla a meno que se io requiera explcitam ente. La funcin newrtin aade al re p er torio de programacin potentes prestaciones de manipulacin de pan talla pe ro. como resu lta frecuentem ente el caso con el poder aadido, el mismo trae aparejada a n a m ayor complejidad. S e requiere que uno m antenga un segui miento detallado de la v en tan a y q u e solicite explcitam ente su exhibicin en la pantalla, en tan to que la actualizacin de las sub-ventanas es autom tica.

254

Programacin en Linux

S u b -v e n ta n a s La.i ncur3es cu en tan con dos funciones p a ra crear sub-ventanas. su b w in y d e rw in :


W IW X-W 'suCwin(WlNOOW ' b ' i g , : n n lin e s . Ifl o o s l s , rvt a e g ln _ y , : i t b * g ln _ x |;

afinccw *ccrv.:riwiniy;w -o.-tg, in t niinos. n t ncols, ln: 00 pin_y,


n : O flgir._xj;

su b w in y d e n v in crean y reto rn an un p u ntero a u n a v entana de n c o l s co lum nas y n l i n e s files, ubicada on ol centro de la v entana m adre referenciada por O fig . La esquina superior izquierda de la v en tan a hija se h alla locali zada en los coordenadas D eg in y, b e g in _ x relativas a la p antalla, no a la v entana m adre, derw in se comporta igual que subw in, excepto que ln ven ta n a hija se ubica en la ooordettadas b o g n _ y . b f)in _ x relativ as a la vontana m adre referenciado por o r i g . no a la p antalla. E jem p lo El program a siguiente crea una vontona hija, escribe cierta cantidad de tex to en la raxna y luego la desplaza por la v en tan a m adro, ilustrando as c mo las suo-voutunay pueden .ser a d m in istrad as con preacindnncia de sus ventanas m adre.
/ sofl'jri <joi pnorama *n Intornei;: sutr-in.c /

r
ua vantana.c - toxinas u tilita ria s u la uB-v*nt<m* / para gestin ae

V
ilr.c h .u o < 5 td lia.li> ifin ciu d * < c u n 3 .n > *;n cluce <errr.O-ft> ir s r lu o c <unist<l.n>

inclus uulfcns.ft,
in : nain(void)

(
WlitJCW *ventana_ni]a; in t y w x ,

xax, n = 0;

wbjcgd(5tascr, X > ; w re fr3 s n (s ta s c rj;

= si;Ewini3W scr, v i,
s a i i r ^ i j r r o f ^ 's u t r n i n ') ; in te rn e t ' / tokgdfventanajtija, 1 }; p rin tw v tn ta n a j. i j a ,

10, z, 3))

w ll)

I ' r r q m t , en la v e rs i n p re se n te en

*\flSUB-VSNrw<A\n');

C a e u io 1 2 : P r o g ra m a c i n a v a n z a d a c o n n c u rs e s

2 5 5

s m o

'

i j

39t-*s*.y s : : s : P llf n < t r -

y*at , 133J,
!) {

tvw in (v e n T 4 n a_ f!ja , l l y i u * ! / 2 1 , n ) ; r fr?a h (); s lM 5 ( i) ;


n 7 ;

>

tit|EXtT_flHlu); > Prim ero. la v e n tan a m adre se llena de X m aysculas, y luego so croa una sub-vontana on blanco de 10 filos por 10 colum nas. D espus de im prim ir on ella ia palab ra SUB - VENTANA, la ultim a p a rte del program a mueve la aubv en ta n a dentro de su v en tan a m adre O bsrvese quo como el contenido do la ub-vent-ana nunca cam bia, slo re su lta necesario refrescar la v entana m a dre. Debido a la n aturale^.i dinm ica de la salida de este program a, on la fi gu ra 1 2 - 2 slo se m u estra p arte de la m ism a.

F ig u r a 12.2. D esplazam iento de ur.a sub-uentar.a dentro de su ventana madre.


V e n ta n a s n u e v a s

Tai como se coment anteriorm ente, new w in crea u n a v en tan a que no g u ar da relacin con las dem s ven tan as p resen tes y debe ser ad m in istrad a de m anera independiente.
IV - l i n a s , in r c a i s , m i c a g iP _ y , i n i a e g i n j i ) ;

Programacin en Linux

new win crea y re to m a un p u n tero h acia una nueva v e n tan a de n c o l s co lum nas y n l i n e s filas- La esquina sup erio r izquierda de la nueva v e n tan a se fincueotra ubicada en las coordenadas b e g in _ y , b e g ir _ x . Si uno quiere efectuar u n duplicado de u n a v en tan a ex istente d eb er u tiliz a r ia funcin dupw in. cuyo prototipo es s i siguiente:
wrnocw aupwL'i<*:NDG# w tn i;

dupw in reto m a un p u ntero hacia un duplicado exacto de la v en tan a a la que a p u n ta w in.

Nwtbr d o i sroQ rana r I n t e r n a r n ev w ln .c

/
n iw w in .c
*\

a ijtin o ? u t i l i t a r i a s 30 la a n cu rocs para $ ? 3 tlo n de ven tan as

in c lu d o

< 5 t< J lib .i>

#incluCi? curse.. > nncluoo <orrni}.n>


in d u c e in ls td .n >

melude jUIfcns-h* tu ; naLnjvoiOl

(
v I hC k

p-.int4i'o_ventan;

U it /n a x, rax,

a p p .tn lt! ) ;

t r i l w l f l - a w w u t p , 3 0,

I,

1 )

MULLI

IOMrnc !

s a lir j:_ e r r o r |

/ r r j q u i i , en lo vo rsio r. pre*r.:e n NSV* V E N W W |; /* v e r TaDla an A'JS en Cap


11

n vvjrim w {puft:ero.,ven tana1 5 , 1 ,

s o m p u rts r o v r it w a . AC3 V L I , AC3 HUME};

V rrefrein(puritero_viptana>;
s ie e p (t);

n v w in ip u r.ra ro j^ a n ta n a , 5, ' 0 }

era=e<5 tascri; refresh(); wrafres?J{in);


sl< epi21:

C sq' u 'o 12: Programacin avanzada con ncurses

257

;5tci*yxtc3cr, yvax, xnax);

s-.Tni(*i.-. ,-ra* - ?3, ra* -3 1 );


H 'J - r S td S C r);

=?**( >: r 5"r= =-! 5.-ti-3_vr-tsn= ; *iwo(2);


9 l l r : c v t* r-:_ ' *tar* |

ipc_*itn: **:t{sxrr_cArLifit); } La diferencia principal entre este program a y el an terio r es que ste crea nuevas v en tan a s independientes en lugar de derivar sub-ventanas. Como re sultado. el program a debe ten e r cuidado de asegurarse de que cada v entana, s t e s e r y w in. sea refrescada y que lo sea en el orden debido. El program a es por lo u n to ur. poco m i extenso en -cuanto a cdigo pero al mismo tiem po le b n n d a al lector algo ms de flexibilidad porquo >o puede p rep arar una v e n ta na t luego hacerla aflorar ea el lu g a r debido con una nica llam ada o w re '-'Q sh . La pantalla cambia v a n a s veces d u ran te la ejecucin, por lo que la figura 12-3 representa m solo estado de la m ism a d u ran te ln ejecucin.

F ig u ra 12.3.

Al o v u n d o u n a v e n t a n a d e n t r o d e o t r a

Empleo del ratn


La capacidad de responder ai ra t n constituye estrictam ente u n a extensin de las ncurses a la APT e st n d a r p a ra curses. H abida cu en ta de esta aco ta cin, e s ta p arte m ostrar cmo in te rc e p ta r y utilizar las acciones que lleva a cabo el ra: n en los program as que em p lean ncurses.

Programacin en Linux

C ONSEJO
Cerro la interfaz oor les ratones no se verifica en otro am&to que no 593 el do 135 -cur ses. el lector so te te zscQirv Oe t&XV todo cd'gc relacionado con o: ratn cor. una ex presin < * ifd e f/ e ls e / ^ e rd if, de modo que e< programa r>o soa comprado en un si?, tema que no utce ncurses. Ce hecto, el mejor diseo es o! Que asle las secciones del ctf&o fuerte relacionadas con e< ratn en tan pocos mdulos de corr^> nacin coroclonaI ccrra restfte pcs&e (prefooOemento sio uno). Por ejenp-'o. para compilar de manera condicional ctfga para el ratn, v.T';ice una construocir que so asemejo a la siguiente; XC(JflSS_WUSE_VERSlCN

r
51 te aan Lis conciciones para tcoptar ol ratan ei cotigo que involucra al ratn l * u aqu

*I
ola*

r
Si el ratn no sudta&e ior aceptado Colocar aqui algn rotoo alternativo

I
endif

St el sistemo admito I uno dol ratn, m I f d o f ev.iiuiKft n 1 (vrroncero) y v ejecuta


ra la seccin do cdigo quo vwrne despus de M tfd o f, En coso contrate 'o auo so 0J0cutar sera 1 blequo Oe cdigo que viore denpua do *oiso

G e n e ra lid a d e s s o b re la In te rfa z d e ra t n

El procedimiento bsico a seguir pitra u tilizar la interfaz de ratn es razona blem ente simple. P ara h abilitar la deteccin de las acciones dul ratn se debe r llam ar a la funcin inousemasfc. Con el ratn activo, los lazos presentes en el program a debern e sta r atentos al valor retom ado KEY_M0US6 de w g etcn , que indica quo so encuentra en cola de espera una uccin del ratn. P ara ex tra e r la uccin de dicha cola de espera, utilice la funcin g e tn o u s e antes de efectuar la siguiente llam ada a w getch. Las acciones de rat n que se pueden in terce p ta r incluyen, segn sea el e n torno de programacin, las de p u lsar y lib erar cualquiera de sus butor.es. los clics, dobles clics y triples clics, y posiblem ente el estado de las teclas Mays, A lt y Ctrl. P a ra ingresar acciones del ratn, se debe esta r ejecutando ya sea gpn ( 1 ) , ol servidor p a ra ratn de A lessandro Rubini para la consola Li nux. o x te rm y program as sim ilares, tales como r x v t , que inform a de Sas acciones del rat n a travs del servidor X.

PRECAUCIN
-men'ao.eTente. la mayora ae las versiones do gpm, el contro&dor ce consola psra atn. oue nace funcionar el contrcacior de ratn de ;bs ncurses. estn inK.eadas con la biblioteca de clises BSD (li b c u r s e s . [ a. s o ). Como resultado de olio, o! cdigo diser seo oara administrare ratn 00 funciona adecuadamente fuera del c^Mro. Psra lo g re aue ircicre cor-sctamente. se ceoe descargar y recompiiar el cc.-go fuente oe as ncurses que viene cor a correspondiente distribucin y luego reconstruir ei caer-on y a Oibiioteca (lib g p a ) del gp>n. Unkendoia con las ncurses asi reoonstruicas.

Captulo 12: Programacin avanzada con ncurses

259

DETECCION OE ACCIONES DEL RATN

La tabla 12.1 iis;a iss acciones rc33 com unes de rat n que pueden se r in te r ceptadas. La us*-?. com pleta o encuentra disponible en la pgina del m anual
curs_ -!cuse (3 ).

Tabia 12.1. nfcrrrg de tas -curses scQn a c c c n e s de! ratn.__________ Nombre descriptivo
BUTTON1..PPESSEO 3UTT0N: _RELE>$60 BUTTOW..CLICKcO

Accin que es Informada


Botn *l<3e ratn iieoraco

________________________

Botn * leal ratn oprimido 3 otr * ld o i ratn efectu clic

SU TTON1_00C8L _CLICXEO Botan a m e : ratn efectu doote cifc 91TT0N1._Tfl[PL_CLICK9 Botn lfifll ratn fectu tnpie clic 9UTT0N2_PRESSc0 3ot*n *2del ratn oprimido Botn 20l 'a t n liberado Botn *2 gc< ratn ofectu elle

8u r r o s 2 ..RELEASEO
3UTT0N2._CLICXEO

3UTT0N2_00UBLE_Cl. IC<0 Botn 20o ratn efectu dco<e clic 5vTT0N2._ ? R IP L 6 _ a ICXEO Botn *2del ratn efectu tnpfe clc 8UTT0N3_RRESSE0 8 u tto n 3. .RELEASEO 3JJTT0N3._CLICXEO Botn 3del ratn opnm<jo Botn 3oi ratn liberado Betn *3cei ratn ofectu cilc

3UTTON3_OX.-8t.E_Cl. ICXEO Betn 3ooi ratn efectu doble clic 8UTT0N3._TRPLE_aiC X EO Botn *3 ratn ofectu tnpe ctic
SUTTON_S h I F T 3UTT0 n _C TR L 3UTTC'N_ALT Durarte el cam&.o de estado del {jaron estaoa oprimida ia :ecia Mays Durante ei cambio oe es:aoo cei botn estaba oprimida 13 tecla Ctrl Durarte el cambie oe estado de( oota estabn oprimas la tecla ajt

ALL_UOUSE_gVENTS Toces ios cirrcxts ae estaco ae IO S D e t o n e s RtPOfiT_UCCSE_POSmCN Todos ios desplazamientos dei ratn 1 botn de ratn =1 es el botn de la izquierda; el botn #2 es el botn del m e dio en un ratn de eres botones o el botn de la derecha en u n ratn de dos bo lones. e! botn de rat n *3 es el botn de la derecha en ambos tipos de ratn.
3 JJ j . E je m p lo

- :. i y , -^ 1
ejIM Pio

Este program a d em u estra el procedim iento bsico de intercepcin o interpretcin de acciones de ratn en un p ro g ram a ncurses. ' -.5K - ;s l o r a r a n an I n t im o s : s a n o u s e .C */ /*
- z . r u _ r .c 2=-2t5Tts : c . r i i s e n c i llo 25 -in te rc o c c ic ? 3= ic n o n a s da josc

>
260

>

>

>

Programacin en Linux

include ruases.?i> Ju x lu a e < t d iia .h >


# in d u c e e r r io .h n c iu d a < c t y p e * in c la d e t i l f c n s . h

in? am(vo:ci i
nra9*_t lascara;
MEVSNr a c c ic fl_ ra tc n ; In t c tx lig D _ a sc ii;

4D0_irilt I >: ccreax(); / Activa rodo soroak /


/* P a r n it t in t e r p r e t a r p u ls a c io n e s 39 t e c l a s y /* cSt-JO lecer 3tdSCr / k 9 y o a d |* M s c r. rnuE); o tgn a j ijo ra t n /

/ E s t a b le c e r la m a c a r a do a c c io n e s p ara - e q l s t r a r l a s tc d ss / r a s c a r a ncjs4n,in(ALL_MO-J5f-_EVEHTS, M U I);

/ O a c o d lfic a r a ccio n e s n a s ta que e l u s u a rio o p rln a n il ( 't o u p p o r ic o d ig o _ a 3 c i: Q etclM ))) I - *S ' l { t f ( C 3 * li$ o _ a K ii XEV_WjUSE| { ge:.TX iu seiA accion _raton |; i# L tc n ( a c c ic n _ r a :fln .p s :a c # J ( caso BUTTOSI_CliaED :

1' o

5 * / S a l i r /

prtntwi*Cllc con aoivit MI\n* j ; oreik; case aurTCH2 _ a : c K 0 :


p r m t ( * C l l c con ooton * 2 \ n >; b re a k ; case 8U7T&W3JXICKE0 : a r * n t w r C lic can botn M \ n ) ; b rea*; c e r a u lt : p rin tw |'A c c i n <ie ra t n no in t e r c e p t a d a ^ * ) ;

}
r o fr s h ();

i >
r c c o r a k {) ; a p p _ e x ltO ; D s sa c tiv a d o cb roak */

>

) .

} 281

Caotuio 12: Programacin avanzada con ncurses

9Xt{SXl T _ r A i . U S s I;

J
El program a establece el modo c b r e a k , de modo que la m ayora de las pul saciones de teclas p asar n por el controlador de term in al del kerr.el sin ser afectados. Keypad in te rp re ta la s secuencias de escape generada por los clics y orras acciones del ratn, lo que e v ita que tenga que decodificarlas el propio p ro sram ad er v su cdigo fuente se llene de montones de smbolos sim ilares a * [ (U# 1 ). D espus de configurar la m scara d e acciones del rat n p ara que ca p tu re to d as sus acciones, el program a in g resa a un lazo y aguarda alguna accin del ratn p a ra interceptarla. La m era accin de oprim ir uno de I03 tres botones del rat n g en era el m ensaje correspondiente; si la accin es otra, el progra m a im prim e un m ensaje de A c c i n de ~ a to n no i n t e r c e p t a d a . Tioeando s* o S ' se desactiva el modo e b r e a k y se sale del program a. La figura 12-4 m u estra la salid a o b tenida luego de oprim ir cada botn del ratn en orden de izquierda a derecha, y luego haciendo doble clic con los bo tone derecho e izquierdo.

F ig u r a 12.4. Intercepcin de acciones de ratn con la interfaz para ratn de. ncurses.
DETECCIN DE LA UBICACIN DEL RATN

Adem as de poder in te rp re ta r acciones individuales del ratn tales como clics y dobles clics, la API de ncurses p a ra rat n tam bin le perm ite a uno d e te r m in ar sobre en cul de las ventar-as e st ubicado e! ratn y las coordenadas c o m e n te s de su cursor. La funcin a n c l s e le perm ite al Lector d eterm in ar en qu v en tan a tuvo lugar la accin realizada por el rat n . S u prototipo es:
m o I frcios*<:vs} 3 n r .. iflz y. m : x );

.v e n c i s e re to m a vRCAOERO si la s coordenadas relativ as a !a p a n ta lla x e y se en cu en tran en ta v e n ta n a especificada por w in , y =ALS0 en caso contrano.

Programacin en Linux

P ara determ in ar las coordenadas en donde se ha llevado a cabo u n a accin del ratn, exam ine los miembros x, y y z de la e stru c tu ra de patrn MEVENT La estru c tu ra completa est definida como sigue: tysac*' struct < jfxsrt ta; f 0 ttinguisfiing itulto ls ice /
i1 '? *. yi i ; /* evw t coaroinates */ w733H_t ostate:
) WEVMT;

/ button stat9 b its */

Do acuerdo con la docum entacin de las ncurses (especficamente. Tian CUP3jn o u s e ) el miembro z se encuentra p resente p ara ser utilizado cor. las pantallas sensibles al tacto, los ratonen 3D, las trackbaih c y los (ju a n t para empleo on aplicacsones de realidad virtual. Por lo tan to no se recomienda utilizarla er. program as que operan lo con ratones convencionales.
E je m p lo

t J t M P lO

Est* ejemplo crea dos ven tan as sensibles a la presencia de un ratn. C uando uno hace clic en una de los ventanua, el program a exhibe en qu ventuna tu vo lu g ar dicha accin y m u estra las coordenadas correspondientes en In ven ta n a adecuada. / Vccr* el proflrtni en Internet: uaHWa#.C 'I r /
icu rstjM ta n 2 .c Progran* sencillo de intercepcin de acetonas ce *ouso ne niante n c u rm

/
lU n cluae < c u r s j.n >

*w clod <s:alib.h> #Uicluoa <arrno.h> include uniste.n

indita* <ctyp*.ft
# indude *jtilT c n s .n * in t M in j v o id l

< nnSK.t aseara;


ygvNT accion_raton;

W IK O O W ount6nj_ver.Tara; in: :a r 2cter_ascu; app_tnit();


ce < **a < 0 ; /*

Activa aoca

cDreaic */

C a p tu lo 1 2 : P r o g ra m a c i n a v a n z a d a c o n n c u rs o s

263

/ * E s t s l f c f a ta s e r * * j r ? 's t 5 s c - . TJ&J-J; c c T e r*$ a * r a t a o v * v o r im s ( 2 , t , ' in te rp re t a n p u lsa c io n e s Je t e c l a s y

' V c k 'a j \ i r t n ) ;

& *<st4 sc-. * c s * c s _ - i . t r < c > :

/ Csts&lKtr l a ua ventaba '


:f ! ( 5 c ' t e o _ r t r t i j * n t w t n fU . *3. '0 1 ) * HUU.) |

trro rC frw w iri'ij


lr t * r n t / itE x r r ^ A t u JK ) :

/ *pr q u it, en la v*rsxo pasante en

} ln {
y3*31 Ccmt ra_v ent ana, ffiUgl; vwprmt(p^'*.:*ra_4*ntana, 2, l , V&TANA 2 a0i(p^it*f0_vntfU, 4CS_VIINE, A C S H lIfiC );
w rtfrttti ( J M );

)
s t a o l c a r la a je a r a a a c c jo n t* p * r j r g u t r * r lJW te d a s /

u t c i r i - ecuienaiJ(AtL_CUS_6V81TS, M A L ).

/ D a c & a i'ic a r a ccio n a s u s t a au 1 u s u a r ia * f t i l f ( t o c p c * r ( e a r e t * r .a c u * g e r c a i ) ) )

op ^ i a i

* -S | {

if(c a ra c T r_ a ic :i *- KE'f_M0US) { g a - jc js t (ia c c ic n j-a to fl> ;


i ' ''c l i s a t p u l e r s _ * e n : a n a , s c c i o n j o n . y , a c c t o n _ r a ta n .x | ) ( ^ C *in r(p tin te ro _ven ta n a, 3 , t , v e r* a r a 2 \n * ): / r iP t ( 0 w ftte r 3 va n tan a , -i. i , A ccin s a t e e t a c a n

*i * Ise w K t t i c a

c . W ) , v . 5Ccior._raton.y, accion_-aton.< |;

9 l i 5 i * -c i s e a t e s a r , a c c io < !j* * to n .y 1 a e c io n _ r a :o n .x ) i { t v s r : n t ( 3 . t , A ccicn d t c ta d a en ventana i \ n * ) ; * v r y .t ( '* , 5 s c io o _ - a t s r .il; an l a s c o c ra s n a c a s a c c i.o fl_ * a t a r .y ,

}
so* s t : s c r , A C S vU K . C S _ r fl.:s ;!: sc< I i n , ACS_VT.:ME, ACS_Hi.:N);

>

>

>

264

Programacin en Linux

re fre s n (J;

*refresh(pontero_yptana); slesp<2>;

> aocDi'tC); r Desactiva rodo careak */ apo_exit();


e x it lB C iT W U f f S ) ;

La figura 12-5 m u estra la salida generada por una breve corrida de e ste pro gram a:

F ig u ra 12.5 Ubicacin de la ventana y u$ cw rdenadas donde w encuentra, el ratn, Corno se puede ver dol program a de domoatracifl, p ara utilizar el rat n so requiere un poco m s do acciones prelim inares quo lo habitual, pero ol cdi go do deteccin en $1 es muy simple y a cambio so obtiune un program a que acepta ingreso (je datos desde el rat n au n desde u n a v en tan a de consola. La estru ctu ra a c c l o r _ r a t o n es global al program a, y le diferenciacin do los miembro* de la estru ctu ra p ara o btener la accin del ratn es muy sencilla, tal como 3e aprecia en las dos llam adas a woncloHo. Ntese que ei programa tam bin utiliza las abreviaturas de fundn com enta da anteriorm ente, m v p rin tw y m vv/pnntw , pura reducir el numero de lineas de cdigo a itsr tipeadas. O b srv en quo las coordenadas listadas en la segun da ventana son relativas a la pantalla original, denominada VENTANA1 en e! programa.

Utilizacin de mens
La biblioteca de mens de las ncurses provee prestariones independientes de term inal para crear sistem as de m ens en term inales de modo texto. Las masmas incluyen funciones para crear y modificar tem s de men y para agrupar tems en mens. exhibir ios mens en !a pantalla y ad m in istrar v ah as otras nreracriones de usuario. Igual que con casi todas las ru tin as de las ncurses. antes de que se puedan utilizar los fragmentos de cdigo correspondientes a

>

J .

> 265

))

Captulo 12: Programacin avanzada con ncurses

los m ens se debe llam ar prim ero a L n i t s c r . P a ra poder utilizar la bibliote ca de m ens se debe incluir en el cdigo fuente el archivo de encabezado <"iervj. f> y lin k ear dicha biblioteca al program a utilizando p ara ello la s op ciones de iinkeo -lio e n u y - l c u r s e s . Los m ens son presentaciones de p a n ta lla que perm iten a los u suarios o p ta r por alg u n a accin o te n - n tre un conjunto de acciones o tem s posibles. La biblioteca de m ens de las ncurses o p era creando conjuntos de tem s que son luego agrupados y aadidos a los elem entos com ponentes de u n a v en tan a d eterm inada, luego de lo cual 3on exhibidos en dicha ventana. Uno puede tam bin q u ita r u n men de u n a v e n ta n a y ag liberar los recursos utilizados por el mismo. Desde la perspectiva de los lenguajes de alto nivel, el procedim iento para crear y u tiliz a r m ens se asem eja a lo siguiente: 1. Inicializar las ncurses. 2. U tilizar la funcin n ew _ item p u ra crear tem s de men. 3. U tilizar la funcin n e w jn en u p a ra c rear el men en sf. i. U tilizar la fu ndn pOSt_menu p a ra exhibir el m en en p antalla.

5. Refrescar La pantalla.
6. P rocesar los datos ingresados p o r u su ario en un lazo de comandos. 7. U tilizar u n o o s t ^ e n u paro q u ita r ol m en de la pantalla. 8. U tilizar f r e e _ n e n u p ara lib e ra r los recursos asignados al m en on s. 9. U tilizar f r e e _ l t e n p a ra lib erar loo recursos asignado a cada tum. 10. T erm inar las ncurses. A continuacin se listan las funciones y m acros necesarios p a ra crea r m e as. Las n-mm<v< se explican en d eta lle en los prrafos posteriores.
ITEM n * B _ i: e ( c e 'm e r a r # . :o n j * cnar a s r:e tlo n } ;

i*: fro_tt*i:TQi *); nemj . 'lu in t *r*_wny|tMj int ir t int nu); m t wj^criverfUEJiil m n , in t c);

iM EXj <.. ifltin: coI j )

n Q w _ iien asigna u n a nueva e n tra d a de m en y la inicsaliza a p a rtir de los parm etro s n an a y c J e s c r ip t io n q u e le son transferidos. R etorna u n p u n tero a u n nuevo ITEM o NULL s i so produce algn error. rfr 'e _ i t e c libera el espacio asignado en m em oria, retorna _0K si tiene xito,"E_3YSTE.M_E.qR0P. s i tuvo iu g a r alg n erro r de sistem a (en cuyo caso se d eb er evaluar e r r n o ), _3AO_AP.GMENT si se detect algn argum en-

266

Programacin en Unux

to que era Invlido por alguna razn, o E_CONNECTED si tem se encuentra a n conectado a u n m en os decir, ni> ha aido llam ad a f rge_m enu p ara el m en con el cual se hallaba asociado ese tem ). La E inicial de todas estas fundones corresponde a la inicial de EXECUr I0N!. new_nnu crea un men nuevo que contiene ei m en transferido en itetns. O b srv en que tem s debe e sta r term inado en NULL (ver el program a de de mostracin que viene despus). La funcin retorna un puntero hacia la es tru ctu ra de men recin creada o NULL si ocurre alg n error. f r e e j n e n u , a ia inversa, libera los recursos asignados al m en y lo disocia de tem s, que puede se r utilizado entonces en otro men. Los valores re to r nados por f r e e j n e n u son los mismos que los de f re e _ lte m . excepto que _C0NNECTE0 es reem plazado por E_P0STED, lo que significa que se esra tratan d o de lib erar un men que todava no ha sido retirado de la p an talla Las funcione p o st_ m en u y unpost jnenu exhiben y retira n el m en res pectivam ente, en la p a n ta lla asociada. C uando ae exhibe un m en es ncccsa rio llam ar a ref re3h o alguna funcin equivalente. Si tienen xito, am bas funciones re to m a n E_OK. La tabla 12.2 lista algunas condicionos do error adicionales a las ya m encionadas p ara f ree_item y t reejnonu.
Tabla 12.2. Errores retomados perlas fundones pQ5(_monu y unpost_menu.

Valor retornado
_6A D _S T a T

Deacripcln
La funcin fue llamada desde una rutina 3c mc.aiuaon o terminacin El men es demasiado grande para su ventana La funcin u n p o s t jn e n u fue llamada desee ura ventana don de ya se haoia quitado el men No hay tems conectados al men do

E.NO.ftOOM _N 0 T_P 0 S TE0

E_N 0T CONNECTSO

se t_ m e n u _ fo rm t establece el mximo tam ao de exhibicin del men. El mismo no ten d r m s que row s lijas y c o i s columnas. Los valores predeter minados son 16 filos y 1 columna. Como do costumbre, la funcin retom a E_0K si tiene xito o uno de los valores E_SYSTEM_ERROR, E_BAD_ARGUMENT o E_P0STED si ocurre algn error. ie n u _ d r iv e r , el verdadero ncleo de la biblioteca de m ens de las n cu r ses. adm in istra toda en trad a al m en basndose en el valor de c. Es respon sabilidad del program ador canalizar todas las e n tra d a s asociadas con los mens a m e n j_ d r iv e r El p arm etro c alm acena la accin o requerim iento asociados enn dicha en trad a. Los requerim ientos a menu_ariver caen en una de las siguientes tres categoras: R equerim iento de navegacin por el m en. C arcter especial KEY_M0SE generado por u n a accin del ratn. C arcter ASCII imprimible. U n requerim iento de navegacin corresponde a las pulsaciones de iss teciss de- movimiento del cursor, tales como ocha arrib a o flecha abajo. Los reque-

>

Captulo 12: Programacin avanzada con ncursos

267

rim ientos de KY_UOUSS son las acciones de ratn cubiertas en la parle Empleo del ra t n , tra ta d a an terio rm en te en este mismo capitulo. Los ca racteres ASCD im prim ibles gen eran u n a bsqueda progresiva rnea arrib a y men abajo para encootrar tems de m en que =e corres pendan, de m anera sim ilar a lo que hace Microsoft Windows. La lista completa de requerim ientos a r.e n u _ d r iv e r se encuentra docum entada en la pgina m e n u _ d riv e r del m anuaL En ei siguiente program a de dem ostracin so sum inistran algunas ejemplos.
E je m p lo

E ste program a crea u n m en sencillo con in a lista do cervezas M u estra c mo navegar m en arrib a y men abajo. (K M Pio I* H>*or# 3 l / I
< cu m i.it> #r Intem eir

uj**#mj.c */

w a jM ^ a .e - u t l l i c u n at le* iny* provisto 00* neurita

#LXiuC
tn c lu o *

l/iclyc* <c:yo#.P> ItncU rt* uxil^ cnj.n *

tn-; M ia|voi3|
i t K C C0*T : r r * c * < ir * :i [I

{ '3j:s*r*, MUlUr', Pj & st*. Scftlitz*, M GO', Ccorj'.


S M r r\
i;

* ? M r r , LCfl# S t a r , *Aair.tr*, C a rla o n , r . l

co*5t : m r *pcfltr<j_cervMss; m : c>3i$o_3sc:i:

Tai (c*rri*s)]; rrll 'pafttero.tteM iteas; i*


' I n c ia l a r TCvrsss * 5 C _ i* t();
'- T C z r e - .z r p o lsa c ic r .e s : s r a d a s p a r a c u r $ c r ;r u r c ic n * /

y23s-:cc.', T31S;; M t - y 3e ratn


'-t i~
;* t 3

/*

i t s m terprsTar pulsaciones 3e te d a s y

2 i ZSKJ '

* ; r '- . - : r - : _ : r r . = : a s = cervezas; D^tro_ca*veis: ou.-nero.cervszas - - )

) } )

y )

P ro g ra m a c i n e n U nux

'p u n : * o _ it ;n s ** = ,i9 w _ it e n ( * 5 u n t 9 r o _ c e r v e 2 a s , *W ftte ro _ i-:2 < i3 - NULL;

');

/ :r a r ?1 nenu y e s ta tl? c e r su foma*o / ni_U8nu * newjt#nu{itea3);

5a:_Tisnu_f:rnat(al_E8n'j, 5, t >;
Ubicar l Tanu en ia p a n ta lla y ro f.-s ca r esta u ltm a / CQ3t_nnu(ni_ner.u|; 'frssfiO ;

i ' A c o r r e r un l a io h a s w iju o l J 3 u a r c o u lse a o S ' filia ltau D C o r(c c< g o _ a jc:.L g o tc h () ) I* lf{ c c < ig o _ a s c ii =*
k y jx w n

I {

; ; c c d l g o j j s c i i * *EY_NPAG=

ieru _d P iv*r{n i_f*n u l r e q _ o c w w t b i | ; f l t{ c o ljo _ c ii K E rjJP ; KEY_?PAG)

rsn u jjr tv*r (tr1jionu, fi0_UP_ l TEM);

>
/* 3 # tlra r 1 nitmj / un poi:_nflu(nijM nu|;

/ L ib e rar r c u n o j ujigrtiiios n nonu y a Uc.t* do sunu 'I frc_,Tnu|ni_nn) ; foripuntaro ttons * xtuns; *punr.i>ro_lcB; puntcro_::onn**) frM _ L tti( *pu/i:ero_ltoa);

F i/ ia lt ia r la s ncur9es /

kypac(stOscr, FAlSE};
a p p _ x it ( J xitl=X IT_FA ILU fiE};

> La salida generada por u n a corrida de dem ostracin de este program a e m uestra en la figura 12-6.

> > ? ) )

)
269

C ap tu lo 1 2 : P ro g ra m a c i n a v a n z a d a co n n c u r s e s

F ig u ra 12.6. Utilizacin de la biblioteca de m ens de la s ncurses. La prim era cosa que realiza este p ro g ram a os crear un arreglo esttico de texto que se convertir luego en el m en , lo mismo que o tras variables que sern utilizadas. U tiliza la fu ndn k e y p ad p ara in te rp re ta r ias teclas alfanum ricas y las teclas de cu rso r Luego, recorre el arreglo esttico de texto, extrayendo cada una de las cadenas contunidaa en el arreglo y aadindola a la variable se alad a por p u n t9 r a _ it e m s . P ara crea r el m en, uno debe tran sfe rir itens a newjnenu, la cual re to m a u n puntero a mi jn e n u que ap u n ta i una estru ctu ra de men ad ecu ad am en te in id alizad a. La llam ad a a setjnenu_format de program a.
5. 11;

crea un m en que tiene anco filas d*> largo y una colum na do ancho, do modo que el program a puedrt demotitrnr cmo despiojara** h a d a arrib u y hacia ab a jo por el men. Luego que este ltim o ha sido creado y formateado, COSt_Tienu asocia a i j n e n u ccn s d s c r y se hace cargo do la ndm inifitraan de todas las tareas de refrescado y ci actualizacin de pantalla. Finalm ente, el prim er refrescado de la pan talla hace visible el men. En esa instancia, uno puede recorrer el m en h a d a a rrib a y hacia abajo por medio do las teclas de cursor flecha arrib a y Hecha abajo y de las teclas Av Piig y Re Pdg El ncleo de este program a de d a m o s tra d n lo constituye el lazo v /h i le E! m ism o recibe e n tra d a desde el teclado y la tra n sfie re a la funcin C 8 n u _ d riv e r , que es la que a d m in istra todas las acciones que conciernen ai m en. Si se presiona La tecla flecha abajo, por ejemplo, sta g en era u n a seal KSY_DCVN que m enu_dnver r e d be como REQJXJWN^ITEM, !o que le in dica a a e n u _ d r i v e r que resalta el siguiente tem h a d a abajo del m en. u n p o sr_ e n u , f ree_ ren u y el lazo f o r que libera cada uno de los tem s del m en reto m an al k em el loa recursos previam ente asignados. F inalm en te, e: program a term in a con las llam ad as a las fundones a p p _ e x it y e x i t .

Utilizacin de formularios
La biblioteca de form ularias p erm ite, en los program as en modo texto que em plean ncurses, la cread n de form ularios que resu lten independientes de les term inales donde son em pleados. El diseo de e sta biblioteca es anlogo

270

Programacin en Unux

al de la biblioteca de mens: la s ru tin a s p a ra diseo de campos crean y mo difican (os campos de los formularios. Las ru tin a s do form ular.os agrupan los campos p ara form ar los form ularios, exhiben stos en la p an talla y se hacea cargo de m teractu u r con. el usuario. Laa ru tin a s de campos son com para bles a i as ru tin a s de tem s de la biblioteca de m ens. m ientras que las ru ti nas de form ularios io n com parables a las ru tin a s de men. P ara u tilizar la biblioteca de form ularios se debe incluir en e cdigo fuente el archivo de encabezado < fo rm . h> y vin cu lar li b f o r m al cdigo objeto, co mo lo m u estra e sta invocacin de gcc: S 5^- B pi'og^fornulartc.c -O <5ro3_forwlari.o lo rt inciifS** El procedimiento general p a ra crear y u tiliz a r form ularios tiene el siguiente aspecto: 1. Im cializar las ncurses. 2. U tilizar ia funcin new f ie Id p a ra crear Ion diveraoa campos. 3. U tilizar la funcin new _f orm para cre ar el formulario, 4. U tilizar la funcin p o s t_ fo rm paro ubicar el form ulario en posicin 5. Rivscnr la pantalla. 6. Procesar los datos ingresados por ei u suario en un lazo de comando* 7. U tilizar u n p o a t^ fo rm para re tira r el formulario. o U tilizar f re e _ fo rm para liberar loa recursos asignados ol formulario 9. U tilizar f r o e _ ' 19 Id p ara liberar los recursos asignados a cada uno de loa campos. 10. F inalizar las ncurses. O bviam ente, el diserto de la biblioteca de form ularios sigue el patr n e s ta blecido por la biblioteca de m ens. L am entablem ente, sin embargo, oi lazo de comandos p ara f o r r a _ c r iv e r debe ejecu tar ms tareas que ei que fue empleado con la biblioteca de meng. La complicacin adicional vale sin em bargo la pena, en comparacin con ten er que escribir uno mismo su bibliote ca de manejo de formularios. Las ru tin a s listad as a continuacin, y explicadas en los prrafos siguientes, resu ltan suficientes p ara que el lector pueda com enzar a realizar form ula rios sim ples pero funcionales:
?:EL0 '.ItfUftt Hiont, tnt mdtn. i t toprcw, int lo 'tc o l, :n : ofscreer, i n : m u ffe rs ). in t *rre__leio(F;=!.0 f if c ; in t s t_ fitl _ ou f?9 r(fIE U > fie lo , in t C'jf, cans char v aluei; in t 3et_fi3lo_M*s(FSL0 m* opxs);
jq

inr set^UeifljiserptriFTEUl
/ais fi.dlO _i> ser3tr(FIE L O Ff i 8 l d J ;
FOMI v.*w_fomPIELD " f ia lt s ) ;

ssrptr);

C^pftuio 12: Programacin avanzada con ncurses

271

n t fr**_on(FCF* int o c s t . f o - ( P C f o n i . int unpcst_fOf*(FQ& f :* a );

int f c r _ r * s r . ' f f o a w ? : ' * , I r t c ; ne#_* - e i d crea ar. nueva campo de he g f i t las y w idth colum nas. E sta llam ada ubica la esquina .superior izquierda dei campo en laa coordenada 7 , x) especificadas por el p ar "oprow . l e f t c o l ) Si cualquiera e las filua del campo tu v iera que perm anecer oculta, se debor tran sferir s u num ero respectivo a c ' f s c r e e n . n b u f f e r s re p rese n ta el nm ero do bufors adicio nales a se r asociados con el respectivo campo. new _f i e l d reto m a un p u n te ro ai nuevo campo o NULL si tiene lu g ar a lg n error. * re e _ ? i e i d libera los recursos asociados con f i e l d . La funcin retom a E_OK tiene xito y E^SYSTEM^ERROR o _SAC_ARGUMENT ai w produce algn error. La S tn ical de todas estas fundones corresponde a la imrial de EXECUTICN. n e _ * o rn crea un nuevo formulario, asociando con ol mismo los campos presentes on f i e l d S y retom ando un pu n tero que seala la ubicacin del nuevo form ulario, o NULL si ocurre alg n error. f r e e _ * o r n libera los recursos asignados a r.flv#_ o r n y desvincula dol m is mo los respectivos campos. Si free.form tien e xito, retorna E OK. Si tiono lugar algn, reto m a E_SYSTEV_ERROR, E_BAO_ARGUMENT o E_P0STED. p c s t _ ' o r . exhibe el form ulario en su v e n ta n a , despus du una llam ada a r e f re 5 h o alguna fu ndn similar. u n p o s t _ 'o r'"! re tira el formulario de la ventana. E sta funcin retorna.E_OK s: tiene xito. Si ocurre algn tipo de error, re to m a r uno de los siguienteo valores: E SYSTEM ERROR. E_9AD AflGJUMENT, E_8A0_STAT. E_N0_R0CM, E_NOT_POSTEO o E~'OT_CONNECTEO. 5 e t _ ' ield_bu^^er* asigna el valor de la cadena al buer indicado por buf que est asociado coa field. Estoa bufiers son creados por el argumento nbuffera transferido a new_ l l d _ b u f f e r0 sa el que es manipulado por la biblioteca de inenus. Todo? los dems boffers deben ser administrados por el programador. s e t _ f a id _ O D ts perm ite establecer div ersas opciones Toda* las opciones vlidas p a ra * i e i d e stn activadas como opcin predeterm inada, de modo que opts contiene las opdones a desactivar. La tab la 12.3 lista las opciones que se pueden desactivar. s e t f i e l d u s e r p t r asocia a i*eld los d ates de aplicaciones transferidos a userptr. Dado que u s e r o t r es un p u n tero vacio, puede se a lar a cualquier tipo de puntero. i e i s u s e r o t r perm ite recuperar los dato s sealados por eld de s e t _ f i e i d _ u s e r p t r . que reto m a ei p untero a f i e i d . Tabia 12.3. Opctcnes ce e-'d que se ouecen desactivar._________________________ _
Opcin_________ Descripcin_______________________________________ _____________
0 _ V !S I3 L E C _ * C TIV E 3 campo es e*riC*dO. 3 campo ser visitado d u a nte el precesam-ento. Un ;amco invisible re puede Se' visitaGo.

contina

272

Programacin en Unux

Tabla 12.3 . Continuacin


O pcin
0 _P U 8 LIC 0 _ E D T OjVRAP 0_8LANK 0_AUT0SKiP O.NULLOK 0_S"ATIC C_PASSOK

D escripcin
Ei contenido ce campo es exhibido durante te entrada de 33tcs. El c3mpo puede ser editado. Las palacras que no quepan en una lnea pasan 3 la linea Siguite. El campo ser borrado Cuando so ingrese un carcter en su orrners posicin. Cusrvdo un campo so llor.a. pasar automticamente al siguiente. =>ermitir campos en blanco. Los Valida la fech3 slo

buffers para cada campo se fijan al tamao origina; del mismo. $< sta resulta modificada.

E je m p lo

La m ayora de e sta s llam adas se ilu stran en c ejemplo siguiente / NoaW* 39 I programa sn Internet: usefom.c */ /*
u i f l .f o r r t u U r i c s . C - !>9iro*tricton s e n c i lla de ? n p io de 'o r a u la r lo s

/ * ireludo :rclud #tnclu<J# :rciud nrc'.ufle

<curs*.h> <fonn.h> <$Wli8.h> <ctyco.n> 'utllcn,l>*

r ara tsprinc<) */

:n : n*in(vouti

<
FOBM (enrularlo; FIEU) *canpos(Si. tr.t co a ig o jia cll. 1 - 3 ; / In icia r las cursen / apfl.tnttO ; cDraakf). / Activa nodo cbreaK / /* f'ernitB ntararotar polsacionas de :a c ia y

'xaypacistascr, rsuE}; natcfls da ratn /

I C rtiaciM i de lo s c3npos d e l r o r n t l a n o /

cdtipoB(0 * n e w .fie M (l, 1 2 , i , 1 , 3, 0 ); 3et_ftaii:_auff8r{canpos3], a, Prinar noaare: ) ; set_iai3_Gpt3!C3BC038],

t leld^optscaapflsM ) 4 -0_ACTlV);

c a T c c s [t | = new _fi9id(I, 23, 1 , ia , 0. 3);

'

> .

)
273

C aoftuto 12- P ro g ra m a c i n a v a n z a d a c o n n c u r s e s

WLH;
3 C S [ 2 ; >2, 2 , t ,

'
S, J i

S t _ f i ;l i 3 _ 5 u * r ! ^ p C 3 { 2 ,

9, *0IUO9 : *):

t t . f i t i i . O O t i u o a o s 9 , f : 3 : c _ : t s ( ; a - a c s ( 2 : i 4 -0_ACTTVE);

C*3C3>;2 * M V / i e L d l I j i , 2 , t 4 , , ) ; * :_ ? U _ u $ t r o t r ( C M e o S [ 3 I ,
m a.i i

t9C C S[*| = MULL;

/ C re a r e l 'o r s u ia .- io y u o ic a r io en p a n t a lla /

fo n u la rio = n*_to*fcapM | ;
p o i? B |c a c o G 3 ;, H ftt llil " r* fr* s r(); p a n t a lla / * =3*.i fu n c in r e j.3 i '. fa m u L a r lo l i s t o p ara e x n iO lr an

s t a fu c :o r es la tjue v e ra a -je ra re n te uoico o l fo r m u la r io en

/ Dar cooienjo i l U i c # CfiMfldM

fO * n _ iJriy r (fo r n u U riO , flW JJV L JiQ O E ); n ti* (M p o r(c o d tg o _ w c X a g vtefiO ) key _f <: } i { i f ( : o l f f c . * c u <EY_up ; ; c o o ig o _ a * c li ? o r * _ a r i v e r | f o r m l a r t o , REOJ>REV_FIElO);
x y _ ppa 66>

e lt if(cooigo a ic ll
* <EY_*PAC|

\n cofligo M C I! KEYJXNM ; j codlgo^jocU

c r s j n - t r f c r i u l a n c . KEOjlCT_FtEU>]; u * i f ( c o i g o . i s c i i <e y _ 3 * c x s p a c e > 'o n j j r t v e r i f o r s u i a r l a , aa.O L .P ftE V |; L i i f : i s a r i n t { c o < 3 i g o _ a ii> > fo .-* _ 0 .'iv < r! P o r t u l a n o , c a c i g o ^ a s c u i tlH f w j * r i v r ( f f lP w U r i B , _JWi<JflN_CCftMO),

i
.:% < s _ f 5 r * *5 h j la ' 10 ); fo r o u la r ie ) ; fo r ( t 9; i < 5 ; 1 J , r a a _ f ie l( i can eo s! i i ;

tc /o tc u tsic r, fls s );
rvccoreaxt);

P r o g r a m a c i n e n L in u x

apo_ixit{ );
e x U ( E X I T /A lL U R E l;

> A ntes de an alizar lo que tiene lugar fin el cdigo fjente de este program a, observe la figura 12-7, que m u estra a este p rogram a en accin. O btendr as; u n a mucho mejor apreciacin de la m anora en que ste trabaja, tal vez. a\ construye ei program a. Utilice las teclas flecha ahajo o Av Pg p ara a v an zar al campo siguiente, las teclas flecha arrib a o Re Pg p ara retroceder al cam po an terio r y FLO p ara salir. P a ra llenar los campos, sim plem ente tipee algo y luego opnm u Intro.

F ig u ra 12. 7. P antalla de ingreso de. datos construida con ncurses de la respectiva biblioteca. La inicializacin de las ncurses comprende establecer el modo e b r e a k p ara que el kem el perm ita p a sa r la mayora de las pulsaciones de teclas hacia la aplicacin sin previam ente procesarlas. El fragm ento de cdigo fuente que viene luego crea cinco campos, o sea dos rtulos y tres campos p a ra en trad a de texto, y adem s uc campo NULL pura te rm in a r el puntero de campos. El puntero cam pos constituye el argum ento p a ra p o s t _ f o r a , que crea el for m ulario y lo exhibe en pantalla por medio de u n a llam ada a r e re s n . Antes de ingresar ai lazo -AtiHe. en el cual son procesadas las teclas pulsadas por e usuario, fa rm _ d ri.v e r establece p a ra los caracteres de entrada el modo sobrescribir. H asta que el usuario pulse F 0, la aplicacin procesa todas las pulsaciones de teclas que reabe. La pulsacin de las teclas flecha arrib a o Re Pg (interpretadas como KEYJ J P o KEY_PPAGE) es redirigida a un pedida de desplazamiento hacia el campo anterior ;REQ_PREV_FIELD). Anlogamente, la pulsacin de las teclas de flecha abajo y Av Pg conduce a ur. pedido de avance hacia ei campo .siguiente tREQ_NEXT_FIELD). 1 program a tambin perm ite ei empleo de la cecla de retroceso, redirigiendo su pulsacin hacia REG_CE'_ _PREV, que borra el carcter anterior a dondo se encuentra, el cursor. Cuando se pulsa F10, el programa prolija ei directorio corriente de trabajo y term ina.

C a n u to 12: Programacin avanzada con ncurses

275

Lo que viene
En este capiculo el lector compiet su estu d io de alg u n as de las prestaciones m s avanzadas de la s ncurses. El prxim o capitulo, L a API de sonido: O SS T ree". contina con tl recorrido de la s interfaces de program acin que ofrece Linux.

La API de sonido: OSS/Free


H asta no hace tan to tiempo, tas tarjeta3 de sonido y su correspondiente soft ware se podan obtener slo como dispositivos com plem entarios o accesorios add-ons) que se instalaban despus do la compro de u n a PC. A ctualm ente, h asta las denom inadas PCs p a ra negocios" incluyen en su plaqueta principal mutherboard) algn tipo de h ard w a re de sonido. E ste captulo ensea loa fundam entos de la programacin de u n a ta rje ta de sonido. El miamo ofrece un breve panoram a general de la tecnologa de ias tarjetas de sonido y luego comienza con el anlisis de la API d sonido de Linux OSS/Free (Opcn Sourcc Sound/F nre n espaol Sonido da cdigo fuente abierto/Gratis): E ste captulo cubro los siguientes tom as: Descripcin del hardw are de sonido P au ta s generales para p ro g ra m a r el h ard w are do sonido M anipulacin de dispositivos m ezcladores Program acin del hard w are p a ra MIDI Redaccin de program as de reproduccin de sonido Presentacin de prestaciones a v a n zad as de sonido Todos los program as de este capiculo pueden w r encontrados e n o sitio Web n t t p : / / ' w w . n c p . c o a / i n f o bajo 1 nm ero de ISBN' 0789722161.

278

Programacin en Unux

Generalidades
Las tarjetas de sonido no son dispositivos de hardw are monolticos. Por el contrario, 3e hallan formados por varios componentes. Aunque existe u n a con siderable variedad de diseos entre los distintos fabricantes, y h a sta en las tarjetas producidas por un mismo fabricante, la mayora de ellas cuenta con una interfaz MIDI, un digitalizador de voz, un dispositivo mezclador o ntixer y un sintotizador La comunicacin do Linux con esto tipo do dispositivos se ob tiene por medio do archivos ubicados on el filesystcm /d e v , a saber, /d e v / m l x e r , /d e v / d s p , / d e v / a u d i o , / d e v / s e q u e n c e r y / d e v . m i d i
H a r d w a r e d e s o n id o

La interfaz MIDI {M iu ita l Inntrum ent D igital Intcrfacc ) es un puerto por donde se puedo conectar a u n a com putadora dispositivos exvomon, especial m ente aintetizndoros. poro tam bin quipos do iluminacin y otros acceso rio de empleo en espectculos. El mezclador o m&rr es un dispositivo do control que supervisa los niveles de volumen de la en trad a y la salida y conm uta e n tre los dispositivos de e n trad a disponibles, talen como micrfonos y discos compactos. Los digitalizadores de voz se em pican p a ra g rab ar y reproducir voces d igita lizadas G eneralm ente se los denom ina segn los codea, o algoritm os, u tili zados p ara g rab ar y codificar u n a m uestra. Las dispositivos sintetizadorcs se utilizan p ara ejecutar m sica y g en erar una am plia variedad de sonidos y efectos do sonido. En general, los sintetizadores com prenden dos categoras. Uno de loa grupos esta basado en Jos chips Yamaha OPL2 y OPL3, que son los empleados en la mayora de las tarjetas de sonido. El segundo grupo son los sintetizadores de tab la de on das. que producen sonido a p a rtir de m u estras de instrum entos pregrabadas en chip3 p resen tes en la tarjeta. De los dos tipos, los sintetizadores de tabla de ondas producen sonidos mucho m s ricos y completos.
D is p o s itiv o s d e s o n id o

El lesysrem de Linux /a e v contiene archivos de dispositivo que Be corres ponden aproxim adam ente equipo por equipo con el hardw are de sonido dispo nible. Tbdos las archivos de dispositivo finalizan en u n nm ero N. general m ente Z, 1 o 2. al cual es vinculado simblicam ente el nombre de dispositivo. Por ejemplo, en mi sistem a, /d e v /m ix e r es un vinculo simblico a / e v /m ix e rfl. El resto de este captulo, excepto cuando sea necesario alu d ir a archivos .especficos de dispositivo, hace referencia a vnculos simblicos, /d e v / m i x e r es la interfaz al hardw are del mixer, m ien tras que / d e v /d s p y /d e v / a u d i o son las interfaces principales con los dispositivos digitales de voz. Las nicas diferencias e n tre los dos es que / d e v / a u d i o utiliza como opcin predeterm inada la codificacin que respur.da a la Ley u (p es la ierra griega m u), que rep resen ta m uestras de 12 o 16 bits en S bits, m ientras que 'd e v , d sp utiliza codificacin lineal sin signo de 8 bits. El dispositivo utili zado p ara a d m in istrar 1a m sica electrnica y los sonidos em itidos por ios juegos electrnicos es / d e v / s e q u e n c e r . E s la interfaz a los chips del sinte-

Csotulo 13: La API de sonido: OSS/Free

279

tira d o r p resen te en la ta rje ta de sonido y tam bin puede ser utilizado para acceder dispositivos externos de MIDI y a la tab la de or.das. Finalmenco. / C e v / r i d i se u liia p ara las salidas d e MIDI de bajo nivel.
P a u ta s p a ra p ro g r a m a r s o n id o

Las siguientes p au tas h a n sido e x tra d a s de la guia de program acin del OSS. escrita por K an n u Savolam en. a u to r original de la API de sonido de Li nux. El docum ento completo puede ser encontrado en la Web en h t t o : / /VMM. f r o n t - t s c h . con-./ p g u x d e / i n t r o . h tm l. Prim ero y principal, la API do sonido e s t diseada para p erm itir que las aplicaciones escritas con ella sean p o rtab les tan to entro sistem as operativos como e n tre hard w are de sonido. A C3e fin. la API so apoya en macros defini dos en <sys/sounccard.h> Aunque la implernuntacin hn cambiado y continu ar modificndose a medida que el controlador de sonido se vaya de?arrollando. los macros siguen siendo coherentes. Adems, no redacte en sus aplicaciones cdigo que empleo los archivos num erados de dispositivo. E n su lugar, utilice los vnculos simblicos d escritos en la parte anterior, "Disposi tivos de sonido*. Los usuario* pueden c o n tar con v an o s dispositivos de soni do diferentes o ten e r otras razones p a ra u tilin r nmoros do dispositivo d i ferentes. pero los vnculos simblicos a p u n ta r n uiemprc hacia los dispositivos que los mismos deseen e m p lear para un propsito determ inado. Evite sobrecargar su aplicacin do prestaciones glamoroaas pero de poca im portancia p ara el propsito principal de la misma. Si va a escribir un repro ductor de CDs. por ejemplo, ste no necesita contar con la capacidad adicional de g rab ar sonidos En la m ism a tesitu ra, no d por sentado que codo el mundo vaya a em plear la tarjeta de sonido m s avanzada do todas. En cambio, escr bala p a ra el mnimo comn denominador, 13 tarjeta Sound Blaster, y luego agregele cdigo que detecte otras ta rje tas de sonido especficas y utilice con ellas determ inadas prestaciones avanzadas o especiales (ver el ttulo "Progra macin avanzada de audio' para obtener informacin sobre cmo hacerlo).

Utilizacin de la API de sonido


P ara u tilira r la API de sonido se debe in clu ir en el codigo fuente el archivo de encabezado < sy s / s o u n a c a r d . n> N'o se requiere de n inguna opcin de linkeado especial p^ru. por supuesto, se d eb er contar con u n a ta rje ta de so nido que funcione bien. A ntes de que com entem os la API de sonido en d e ta lle, - . lector deber conocer la fu n a n i o c t l , cuyo nombre proviene de :np u t/o u tp u t consroi control de en trad a/salid a y es utilizada p ara m an ip u lar un -isposivo de caracteres por medio de un descriptor de archivo. Su proto tipo. declarado en < i o c t i . h>, es el siguiente: iat lo c ti'in t fe. ia t 't^uest, . . . ) ; O C t i controia el dispositivo abierto cuyo descriptor de archivo es f d, y ejecuta ei comar.no contenido en rsquesL Un Tercer argumenco. crtar 'a r g p por con vencin. a menudo condene un argum ento es pacificador de tan: ao. i o c t l e3 u n a fundn de p e general destinada a -ser utilizada en op-eradones que no en cajen n tid an er.tc en ei modele Linux d s secuencia de caracteres de E/S. Un listado p ard a: ce las acdones de i o c t l . tpicam ente concddas como ioctls,

/
2S0

\)

>

>

P ro g ra m a c i n e n Linux

puede ser encontrado en ia pgina dal m anual i o c t I _ l i s t (2}. pero la mism a se encuentra terriblemente desactualizada. Las i c c t l s p a ra elmezclador caen e n tres categoras: control de volum en, fuente de ingreso de datos de sonido y funciones de Interrogacin. La capaci dad de in terro g ar es especialm ente im portante. A lgunas ta ije ta s de sonido no poseen u n mtxer, por ejemplo, o no c u en ta n con un control m aestro de vo lum en. G eneralm ente se debera u tilizar prim ero los raacros de in terro g a cin p ara d eterm in ar as las prestaciones de la ta p e ta o !a m era presencia de un dispositivo de sonido an tes de com enzar a manipularlo. Con respecto al mezclador do sonidos, la API de sonido agrupa su s prestacio nes en u n conjunto de canales, de m an era que la prim era cosa que se debe hacer es d eterm in ar cuntos canales so en cu en tran disponibles y qu son I03 mismos. La ta b ia 13.t provee un listado parcial do los canales m s comunes (la lista com pleta est contenida en < s y s / s o u n d e a r d . ) Tabla 13.1. C a n a le s com unes de los n e/.cletores de sonido.__________________
C anal_________________ Des c r i p c i n ____________________________________________

S0UN0_M[XER_V0LUME Nivel mnostre de salida S0UND__MIXER_8ASS Nivel de graves do tocos os canales le salida SXN0_MIXER_TRE8LE Nw! do agudos de tocos 'os canales de salida SCUN0 UIXE3 SVNTH Conuol de volumen de todos las entrados ai r.intctiudor, taier. ccmo o! cftip de FM o tn tabla de ondas 30UND_MXER_PCM Njvol de sadi de los dlsD03<tivos de oud:o /cev/audio y /dev/dsp SCUNQ VIXER_SPEAKEH Nivol de salid3 paro ol parlante de lo PC. v estft conectado di* rectamente .1 la tarjeta do onido SOUND_MtXfl_irNE Nivol de volumen part el canectot de entrado de linea SOUNO y IXR MIC Nivel do volumen para 1.1 orvada do micrfono S<XJN0J4IXER_,CD Nivel de volumon pura la entrado de CD do audlo S0UN0_MIX5R_-LTPCMNivel do volumen para dispositivo nltemtitvo do .v.;d:o (tal co mo las plaquetas PAS16 d omulacin do Sound 8iast<srj SOl.ND_VllxEfl_RECLV Control do nivel do volumen maestro de rri&aci&n SOUND_.\IIXER_NRDEVCCES e3 un m.icro que inform a sobro 1 mximo nm e ro de dispositivo., reconocido-i por el controludor de sonido en un momento dado. 50UND_MIXER_READ_DEVMASK establece u n a m scara de bits que indica los canales disponibles. SOUND_MIXER_READ_RECMASK establece una m scara de bits que indica e! nm ero de dispositivos de grabacin disponibles. SOUND_.MIXER_READ_STEREQDEVS establece unu m scara de bits que indica qu canales pueden aceptar salida estereofnica. E sta informacin le brinda a uno la posibilidad de establecer el volumen de cada canal independiente mente. proveyendo asi cierto control del balance. SOUND_MIXER_RAD_CAPS establece u n a m scara de bits que describe las capacidades o prestaciones globales que brinda un mixer.

y
281

C aotulc 1 3 : La API d e so nido: O S S /F re e

La porcin de la A PI de sonido correspondiente a l mixer tam bin prosee dos macros. 3CN0_DSVIC_LA8L$ y SOUND_DEVICE_\AMES. que contienen cadenas im prim ibles p a ra proveer a s i salid a legible por el usuario. La nica diferencia enere am bos es que los rtulos presentes en SOUND_DVICE_NA.ES no cu en tan con espacios en blanco o le tra s e:i mayscula. P a ra o btener y fijar el volumen del mixer, finalm ente, se deben u tiliz a r Los rr.seres SOL'N13_NIXER_REAEKcar.al) y SOUNT>_NfrXER_v^-RITE(canal). E'. siguiente rragmer.to de cdigo, p o r ejemplo, fija el volum en corriente del dispositivo m ezclador ai cincuenta p o r ciento de su rango mximo: mt ve2 . ?: if:(io c ti(fa . scu iO.:e?_m:~(SO<jNO_iXcP_iitci, avoi)) < r,
L i liis a s a fa lle
Ljb

a s i aue

cesen a c o o ta r la s a ccio ne s n r 't in s o le s */

' La llssact tuvo axits. asi aua aoui va s i -asta del codigo / v o l contiene el nivel de volum en (a m enudo denom inado ganancia) que va a ser establecido, y SOUND_UIXER_MIC es el canal sobre el cual se establecer dicho volum en. El prim er byte contiene el volum en para el canal izquierdo, y el segundo el volumen p ara el can a l derecho. Despus de la llam ada a ICC t i el parm etro v o l contendr un nuevo valor, que e3 ligeram ente dife ren te al del volum en que se estableci en la llam ada debido a las caracters ticas propias del hardw are.
E je m p lo s

1 El program a siguiente, s s t a d o j n e z e i a d e r , interroga ai dispositivo m ez clador p ara d eterm in ar sus canales disponibles y exhibo los valores c o m e n tes do los mismos:
'(ooers tf: pregara n t n t r r t : a!.xtir_natuj *

r
* t to o _ a :c u c o r .c Copyri;R: (c i l99--3S

a c* -p o qu* h i t e

lo r a la * * S O fr i* o t a * lo c o n tr o la 3 # l w c l a d o r .

lt* 4 rra .i'c r ( |f f_trancjr&eit*l.eo>il SuJiw.t eocificaao por Xurt ifait (<aU>x.Tiijlor.coei */ ireluce .Klwae <s:o:o.ft>
t i r c l ' - c t <s>roc:1..-.>

ificlyc* <trtiisc^nCitr3.t-.>
o ;c i c ; r i 3 i r _ i s ; s 3 0 ? : f l T c c n a ic io n ) ; F u rcia n p> m p r i n i r a s t a c a s c o r r a n o s

:i c o n :rc ls i 7
i r t n a ir u o id l

{
ifl: c e a c n s t c r ^ a r c e i v o ; I c ^ a c n p iG r a 3 rc m v o p ara ? i a i s p c s i t i v o

n e ic la sc r t

Programacin en Linux

Captulo 13: La API de sonido: OSS/Free

283

it n iv e l;

/ N iv e l t e 1 v o l j n e r - /
a c tiv o ? /
I ' Xonbres de lo s c a a lo s -Jal

prr._ 5 U t.'( !

1) i fuM t# _g nO aciW M :

/ 45e encuentra

c h a r 'd is p o s i tiv o = " /d e v y .n ix e r - ; son? char *rotU lO S[| - SC^JJO DEVCE -ABELS; M e la t o r t in t l ; /* V i s a r a s ce b i t s para a ju s t o da lo s d i s p o s i t i v o s ' ! in t fje n t e _ g r io .ic ia n , T ascara d i s p o s it iv o s , ita scan i g r a a s c is 'i 3 iJD 0 5 i:iv o _ 9 t ir?o , ca p cid a te s; / ' in -ir I d is p o s it iv o iw z d a d o r s o lo para le c tu r a / i * ' { 3 e s c r p t a r _ ir c h l v o - o p H n < d iso o sltv o , 0_RDONIY)) < 0 ) f e r r o r jf 'o p o n ) e x itis x r r jA iu u B c ) ;

pm _s?a tl(t M M e s tr> *7

1 1 i d i5 c o s it lv o _ t t r o );

I ' P';de ooerar on

i* ((1 l ) i :ispo3itivo_ast9r90) { r*o, acstrar los mvelss de 1 fie d a le s */


p e - ro r r s a w j.w lx s flje A O * > ; p r ir t -r

Si ! dispositivo S sto

: f (d e < t l(* s c r p*r_3rcilvc. MXR_SAO(l|, in iv u lM < 0)

VJCVS v j d W , n i v l 4 0 f f . {n ive l 4 Sx'fOO!

B|;

>
) aisa ( /* Si 1 a re , aostrar aoio un canal */
O o :e i r in fa m a c i n jo b ru o l i n ic i a d o r / [w rr?r< * SOUSO.U I XB_n 0 ,0 _RCSC * ) ; ^ ^ i r i ; io c t U d u ic r io t 3 r ,.ir c n iv a , 3IXjN0_UIXR_flf-AQ_CVMASK, M $ c a r u jils i s .t iv o > ) p e r r o r ( SOUND_UIXH.i1_REJ'0_06VHASK') ; ^ i f ( i o c t l l a c r i p w j r c h l v o , SCUW>_M! xCfl^EAOJlECUASx. SffasC B M jjraD A cio r.l)

Ifd lc c tK d o s c rip to r jrcR iva , wtXSa_RAC{ 1), & .H vi)) < ai pa.'r.jrf S0UN0_MtXSa_a4a-); V f lS V , m v : i f f >;

i * ( ( i o c t l ( a o s c rlp to r_ irc r iv o , SWKO_MIXa_REA_RECSRC, S u n m a jjr o b s c ic fl) < 3 |

> J

pirrorCSCUHO.IIXEfl_REAO_RECWA$K-1; < ^ M, ( l i c < t l < o s c r i p : o r _ ,i .'m v o 1 KXirojtXERJtEAbjiTEflCaEVS, M ls p p B ltiv O jS te r s p ) ) 3 * r r ; r { SCUNC.urxERJIEADJTcREODEvS* 1 ; i f ; l o c t l l e s c r ip t < J r jjr c i iiv o , SONO_MIXR_REAO_CAP$. c a p a e id a o iis l) < i | psrrO( ('SCUND_U!XEfl_READ_CAPS" [fsp ria iir m ro rn a c io n sobra o l ro z e ia d o r / p r i r t t f r - s t a o o do % s:\n \n *, d i s p o s i t i v o ) ; c r m t f | 'C an al w iv l\ n * ) p r iflt Y ( UoclaO cr Fuento .-aaacion F ia n te A c t iv a O is p o s itiv o s t ir& c

>
/

LSon ix c iv > n m U fyn:s para grabacin? m i ia J HQ?_ZXCA._:Wl))

p r y i* f( -r.Ate<v:icfl: -.as opcicr-ti d* fuente para grabacin ion *). i f | iicasacidadas 4 prntf(*!>o );

v ir .t ( *riuy*'-ts. vn* l ;
* Crrar e l dispositivo eciacor / clossdescriptor returfl i ;

ze archivo),

--------------------------- \n-);
ron ; i = a
a is o o s it iv o s i

C*int( * ----------------------------------------

t < SOUKOJUIXGR.NROEVICES ; * -i

f Racorrer todos los


/* Sois interesan les

roa iaprixir_3staoos{int co ^ic io n

i* ;< i i ) i fl33Cara_dispositivos) ( dispositivos sispomblas * ,

{
coodicioo ? prifltfl* Si l : p r ir .t r C M O ')

C3n3 /

pn ntf|'S2 c V 8s*, i , r o t u io s (il); / In c rin ir nontre y nunars oe


i j i n a s c a r a jg r a b a d o n ) ; r Se t r a t a 3a una

jr n _ s :a t ( ( 1 ruer.ta p ara g rs c a c io r.? /

>

'

284 Programacin en Linux

Las prim eras cinco llamadas a i o c t l establecen p ara m scaras de bits sus correspondientes argum entos enteros (f u e n te _ g r a o a c io n , .T iascara_ d isp o s i t i v o s . m a s c a ra _ g ra b a c ic n , d i s p o s i t v o _ e s t e r e o y c a p a c id a d e s :. Despus de im prim ir dos lneas de ttulos p a ra una tabla. estado_mezciador re corre los canales dei mezclador que se encuentren disponibles. Si ei mezclador cuenta con un canal determ inado bre. se ejecuca el bloque condicional y se ex hibe parte de la informacin disponible para ese canal. Obsrvese en p articu lar la m anera en que son comprobadas las m scaras de bits:
(l c n a n re l) i O itn asx ;

La expresin e n tre parntesis d esplaza a la izquierda una posicin, Jos bits del nm ero de cana! y luego efecta u n a operacin lgica bit a bit. de Y entre el valor resu ltan te y .a m scara de bits. Si dicho canal existe, ia correspon diente expresin lgica evala a 1. Si el canal nu 3e encuentra disponible, le expresin ev ala a 0. De modo que, por ejemplo, si algn canal, digamos S0UN0_MIXER_V0LUME, ofrece prestaciones ostereofmeas. (1 SOUN'D_MIXER_VOLUME) & dispo$itivo_esterco (tal como aparece on e! program a e v a lu a r a 1. En mi sistem a, que tiene u n Sound B lastcr genuino, SS taJO jtiG Z C lador produjo la siguiente salida (la informacin que brin d an todas las A Pls os on ingls):
i ..' m a d o ji u jc l d o r cscatto <J<j / d e v / u r : C a n il
5ALIOA

Putntfl Qraoacion

Fjon to A c tiv a

D is p o s it iv o E sto re o

N ival C o rrio n t*

z e la d o r

VOL
t

NO N O N O VES W SO yes ves VES 0 WJ N O

N O N O NC .so NO NO NO VES NO NO NO N O

VE3 VES YES ves ves NO VES w YES NO YES VES

90* 7 5* 75* 7S* I00S

90*< 75* 75* 75* 1WH 75*

Qaaa

2 rrQ i 3 Synrn ?cn 5 SOHr 8 Lina 7 <L 3 CO 9 ttix i 2 ig a in 13 OgaLn

75*

75* 3*

75*

75* ff* 7 5* 7 5*

75% 75*

A to n d a n : usa opcion as de fu e o te p ara gra D ac w n son no e x c lu y a n o s

Como se puede apreciar, el dispositivo mezclador carece de dos canales 10 y 1 1 tales como uno para un dispositivo alternativo de audio (SOUND _ m: xer altpcm ).

Capitule 13: La API de sonido: OSS/Free

285

2. E l siguiente program a, f i j a r_ v o lu n te n , le perm ite al usuario fijar el n i vel de volum en de m anera in teractiv a. ora** sel JUSCJitiO Irttem t: H frti.c /
fijar_volooen. - F ija r s i nivel <M voltaen del

d isp o s itiv o ee ic la d o r i'crtM ln t r ic ti a


C w n s * * . (c) 994-96 Jgr f T r a r .tr {j8 ff_ tra n te rfe ite l.C 0 B ) SuM Kflts notificado per Kart * a ll (raUSxni$$loo.COT]

/
tincltitf* <nUW.r*>
# p c 1 w * iic lif i.r

ir c lu c e

otdLo.it>

incljd < s y s /io e ti.t>


atpclw d* < *c n tl.t*>

#irclud* <jyj-jcuc<jcar: f>


m t t i f l l a t i n C . citar r^w{ | )

(
i r t canal u c u ltrd o , canal deracno, n iv e l;

! Ajusto* do volunon

/
int e u p c a ttiv o ; U t l; in t descriptor ard u vo ; Mxciaoor / / Qoscriptor ce arcnivo ael d is c o iltlv o / Que dispositivo* configurar /

t.*!t K i r i dispositivos, d iip c s itiv o esteroo; ajuste so lo

r asearas do Q lt para

S u p o s itiv o s ;
sfcar
'd i s p o s i t i v o

V 'd e v / n i x o r * .

cnar a u f[51;
if((d e s c rip to r e * jc c o r p a ra a rc h iv o = o p e n ld is p o s itiv o . 0 _ R O T R |) < ai ( /* A b rir a l

lectura y eacrttitr* */
p e r r o r C o o e n * };

eiit(a :T_F A lLU R E s ;

>
/ O tJteaer in fa r a a c io n so o ra a l n e z c la c o r */

if

lo c tl(o e s c rip w arcnivo. 30LW0 *txB OSVVASX. l.aascara aispositivosi)


perror(*50U>0_MlX5a_ftEAC_0vltASK )

< I

l o c t i j e i c 'i p t c * a rch ivo s, 3C0W M'XcF

STSFOCCVS, 4 d :s p c s itiv O ji9 t e r e c )|

< ) S * " tr! -SiX_MtXEa_?&i0_STE300EV3* J;

Programacin en Linux

Sstaolece- ?1 sanal s i que desoa#s f ija r dispositivo SOuOjKXRVOUJWE;

ti voijner. *

/ Especificar el nutvo nivel de do < fprifltf(Stdoot, 'Sjuvo nivel fC :i(b o * , 5. Jtd ln ); ca^al^oerscno * a to i(b u f);

volunto l da -/alunen
*);

} wflile(canal_derec.)o < 0 canaljJerocho > IM );


/ Ajustar canales derocho a Izquierdo a l n iS M n ivel /

canal_l;<ju:erdo canal_demcho;

/
C o d ific a r o l olvnen de unoo can sos n un solo valor de tii d io it o i E i canal izquierdo #ra nlaacmado un o l byto nonas s ig n if ic a t iv o E l canal acrecno lera alnscenado n 1 oyto superior, de tisdo sue h tb ri quo d esp lazarlo 3 b it* hacia la izq u :arca.

/
n iv a l * (canal_derecno d| canai_izquierfio;

I* F ija r e l nuevo n iv e l de volunor / if( ( lo c tld e s c rl) to r_ a r c n iv o , :XEB_ARITE|diJposm vo|, ( n iv e l) ) < 0! { 3rrcr{'UlXEfl_*BlT*|; * 11 (EXIT_FAII.B);

>
r C e c o c ific a r e l n iv e l retornado oor e l c o n tro la c o r de somos / n iv e l i a x ff;

can al_ U 5 uiero c

caral_derscno = 'n iv a l 14 axffO) 8

/ ExniDir a l nivel corriente oel volumen V p r in t f ( N iv e l da volunen de \ s estab lecid o en c is p o s i? iv o , can al_ i2 3 u ier:3 , can3l_2eracno|; / H ctV in ',

* C rra r 1 dispositivo aezolacor y s a lir /

Cactuio 1 3 :

U i A P I d e s o n id o : O S S /F re e

287

sc-icto^ar-r* ro): iftv rr' ; > La salida de este program a es ia siguien.ce:


3 i'ijar_*oluo*c
?5 i-ie v c .-v 1 * o lu * tn

* i I veluacu Ce d * W H r astaalecido *n 75S

t ?5H Despus de declarar sus variables, f i ] ar_voL um en abre el mezclador acceso de lectura y escritura luego llam a a i o c t l con los macros SOUND MIXE R_READ_D=VUASK y $OlM>_UlXEfl_REAO_STEHEOOEVS como argum entos a fin de determ in ar los prestaciones del mezcludor. El paso siguiente es obtener el nivel de volumen preferido por el u suario Obsrvese que el lazo do w h iie conUna h asta que se ingrese un nivel do volum en vlido (entro 8 y 100). La fijacin del volum en es un poco m s in trincad a. Tal como so vio a n te rio r m ente. p ara codificar ei volumen dol can al derecho en el byto sup erior (o m s significativo) de n i v e l se debo u tiliz a r el operador de C de d esplaza miento de bita h ac.a la izq u ierd a La expresin requerida es:
m v*l icnaX_d*rcfto S) e/>l_Uqui*fto;

La expresin en tre p arn tesis desplaza el valor de c a n a l_ d e r e c h o ocho bits h a d a la izquierda, ubicando d o s su s bits en el byte superior, y luego le agrega el valor de c a n a l _ z q u l e r d o , asig n an d o el resultado a n i v e l . I-a API de sonido decodifica adecuadam ente n i v e l d modo de obtener loa nive les de volum en im puestos a los canales izquierdo y derecho.
P ro g r a m a c i n d o a u d lo

Este punto m o strar cmo llevar a cabo u n a programacin sencilla de audio concentrndose en ia reproduccin d* sonido y dejando de lado la grabacin, principalm ente debido a limitaciones d a espacio (bueno, y tam bin al peque o y triv ial detalle de que yo no dispongo de m anera alguna de g rab ar soni dos en mi sistem a -. Las tcnicas de grabacin, sin embargo, son esencial m ente las m ism as. Donde la reproduccin requiere u n a llam ada a w r i t e que incluya el descriptor de archivo del dispositivo de audio, la grabacin re q u erir u n a llam ada del mismo dpo a r e a d .
NOTA

pya Bfivsr a caco -c rras rnese. graoar scr-ocs en -.anotas oe s.vco senvoup,!:*, toce o <3j se raoere -oce-' rS vaertss un m-cnifano 8 13 eotrsaa e a misn-a rotulaos M IC y z& rer x i ffT A _as taretas za O up<c cieno. o *uiicuc<ex. an carrea, son irs com ^ess a este 'esoeco xnzue uno Jueoe granar y rsproajar ai mismo tiempo. Zo moflo 3j6. acedas ae Jacor uc&ardo ja micrfono. una taJeta '-Kiupiex perrr. te graoar por : can* *3 ce envaoa c que se cszt ejecutanoo er, ese memento oor su c=ra o candes ca.3 & c 3 r a a se?*.?! r-e se graoe toco joo de oanstarmacores
CONSEJO

--=rs oosnsr ms infirmacin soore - prcgramacicn w a ^cirimecia. osoeciaimenja so-co. en Linux. ver anta V u r-s 3 Guido. de -H 'ranter.

t-

>

>

2S8

Programacin en Unux

EN QU CONSISTE LA PROGRAMACIN DE SONIDO

A ntes de sum ergim os en la program acin de reproductores de sonido, se ne cesitar ad q u irir alguna base tcnica q i e perm ita com prender los conceptos y la term inologa empicados. Las computadoras representan el sonido como u n a secuencia de m uestras de u n a seal de audio, tom adas a intervalos de tiempo precisam ente controlados. Una m uestra es ol volumen de ia seal de audio en el momento en que la m is m a fue comprobada. La forma m s simple del audio digital es el audio sin com primir, en ia cual cada m uestra es alm acenada tan pronto como es recibida en una secuencia de uno o ms bytes. El audio comprimido, a su vez, codifica N' bits de u n a seal de audio en N-x bits do modo de ah o rrar espacio en disco. Existen varios tipos do formatos de m u estras, 3endo los m s com unes los de 8 bits. 16 bits y Ley p un form ato logartmico). E ste formato de la m u estra, combinado con ol nm ero de canales -q u e puedo se r 1 p 2 segn que la seal sea m onoaural o cstereofnica- d eterm in a la frecuencia de m ustreo, 1a cual a su ve* d eterm in a la cantidad de bytea de alm acenam iento que requiere pa ra cada m uestra. Las frecuencias tpicas de m uostreo van desde los 6 kHz, quo produce un sonido de baja calidad, a 48 kHz. Dado que el sonido e3 una propiedad fsica, existe algunas im itaciones con loa que uno dobe confrntam e. Como las com putadoras son dispositivos digi tales o discreto!?, en las quo laa transiciones de unos a ceros son ab ru p tas, pero el sonido 03 en cambio ur. fenmeno analgico y por lo tan to de d esarro llo continuo, las tarjetas de sonido cuo n tan con convorsores do seales a n a lgicas a digitales y viceversa (AJDCs y DACa, respectivam ente) p a ra conver tir en tro am bas form as de seal. La eficiencia de 1a conversin afecta la calidad do la seal Existen tam bin o tras propiedades fsicas que pueden incidir negativam ente sobre la calidad del sonido. L i limitacin m s bsica es quo la frecuencia ms alta que puede se r grabad equivale a la mitad de la frecuencia de mucstreo, o sea que. por ejemplo, a ana frecuencia de maestreo de 16 kl. la frecuencia ms alta que ne puede grabar no puede ser mayor do 8 kHz. Antes do que la seal pueda ser enviada a un DAC o un ADC deben por lo tanto eliminarse las frecuencias ms altas que 8 kHz, o to do lo que se escuche ser un fuerte ruido. La-nentablemente, para increm entar la calidad del sonido se debe tambin aum entar la frecuencia de muestreo, lo que trae aparejado que se eleve el intervalo de transmisin y disminuya 3 su vez la duracin de la seal, o sea por cunto tiempo la misma se ejecuta.
FIJACIN DE LOS PARMETROS OE LOS DISPOSITIVOS DE SONIDO

Para lograr producir sonidos, el flujo bsico de procedimientos es ei siguiente. L Seleccionar el dLspositivo quo se desea utilizar. 2. A brir el mismo. 3. E stablecer el formato de m ucstreo del dispositivo. 4. E stablecer el nm ero de canales (1 o 2, mono o estreo). 5. E stablecer la frecuencia de m uostreo p ara reproduccin. 6. Leer un bloque de! archivo que se quiere ejecutar.

) Cacuic 1 3 : La API d e so n id o : O S S /F re e
289

>

7. E scribir dicho bloque al dispositivo e reproduccin abierto.

'

8- R ep etir ios pases 4 y 5 h a sta en co n trarse con EOF (el final del archivo). 9. C e rra r el dispositivo. E xisten diversas restricciones a te n e r en cuenta cuando se reproducen soni dos. Prim ero. seleccionar el dispositivo adecuado. P a ra todos los datos de so nido excepto los de S un M icrosystem s (m u estras de form ato Ley u ) se debe u tilizar /d e v tsp: p ara ley u. em p lear / d e v / a u d i o . C uando se ab ra el dispositivo de reproduccin se tiene que u tiliz a r 0 JVRONLY a menos que se deba, sim u ltneam en te, em plear ese dispositivo tan to p ara lectura como p a r a e scritu ra de datos. Luego corresponde aseg u rarse de que los parm etros p redeterm inados del dispositivo se a n los adecuados. De no ser asi se los de be establecer en el orden siguiente: form ato de la m uestra, num ero de c an a les mono o estreo) y la frecuencia del m aestreo. E ste orden resu lta menos im portante p ara reproduccin que p a ra grabacin, pero no obstante v ale la pena ate n e rse al mismo. Tanto p a ra o b ten er como p ara establocor el form ato de !as m u estras, utilice le* comandos SNOCTL_OSP_GETFMTS y SNDCTlJ)SP_SETFMT con uno de los m acros listados en la tab la 13.2.
TatXa 1 3 . 2 . M d m gara fo r m a to de muestras de .ju d io , ________________________

Macro______________ Descripcin________________________________________ A F U T QUERv Utilizado cuando v niorroga i formato de audlo corriente


{S W C TLJ3S P _G ETFM TS> AFMT _uu_LAf>

AFMT_A_LA 1N
AFVT lU A A G P C U

Codificacin logartmica Ley u CoOJflcactfn logarUmlca loy u


Codificacin ADPCM estndar (incomont-tole con el formato utlli rado por Crontjwe Laos en su Sound Blaster ce L6 lts Codificacin l i n d a r oe 8 oits sin signo 'ormsto de l& tx t con s>gno Httle ndlan (x86)sin signo Formato de con signo Org andlan (M68k, PPC. Sparci 5n S <ts con Signo 16 bts sn signo nroe endlan 16 oits

A F u r_ u a A F V T _ S J6 _ L E AFUT_S 5 _3 t A FV T_S 8 A f u r _ u i6 _ L E a f m t j j i 6_8 E A FU T_yP G

xgno
Formato ae Formato de Formato ae formato de

un signo c-g ardan

audlo MPEG (MPEG2)

Para o b ten er ios form atos de audio q u e puede aceptar corrientem ente un dispositivo, se debe llam ar a lo e t i utilizando el comando SNDCTL_QSP GE -VTS y u n m acro AFMT_QUERY como argum ento. E sta llam ada rellena AFVT_QUERY con una m scara de b its que rep resen ta tocos los form atos de audio que norm alm ente adm ite ese dispositivo. Los dem s tnacros de la ta bla 13.2 son loa valores a tra n sferir como argum ento a SNOCTL_OSP _SE7FUT Por ejemplo, considerem os el siguiente fragm ento de cdigo: ia t forw to;
;o c tl(o e s c r ip to r _ ir c n iv o , SWC7^_OSM3T?irrS, ifc r n a to i

Programacin en Linux

'nata * afvit_-jisj_E;
loctl|<jescri3:or_ari:hivo, SMJCTIJJSP.SETFVT io m a to j;

ifJfOfMCO !* VUTJj:6_l2)
pr Uitf ( *AWT_U15_LE no adnm<*o\ir):

La pnm era i o c t l rellena formato con una m scara de bits que se correspon de con todos los formatos de audio que adm ito com entom onte el dispositivo. La o c t l que viene luego tra ta de establecer el formato a AFMT_U16_LE. El valor que verdaderam ente establece es retom ado en formato, de modo quo lo sentencia condicional que le aiguo confirma si en verdad la llam ada tuvo xito Para establecer el nm ero dfi canales se procede a llam ar a t o c t l con el macro S nOCTL_D$P_STEAEO:
tnt canal! i ; / otriw I, oro - # / :o c ri{d c rio tc r_ a rc n iv o , 3MOCtl._OSP_3rEnEO, 4can.iloj.

De m anera sim ilar, pura entublecer la frecuencia de muestrwo, utilice SNDCTL_OSP_SPeO:


tnt fpcuoncn 11025; ioctl|<3<criptor_ircntvo, SN0Cr._0SP_$PE0. 4frecu*ncia);

Como asempre. se debe verificar el cdigo de retom o de i o c t i p ara asegu rarse que la llam ada a sistem a tuvo xito O proceder a procesar adecuada m ente el error.

i j m p l o

ate ejemplo es un program a largo y relativam ente completo que ilu stra el m aterial provisto en e sta seccin respecto de la m anera de program ar la reproduccin de audio:
/ .Sonora d#l an drin a *n toternst: lpepiay.c *7

/*
:onfL-3_iLi3io.c - fleei'ooucion de audio

y
rfinciudo <sy5/ioctt.n>
ir.c iu c e

<unistd.l*>

i r c l u o e f c n t l . r

Iinclud# <sys/soundca.*o.ri>
l t c

lude < s td lib h >


/ P 3r3 s t n r r o r */

i*ircluae <stdio.n>
in c l u o * <5t(*t3.n >

#r>cluce <4rrno.ft>
r d f t f ie TA1WM0,3UF 4396 :n t t a m iv o io } i

/ Para rrno */

Cac*lu .0 13: La API de sonido: OSS/Free

291

in t a e s c r i 5 t o r _ 3 i p o s i t i 0 , < l * $ c r ip t o r .3 u e s t r 3 ; D e 3 c r i5 t 3 's s i arcfliv / u n lo n g it u d ; ir t c r * a :a , f r * a . r c ia . w te re o : c- 4 r d i s p o s i t i v o * / tv /t c ; e r a r c w ff r _ * * s t ^ { T ia u v c _ 3 U F ;

/ V alo r r*torna<fc por i**aa / / A rgw tantos para i a s i& c r i s /

/ S u f ' r p a rs la n u a st-a V

.* Fijar e e :

a ly .r i p a raM tro i

fW .
f e - s a t o tfV rj3U C IN

* e i" ir / *w a p ; /

: ( < * i : r i a t 5 r _ t i p * i : i v o o o * n { < J i w s i t t ' o , Q j**C n ly ;> * o j f ( t r r o D U S *} { # p r u t f ( a r r , %* t * a o u a o v n *. a u p o t i t i v o ) ;

>
f p r i n r ? n : a * " r , *V *: % a ln \ e u c o j i t i v o . t r a r r o r ( r r n c i ); * i t { 6 x :T _ p * :u a t ) ;

<L , 0 '-* a tM o r a c a it id o * i c t u a l M r t e ? /
i f ( , i o c t l fia J C r i p t o r _ o u p o s t i * 3 , 5 O C '-_ D S * _ G E FV73, i f j r n a t o H C r r o r ( SHOCT!.j5S P _3fTFVTS * j ; < 0> (

n n o :r _ F A iu jp j;

>
- t * i o i -o r t a t o a a e tu a la e o ta a is o a r u & L e . / i* 5 : " t o . iu c a 1 , r o s r e c t j * i a t r * a aese& ca. / c e v /c sa s o n :* ) ;

P u t s . ' L i i ' i r i r e s C c m M t f i : e r a s t r a s e s p t a c o r co r i ? ( f a r * 0 i Js F V T jC ^ x iT iT c ~ * a t5 & AfMT A i fo r r is i f(f o r m o i i * i i 3 r J it S if{ * ;.iu t o s p p u t S | l, , -tA?VT_<U_LAJi, J ; t i t s { * \ t AW_ A_ ! _ A# ] ;

i r V - . n a . A C a l C-J-SS tAFW T^IllAjW PCtr) ; a?v_u8 A?WT_Sle_L) A fy r _ s is _ 9 ) p u t a r M fw r jja * ) ; 9 u t i \ z A F V T _ S l j l ; p o t 5 ( * \ t A flir _ s i6 _ 5 e , i ;

i 'f o r o s t o i

aFMT^s'

3Lrrs<*\iA^vr_sa*);

) 2 92

>

>

>

Programacin en Unux

i f ( f o rn a to h

AFH7Jjt6_LE}

p u t s { , , .tAFN7_U5__E, >; p u t s ( , \tAPVT_UIS_BE, >; puW (*\tAPM r_H ?EG*};

i l fo rn a to & AFwr_ui6_3E| i? < f o r ; 3 t o i rNT_VPS0|

. E sta b le : * - * n u a e ra ce c a n a le s , n orc o e s t e - e o */ f ( 1 i o c t H d 3 s c r m o r _ d s p o s i t v a , SWCTL_OSP_STtRO, 4nado)| < 0) { p e r r o r ( SSC7L_0SP_STcaE0 I ; e m ( X ;r _ ? A I iijR E ) ;

*
arirt#C\:Moclo stablacico: , nota ? ESTREO' : MONO-J;

/ ' EsM&Ucer la frecuencia de suestmo / iff |ioctl(flescrtotor_di.3po3!.tlvo. SM ftTl^DS^SPEED. &frecuenc-.3i i < P ( Otr'Qr ( ' jNOCT'LJJSPJjPEED") ;
*x it(E X IT _rA U U R E !;

)
printf('Vcfrecuftcta d9 suestreo: v j Ht\n*, frecuancxai;
/ * A h ? r i r s p r 'J u g ir un irc h L v o do o ru o o ii j l f { < d c r ip w r H .u u * tra - 0 p n (ae 9 flfl. a v * , 0 JQ C m .Y > | < 91 {

por^orCopen 8W.V} xlt|XtT_FA!UlMF); *


/* L r un bloque, Iuqo e s c rib irlo

( lo n g i tu d r . l{ d c i> c rip :o r_ o i;o a :r ii, t u f f * r j w o * t r , TM A O JIIF)) > J) w r l t 8 { d e s c r i p c o r _ J s s p a 3 i t l v a , b u f * o r _ n u o s tr a , lo n g ltu f l) ; / C o rru r : c s a r c h i v o s a o i e r t o a y a a l l r / c lo s ( f l o s c r i p c o r _ - ji jp o s i:i v i> ) ; c l o s e |d * j c r i o t o r _ . i u e a t r a ) ;

xltl X ITJU C CES S );

> Aunque parece relativam ente complicado, c o n f ig _ a u d io es b a sta n te senci llo. TAMAO_BUF sim plem ente establece el tam ao que ten d r el baf f er don de se alm acenarn loa hinques que sern ledos, que por lo tan to se r ta m bin ol de los bloques escritos. D espus de las h ab itu ales declaraciones de variables, c o n f ig _ a u d io abra el archivo de dispositivo / d e v /d s o y co m ienza a comprobar y a fijar sus caractersticas. La prim era i o c t l del pro g ram a establece en fo r m a to u n a m scara de b u s que contiene loa form atos de audio que adm ite corrientem ente el dispositivo. Se podra elegir cualquier formato retornado, pero uno de los formatos disponibles,

Cactulo 13: La A P I de sonido: O S S /F re e

293

ArMT_S16_SE, se r unciente. El bloque '.argo de cdigo sim plem ente'exbibe en s~ d o u t los formatos que a d m ite corrientem ente /d e v / d s p . De !a m an e ra en que est escrito, c o n f ig _ a u d i o reproduce una m uestra m oaoacral de form ato S bits. En consecuencia, ei program a fija ei nm ero de canales en i aunque, algo perversam ente, se estableci la salid a m onoaural transfiriendo un valor 3 -lo considero perverso porque u tilizar u n 0 en un ca so y un ' en otro es tan to contrain tuitivo como inconsistente- y fija la fre cuencia m.-cma de la salida en S kH z SCOO H z). Finalm ente, c o n f ig _ a u d i o abre el archivo de sonido y v a leyendo bloques sucesivos del mismo y escnb . ndoios al dispositivo de salid a ha3ta que encuentra el 5nal del arch i vo EOF), momento en que procede a cerrar los archivos y term ina de corror. La salida de una corrida de dem ostracin en s u sistem a debera parecerse a la siguiente, seguida por un p a r de segundos de sonido:
ti

./C0fi5_-J0
:o r r l V t ; t * m : r a o ta d o s A f T J U J M I
A fV T jj

Las

ccr /den/dsp son:

AFVT_S:9_lE e c o S T JO ltcK Jo: WNO

< 3 * *ust.-*o:

8469 r

NOTA
En * V j c Wo do *atc -fero se enemntr*c C'spomales vanos s o o c muestro entro *rs <ut te f-afi* 8COC.vov Para q-~o cooflg_uco funoono Jacuaflamento. 8CC0.wav ceoe e*tar *n t mumo aroctarto an que se encuentre la vertifln ciecutnoie ao

conft_auaio.
PROCRAMACIN AVANZADA DE AUDIO

La m ayor p arte de las caractersticas y prestaciones com entadas h a sta aho ra sen com unes a toda* las tarjetas d e sonido. E sta parte exam ina las pres taciones que pueden o ao e sta r p resen tes en una ta rje ta de sonido especfica. E xiste u n a llam ada a iO C ti que p uede er u tilizada p a ra verificar la dispo nibilidad de ciertas caractersticas av an zad as del hardw are de sonido: SNCTL_0SP_GGTCAPS. La m ism a se utiliza do la siguiente m anera: : uracuJces; toct:(swcr*.pwr_areniw, 5N0CTL_BS?_GTCAPS, icjpaciaaaei); E sta llam ad a devuelve en c a p a c i d a d e s u n a m scara de bits que describir las prestaciones disponibles seg n cules se an los bits que se en cu en tren ac tivados. Las posibles configuraciones de bits se listan en la tabla 13.3.

234

Programacin en Unux

Tabla 13.3. Mscaras de bits devueltas por SNDCTL_D$P_GE7CAPS.__________


Capacidad____________ Descripcin_____________________________________________
0SP_CAP_R EVISI0N D$P_CAPJH/PLEX O S P_C A P _flEAlTIV E 0S?_CAp_8ATCH OSP_CAP_CO?flCC
O S P _ C A ?_ T fl IGGEH

Configurada al nmero de versin oe SNDCTL _DS=>_GETCAPS;


re s e rv a d a p ara u s o futuro

Activada 31 ol dispositivo puede operar en modo ful dplex: de sactivada si slo puece operar en modo semi dupie* Activada si el dispositivo admito informo do aita precis n so3ro la posicin del puntero do salida Activada si ol dispositivo cuenta con almacenamiento tempora rio (bufferng) local para graoactfn y roproduccin Activada si el dispositivo cuenta con un procesador programa ble o un DSP; reservada para uso futuro
A ttivod a si el d isp o sitivo c u en ta con grabacin o reproduccin gatillflda. e s decir d e ncvocln irimediuta

OSP_CAP_MMAP

Activado si resulto postb'.o el occoso recto al irfor de jrabocln o roorodocctn dol dispositivo o nivel de hardware

OSP_CAPJDUPlEX informa si un dispositivo c s fu ll dplex o aemi dplex. Full dplex (dplex pleno) significa sim plem ente quo un dispositivo puede llevar 1 cubo tan to su ingreso como su salida do dntos de sonido un forma si m ultnea. La m ayora de los dispositivos de audio, por desgracia, son gem dplex. Pueden grabar y reproducir, pero no al mismo tiempo. Si ol bit DSP_CAP_REAl TIME se en cuentra activado, significa que se puede efectuar un seguim iento muy preciso de la cantidad de datos que hn sido grabada o reproducida. Este no es, generalm ente, el caso con aquellos dispo sitivos donde se activa el bit do informacin de OAP CAPJ3ATCH 0AP_CAP_8ATCH Informa que el dispositivo verificado emplea alm acena miento tem porario interno de su e n tra d a y de su salida. Si el bit de OSP_CAP_THIGGER se en cu en tra activado significa que el dispo sitivo cuenta con grabacin y reproduccin gctillada (triggertd). E sta es una caracterstica que es til p a ra los program as que requieran poder a rra n c a r y detener la grahacin y la reproduccin con gran precisin. Los juegos, en particular, necesitan de esta prestacin. El bit de DSP_CAP_MMAP se activa si el dispositivo cuenta con buffers a nivel de hardw are que pueden se r accedidos de m anera directa. Uno puede m a cear esos buffers al espado de direcciones de m em oria de au program a De esa m anera se puede sincronizar la grabacin y la reproduccin del disposi tivo por medio de la combinacin de / d e v / s e q u e n c e r y /c 'e v /d s p . L am en tablem ente, el mtodo p a ra lograr esto es sum am ente dependiente del siste ma operativo y por lo tan to tiene el desafortunado efecto secundario de que los program as que lo utilizan no son portables. NOTA
Fuera ce ..strar efimo determina' con que tipo de gestaciones avanzaGas cuenta ur. Cisposit'.o se hardware, este caotulo no cucre las mismas.

Captulo 13: La API de sonido: OSS/Free

295

E l sig u ien te program a perm ite u tilizar algunos de I0 3 componentes de la m sc a ra de bita de la ta b la 13.3
; * i e - o s - is * t n i n t e r n e t : ; * : : a p s . c *.*

/
po:sr;-_c-?t':icio- s .c - 3t r t i t t C 's r r u r a r 2>-e:3cio''t* ce d is D is it i- o oe io*ido

*/
#if!clu 0e <syj/JOW'Ocard. in c lv s * < fcntl.fi fin e lu c e * y s / ix t : .* tnCw dt gnittd.h m elude <stdil&.*> x lv d e 'ltd l3 .IV

<*r-no.K >
ttt M tfl(V ldl

<
in t W * crtptcr_arcnt*o; i-tt y n t i c i M i , cw ; u t c i n

u o i t i /

d is p o s itiv o !| /oeWflp*;

lf | {d # s e r ip t o r _ i r e f t l v o * a p * fl| a * U * . 0 _ H 0 * |

< 0) (

per.*cr{*0S*''');
U t{ a i7 _ -A IL J );

>
itf i o c :.{d * c p i2 t o r _ iir c p i.i o , ftO c rL .o s p .a s rc A P S , i p r e j t a c i c .i e s u < i (

se<*ror( SW CTLCS#,JSTCA> S * ); e x it ( E X I T _ F A :u S ) ;

a c ir r ft'P re s ta c io n e s c a l d is p o s itiv o *s:Vn*. d isp o s itiv o } ;


if<C3C5 i O S P _ W _ O U P L )

p o tS C

f u l i au p lei* );

iffe a p s i 5S?_CAr_SAL::iei
c a c o ;: c04i*Ci0n r : i ? n w r e a l ' ) ;

i? ; c a c j i 3S?_CA?_anTCH) g vts('ttC u er.ta cao s L u c e itta ie n te l o c a l') ; ij c a c s -i 8 SPSA ?jK*f!0C 1

j
2 9 6

j-

) . ;

>

>

>

P ro g ra m a c i n

e n L in u x

W tS (*\C -j9 n ta con GSP u o tr o ccsro cesad o r* | ; t it e a o s 4 C3P.CAJ_nHGGE3)


p u t 3 ( '\ t C u r - :a sc-n g e t i l l a d o i f - c a p s 4 OS?_CAP_MUPt 5 t $ f ' \ t P P it e ( f r io g e r in g ) d a g r a o a c io n y r e p r o d u c c i n * ;

acceso d ir e c t o a l e s bu r s de su ra-(3*far*) ;

cio 5 9 {d n scri3 to r_ a rch ivo ); 9*it{EXir_SCCES5);

) La siguiente salid a m uestra las prestaciones algo lim itadas de mi Sound B laster de 16 bita:
S ./0 0 'e r .e r _ p r e 3 : C iC * i /P r e s t a c ic n e s d e l d t 3 c o s i u v o d ev/d sp :
S A L ID A

Cuenta con g a U ll a d o { . - i 0 $ e n / ig | do g ra b a ci n y reproduccin P t r n t e a cceso d ir e c t o a l o s b u fo r s do iu hardar

Lo que viene
En este captulo ol lector h a aprendido la program acin bsica do las ta r je tas de sonido m odiante la API de sonido OSS/Free que se pncuontrn in te g ra da en ol kerael de Linux. L am entablem ente, la program acin do sonido es un tom a extenso que merece su propio libro, de modo quo con cote anlisis ap-onas hemos roado la superficie del mismo. El prximo captulo. "C rea cin y utilizacin do bibliotecas de programacin", lv m o strar cmo u tilira r en us program as las bibliotecas do program acin existontos y cmo crear :ius propias biblioteca-i Dado quo las bibliotecas en general im plem entan las APIs com entadas en esta p arto dol libro, resu lta esencial com prender a d e cuadam ente, las tcnicas y cuestiones relacionadas con la creacin y u tiliza cin de bibliotecas.

'

'

'

'

. '

'

'

Creacin y utilizacin de bibliotecas de programacin


E ste capitulo tra ta sobro ia creacin y utilizacin de biblioteca* da progra mocin, que :-on colecciones de mdulos de cdigo que pueden sor reutilizados cada vez que resulte necesario en ur. program a Las bibliotecas son un ejemplo clsico del S anto G n al del desarrollo de softw are: la reutilizacin de cdigo. Las m ism as renen ru tin as de program acin em pleadas con frecuen cia y mdulos u lita e s en una m ism a ubicacin. L as bibliotecas e st n d a r de C son ejem plos do u tilizaci n de cdigo Las m ism as contienen cientos de ru tin as frecuentem ente utilizadas, tales como la funcin de im presin p r i n t f y la funcin de ingreso de caracteres g e t c h a r , que serian tediosas de rescribir cad a vez que se creara un nuevo pro gram a M s all de ia reutilizacion de cdigo y de la conveniencia del pro gram ador. sin embargo. las bibliotecas proveen una considerable cantidad de mdulos utilitario s totalm ente depurados y bien probados, tales como ru tin as p a ra program acin de redes, m anejo de grficos, m anipulacin do d a tos y llam adas a sistem a. E ste capitulo cubre ios siguientes tem as: Obtencin de informacin de una biblioteca M anipulacin de bibliotecas Creacin y empleo de bibliotecas estticas Creacin y empieo de bibliotecas com partidas L 'iizac n de objetos cargados dinm icam ente Todos los program as de este capitulo pueden s e r encontrados en el sitio Web n t t o : w.v*r. ~ c p . COffl in fo bajo el n m ero de ISBN 0789722151.

00

i i ; ) - ,i Programacin en Linux

) ) )t)

Antes de sum ergim os en ia creacin y el empleo de bibliotecas, el lector debe conocer las h erra m ien ta s que tiene a su disposicin p a ra ia creacin, m a n te nim iento y adm inistracin de bibliotecas de programacin. Se puede encon tr a r informacin m s d etallad a sobre el tem a en la s pginas del m an u al y en los documentos tex-ino (inform acin en form ato tex) de cad a comando y program a comentado en las prxim as secciones.
E l c o m a n d o nm

Ei comando nrc lista todos los smbolos codificados presentes en un objeto o archivo binario. El mismo se u tiliza p a ra v er qu funciones u tiliza u n pro gram a o p ara co n statar si una biblioteca o un archivo objeto proveen u n a funcin requerida, nm tiene a sig u ien te sintaxis: ra (opciones] archivo am lista I03 smbolos alm acenados en a r c h i v o , y o c io n e s d eterm ina el com portam iento quo exhibir esa in stan cia do nm. La tabla 14. i lista v aras opciones tiles de nm.

Tabla i 4.. OfxQnes del comando nm ___________________________________


Opcin
C 3

Descripcin___________________________________________________ ________
Convierte los nombres do smbolos a nombres a nivel do usuario. Esto resurta aspecialmente til para hacer ogiblos los romeros do ios uflclonos de Cunnto se la utillra con archivos do almacenaje de nrch.Vos comprimidor, (archi vos .o), adems to ios smbolos ciw> stos contienen, nm imprime ol Indice qya vincula 03 nomhros do dichos 3(mt)oWS con los nombres de los mdulos o m-cm cros do talos archivos en los cu,nos so orcuentr.-jn definidos esos smbolos Exhibe slo slmootos quo oo estn definidos on o archivo quo asta 9iendo exo minado poro quo pueden estar doflnldos ->n otrao bioilotcicas o archivos Utiliza lo Informacin fie doouracioo para Imprimir o; nmero oo lnoa en el cual esta definido ceda smbolo, o el respoctivo asiento de reubicadn si el smbo lo no aa encuentro definido.

-u 1

E je m p lo

El ejemplo siguiente u tiliza nm p ara exhibir los smbolos que contiene la bihlioteca / u s r / l i b / l i b d l . a :
EJEMPLO

na / U 3 f / l i O / l M l .a

head -10

_dli>cn_s?iecK

SALIDA
U

jjljjp m
(H orror ruii

NOOflaa w dlopen aeowaac t dlopfi_<oit d lc lo s e .o : u _ a l_ c cs9

C c D itu lc 1 - : C re a c i n y u tiliz a c i n d e b ib lio te c a s de p ro g ra m a c i n

301

La p rim era colum na producida por e sta salid a inform a la ubicacin, <>3ea el corrim iento relativo offset) en b y tes, expresado en notacin hesadecim ai. respecto de , origen del miem bro d l o o e n . 0 . de los diversos smbolos que se en cu en tran listados en la tercera colum na de dicha salida. La segunda co lum na es u n a n ic a letra que in d ica la condicin de cada smbolo. U (por un.defined) significa que el smbolo listad o no e st definido en el m iembro, a u n que puede e sta r definido en otro archivo. U na T (por text) indica que el correspondiente smbolo ?e e n c u e n tra definido en el rea de texto (cdigo) del miembro. W por wriuible) especifica un smbolo que, o bien no ser te n i do en cu en ta si llegara a e sta r p resen te u n smbolo de idntico nombre en otro archivo o. s: no se llegase a e n c o n tra r otro de nom bre idntico, se r de tocas m an eras reem plazado por u n 0.
El com ando a r

El comando a r cre3. modifica o ex trae archivos dei archivo comprimido donde se encuentren almacenados. Su uso m s comn es en la creacin de bibliote cas estticas, que son archivos que contienen uno o m s archivos objeto. Laa bibliotecas estticas son archivos objeto cuyo cdigo e st diseado p ara sor linkeado a un program a en tiempo de compilacin en lugar de serlo dinm ica m ente en tiempo de ejecucin. Las bibliotecas asiticas constituyen la anttesis conceptual de laa bibliotecas de linkeado dinmico de Windows (DLL o Dyrmme Linh Librar/). Los archivos objeto que las Constituyen M ddOtiiiAOA mtembroo El comando a r tam bin crea y m antiene una tabla quo efecto uno referencia cruzada entro los nom bres de los smbolon y los miembrojj en los cuales aquellos se encuentran definidos. En la parte 'C reacin do una bibliote ca esttica ', que se encuentra m s adelante en este mismo capitulo, se brinda un ejemplo de uso del comando ar. E l mismo tiene la siguiente sintaxis tr {c a s p q r - -t x> [cccuyw l [ a t w c r o j a r c h i v a _ c c < t p r i m < J o a r c h i v o [ . , . | a r crea el archivo comprimido de alm acenaje de archivos denominado a r c l u v o _ C O * p riaid o a p artir de la lista de archivos que jige a archivo. So requie re ai menos una de las opciones d. ffl, p, q, u. r y x. Normalmente so utiliza r. La tabla 14.2 descnbe las opciones de a r utilizadas con mayor frecuencia

Tabla 14JL Opoooes del comando ar.____________________________________


Opcin_____________ Descripcin______________________________________
c Crea a r c r u v o _ c c < n p rlm id a si sto r.o existiese / suprimo el mei*.sat que emitira a r si aquel no existiera. El arcn.vo serta creado igualm ente aunque -c no fuera especificado. Lo que s e Suprwrira e s el correspondente m ensaje. Crea o actualiza el m apa que relaciona ent/e si los smbolos con el m em o ro de a r c n i v o _ c o m p r im d o en el cual s e en cuentran fin ito s . n se rta un a r c n i v o en a r c h i v o _ c o n p r u n id o y suprime cualquier m tem ero existente cuyo nomore comcica con ol que e s t serao agregado. Los nuevos m.-emoros son a raaito s al fina: de a r c h V Q _ c o m p r is id o . Agrega re n n o s ai nai ce a r c h tv o ^ c o m p r im id o sin verificar s: se decen e f e c t ^ r 'eem piazos.

.3

P ro g ra m a c i n en L in u x

El c o m a n d o l d d

Aunque flm lista ios smbolos definidos en u n a biblioteca, no resu lta dem a siado til a menea que uno sepa qu bibliotecas requiere un program a. P a r a eso estd ld d . Este comando lista las bibliotecas com partidas que requiere un program a a fin de poder se r corrido. Su sin tax is es a siguiente: l3 (opciones I archivo ld d imprime los nombres de las bibliotecas compartidas que requiere a rc h iv o . Dos de aa opaor.es ms tiles de ld d son -d, que informa sobre las posibles fundones fallantes, y -r, que informa tan to aubru las fundones falcantes como sobre loa objetos que no se encuentran presentes. Las otra? dos opciones que re conoce ld d on V. que informa el nm ero de versin de ldd, y -V, que informa el correspondiente nmero de versin del linker dinmico, Id . so.
E je m p lo

SALIDA

Ldd informa que el cliente de correo m u tt (que puede o no e sta r instalado en el sistem a en uso) requiero do c:nco bibliotecas com partidas, loa juir/Qin/muct bMl.JO.t > /U6/1M91.4M (& X 4l)l>!U <J00) llbjljruj.a -> mr/llU,'UbsUnQ.ao, t <Dx4^2*0Wi ::2..10.6 > /Ub.'UBn.iJO 6 (tX4M72QMH W &Mj UBc.to.fl /U 0 /la c .in .8 (Ox-iW Ua/lo-llnux.O.? > /Ub/ld-Unu*.so.2 (0X4M96MQ) (el aigno => ea m eram ente un smbolo de indicacin y no mi operador) T n gase en cuenta que la salida de ld d puede 3er diferente en el sistem a del lector. La salida indica las bibliotecas que el archivo binario m u tt requiere para ser corrido. La prim era columna m u estra el nombre de lu biblioteca, que a m enudo ea un vnculo simblico a la ru ta de acceso completa a .a bi bioteca que e st listada on la .segunda columna.
El c o m a n d o l d c o n f i g

E l comando l d c o n f i g , cuya sintaxis es la siguiente: loccfl^ic !-:pcicnas; ;Bibliotecas] determ ina los vnculos en tiempo de ejecucin que requieren los program as a bibliotecas com partidas que se hallan ubicados en / u s r / l i b y / l i o y que son especificadas en bibliotecas en la lnea de comandos, y alm acenadas en / e t e / I d . s o . c o n f. O pera ju n tam en te con I d . s o , el linker/cargador d in mico. p ara poder cre a r y m an ten er vnculos hacia las versiones m s corrien tes que se en cuentren disponibles en el sistem a de bibliotecas com partidas. La fu n d n de I d . so es com pletar el linkeo nal en tre loa program as que utilizan funciones presentes er. bibliotecas com partidas y los archivos com partidos de biblioteca que definen esa3 funciones. U n comando l d c o n f i g sin ningn argum ento sim plem ente actualiza el a r chivo de cach, / e t c / l a . s e . c a c h e . El argum ento o p c io n e s controla el com portam iento de l d c o n f ig . La opcin -p le indica a l d c o n f i g que liste todas ias bibliotecas com partidas que I d . s o h a alm acenado en su cach, sin modificar n ad a. La opdn - v in stru y e a l d c o n f i g p ara que actualice el ca ch de Id . so v que al mismo tiempo liste la s bibliotecas encontradas. Si -ano

C a p tu lo

C re a c i n y u tiliz a c i n d e b ib lio te c a s de p ro g ra m a c i n

303

compila un program a que no se puede co rrer porque el mismo no puede en contrar u n a biblioteca requerida, se e b e r ejecu tar ld c o f lf i g -p a fin de lista r las bibliotecas conocidas. P ara v erd ad eram en te actu alizar el archivo cach de bibliotecas se deber ejecu tar L d c o n f i g como usuario root.
N O T A

Ccmo o xee ve?. 3 xj^r-rts^acn ae aofcxeeos ccmcs^iaas puede resultar compleja y co:'. ye s generar confusin. Un prcgrarrV) utllij una funcin 09finida n bibliotecas aomos.'icas s a socamente d nomore de 'a tuncn. sue a greudo se tercciina ciIjo safc;.. E yog.'3 m 3 re saOo crrc asta dertrea a funoio o cmo acceder 3 su esWao *n ugrroo de ?ecjc3>n. U vea de I d . se consisto on CO'KCI I eso < \ norrire de la fun dn zbz 0 cwe efect?v.srner-?e mrcterorta la nrsme que reside n una bitwcwca conv sarwa). -netoc o-j- irelua i d . so rara l o e s t o se encuentra mucho n-45 all de1 ,a * arce ce esta C o ro nmttanvxct ce aoiic aciones. todo lo que 10 ccott OfOCWW al 'ector .-toar a v , precrame im o>oiiGtca3 que jrnrejwndar, Pwte dar por asumido -sTein (XOr^mervte <xe L-ux se hoco cargo do los Cctafiei comoie-os do la tarea.

V a ria b le s d e e n to rn o y a r c h iv o s d e c o n f ig u ra c i n

El linker/cargador dinm ico ld.so em plea doa variables do entorno p a ra p e r sonalizar su com portam iento. La p rim era do ellas es SLO_LIBRARY_PATH, u n a lista de los directorios, separados e n tre ai por signos do dos puntos (:>, donde buscar i d . s o bibliotecas co m p artid as en tiumpo de ejecucin, ndem s de hacerlo en los directorios p red eterm in ad o s / l i b y / u s r / 2.b. La se gunda variable. $LD_PRELOAD. es una liiita sepurada por espacios en blanco de bibliotecas com partidos adicionales, especificadas por ni usuario, que de bern 1 e r carg ad as an tes que tocis hut d em s bibliotecas. E sta variable de entorno se etaplea do m anera selectiva paro anteponerse a funciones quo pudiesen e sta r definidas por o tras bibliotecas compartidas. I d . se tam bin se vale de dos archivos de configuracin cuyos propsitos em u lan los de las variables de entorno que acabamos de mendunur. / e t c / i d . s o . c o n f contiene una lista de directorios e n los cuales el linkor/corgador deber buscar ios bibliotecas compartidas que requiere el programa. Ello como agrega do a les directorios estndar, i u s r / l i b y i i b , que li s o siempre recorre. etc.- i d . s o . p r e l o a d es una versin basada en disco da la variable de entorno SLD_PRELQAD: contiene una lista sep arad a por espacios en blanco de las biblio tecas com paradas que debern ser cargadas antes de !a ejecucin del programa.

Bibliotecas estticas
Las bibliotecas estticas (y tam bin las bibliotecas compartidas, p ara el ca so- ;on colecciones de uno o m as archivos objeto que* contienen cdigo precompilado reunlizable. C ada uno de los archivos objetos que la in teg ran se denom ina tam b in m dulo o m iembro. L as bibliotecas estan cas son alm ace nadas en u n formato especial ju n to a u n a ta b la o rruipa que vincula los nom bres de los smbolos a ios m iem bro- en ios cuales stos se en cu en tran defini dos. Dicho m apa perm ite acelerar ios procesos de compilacin y linkec. Las bibliotecas est tic a s g eneralm ente tie n e n u n nom bre que term in a en una ex tensin . 2 .por archivo de alm acenam iento de mdulos). Recordemos que los mdulos presentes en las bibliotecas e sta n c a s son nkeados a un progra m a cuando ste es compilado, m ien rrss que sus co n trap artes presentes en

;
304 P ro g ra m a c i n e n U n u x

las bibliotecas com partidas son linkeadas por 1C . SO a un program a en tiem po de ejecucin.
C r e a c i n d e u n a b ib lio te c a e s t t ic a

P a ra u tilizar los mdulos presentes en u n a biblioteca esttica so debe in clu ir en e l cdigo fuente del program a que los va a em plear el archivo de encabe zado de dicha biblioteca esttica y lin k ear la m ism a al program a d u ra n te su compilacin. P a ra crear u n a biblioteca propia se deber re u n ir en u n nico archivo las rubinas que uno u tiliza con m ayor frecuencia y luego crear un a r chivo de encabezado que declaro las funciones y las e stru ctu ras de datos. El archivo de encabezado contiene la interfaz a dicha biblioteca. Los dos ejem plos siguientes crean en conjunto una biblioteca de ru tin a s p a ra manejo de errores quo lo puede re s u lta r de utilidad. NOTA
O je n e s hayan ledo Advanca Pngrammtng in UNIX enviroament se Richard Stevens conccoran M os tos programas. Yo ' os ho utilizado durante muchos aos porque cubren pe/fcctamartte mi necesidad de una biblioteca de yJn'nistractfn do ".To ros sencilla y funciona!. Quedo roconocdo a la generosidad dol Sf. Stovon3 al r-iooimn permitido reproducir estos creramos aqu. Asimismo to precu-o mucha tristeza el enterarme de su fallecimiento a comienzos do sepCerrD de 1999. Richard Sovonn fue un oxcelonto programador y un tOtVBSBtientC ex;ositor de lo dotalles de in programacin en UNIX y TCP/IP. Sus aportes a a claridad do oxposcin de los dotallo de ios APfi tonto de UNIX como do TCP/IP va.- a ser dolorosamente extraados.

E je m p lo

El prim er !atado que vieno a continuacin, l b e r r . h, 1 archivo de enca_______ bezado do una sencilla biblioteca de manejo de errores, m ientras que el sec k m p io inundo listado, que viene inm ediatam ente desp u ta dol prim ero, es la implementacin do la interfaz definida en el archivo de encabezado. Podra resu ltar til em itir previamente alguno comentarios acerca del cdigo. El archivo de encabezado incluyo < s t d a r y . I> debido a que se utilizar la utilidad do ANSI C para funciones con nmero variable do argum entos Ist no se encuen tra familiarizado con las funciones con nm ero variable de argum entos, con sulte algn texto o manual de referencia sobre C). E ste nmero variable de irgum entos se indica en los funciones m ediante puntos suspensivos (. . .). Para protegerse contra m ltiples inclusiones del encabezado, el mismo viene inserto en un macro vaco de prcprocesador, LIBERR_H_ Esca biblioteca no debera ser em pleada en la construccin de daemons por que ia m ism a escribe a s t o e r r . Los daem ons generalm ente no cuentan con una term inal de control, de modo que no pueden efectuar salida a s i d e r r (ver capitulo 9, Daemons*, p ara o btener m s informacin sobre la construc cin de estos programas).
> son ora d a sta a rcn iv a de cncanazaco c-n C r a m e * : l b e r r . t i /

r * &LDLiatec3jr''oros.n
O d a r a c i c r a s C3.-3 una s e n c i i a b ib lio t e c a 58 nan ejo de a rre .-e s

.1

J . )

)
305

C a c i t o 1-i: Creacin y utilizacin <e bibliotecas d e p ro g ra m a c i n

V * r ," r
e fin * L IS S .* . i-Tciuc-e < r : a - : '>

Msfins AX_.0_r=XT0 4056 /*


in p riJ .- jr. r-.j^ j

-p o r j J t d r - y r t ? m a r j cu ie.i a fa c tu o l a laseos

r
r a id * 9 t ? a r _ :_ ? * r 5 r j i j r s t ch.ar p < .n *ero _ *a B la C H iesb ro s, . .

I'
IflO -ia lr n = * r . J ; c r r q r a t : r r y s a l i r

*i
vcw ia lir _ s . _ * r r c r ( c c < v t f u r x jn u M ja o ia S flM te B O r o * , . . . I ,

/
A ss-ta r 3 9 - ije ^ *ctu c U lla * W a ? r - o r n a rcftivo - e c u t r a _ e r r o r 9 i y r e t o r n a r a quien

*/
O l iS rttr_ y _ r* to r*a p < C '* a r A r h v c . f l g i t r e e p p o m , ca n s- e r a r p u .i:e ro - T i i* D e t* & r a i. . . . ) ; s e n t a r vfl " s a je tfe t r - o r m '5 l * t r o _ t r r o r j y s a l i r

I
o l i j U V _ y - M ir(C * r * rc n iv o R < JiJtro E rro rij, c o c ; citar *5untro_7ja.i>tf:T!:raa, . I;

/*

loriMir n

i < * s a t t * r r o r y - t e r n a r a <}oin ifactuc la lla n ad a

v
vo:S y s o r m r t -'^ r (c c P - criar 'puntero *a01a0ntarc5, v*_U st punto^ar-junim os, era-* "*fcnivofiq::rcrro< a j:

t^r/U1 t:8CT_H_ fr-OLf /* L:5sS_M _ /


F IN D E A R C H I V O D E E N C A B E Z A D O Y C O M IE N Z O D E A R C H IV O D E P R O G R A M A
/ tfltr d#i ;p o * im r I n te r r .a t: l i 3 r r . c /

/
S i a L ia t la j ^ .-o r * i .e - In p la m n ta e io r ce la o i b li o t e c a da .toulos d n o jo do r- -* s

/
# ift c l* < r r .- e . v liflc lu a # < s t r g . n > P ara la d e fin ic i n o# tr r n o / ? a r a l a s c e c U r a c io r .e s oe fu n c io n e s jue arsu a e n tca ,

acactxn
lis :a s v a r u e s

<stcii3.n> *ir.;lvc <st3io.r> *i.-i.3 5 'c 2.'ot?:3_3'*:'-55.n*

' >luastro propio archivo Jo encabezado


. .)

'<

.-sis -5 to rr.a ."_ s _ srro --'c o n s t c n a r cu r.-3 ro _ 'at?la )8 M iriD ro s,

306

Programacin en Unux

v a _ l m fMntr(3_3rgumsntos; /

va^stirtJpuntsn^arguw itO B , punt9ro_TjbUD8Wi#n5ros>; :npriBir_srror(sunt9ro_Tatla09Minl>ros. pur:ero_argunentos, NULLl; va_9r-i; a u rti^ a rg u n c n to s );

rttum ;

od s a lir _ s ;_ r -o r( c o im cnar oun:*',o_TolaDei9nbros, . . . |

<
v _ U tt 3untro_aruner.:os; # .tjrTipon:ro_4rqga8rtos. oyntnro.r.iDlaOoytniioroiii :.*aruur_r*ror (p un te o.ra blalJe N ie eiro i, puntnro_arBinwintos. NUL.), *4jino(piitera j*rgu9nto|;

voto J S M tjr_ ^ r* :a rn * r |ch.ir A rcnivcfloo istraE /T or*, conat cnar , puntro_'abl.iOMl*rl>r<!ii1 ...

(
v a . l i i t pufltro_arguBBntos; va^ tirtp yn t ro^ arg m ian tos, punt*ro_TablaDeUiantro); ia p rLsir_ rro r(p 'jn :9 ro TablaCeMlonoros, purterojirguniHiTas, A rc M v o R a g istra trro re s); vs^ne 15un:ero_argunento5); rturn;

>
v o i< 3 ase n tsrjr s a l i r {char re g is tro ft.-rores, ccnst c.nar puntero TaijlaDettianO'-os,

, . .1
v a _ lis t ouniaro_arguner.to$; /a_st= rt(punt9ro_argunr.tos, pum cro jraaU D euian b rsa); i*ori*r_rr&.-<puftterp_Toiel>alliearas,. puRtero_arjunantes, A 7 cnivaaeg i3trcrror6S|; va_erd(pyrttro_argutntos);

>

'

'

Capitulo 1*1: Creacin y utilizacin de b ib lio tec as de program acin

307

* 0 i3

t - r z - ( c o - s : :-!a r p ^ n t e ^ a r j u n e n t c s . v i _ U 5 * s u rta ro .a rg -jn e n to s , C*r~ A >^;v5.9 ij 1 5 1 r o r es )

( 10* y-iroir_*rr3T: FLi pgnt*f0_ArcrtWcR*flitr06 rrores;


guarCar_rror *rn*.o; a m a r U e 'u u r /
* Valor <ju cuier efectu U llanada pueCs

*pri.itft5v<f. ??. jr:fo_irgunr.toj|;


y
l f ( A r c n iv d l # g l s t r e 6 r r o r t W JU)

/ r*nto * rtn tn i cmo sp rin t^ ),


a ta c a r to c /

K"

ssri/!tf{6u* trtentoyf), *: \jVfl*, t?rrror{ggrsUr_4rroi*) I !


r : a *0 : 0 u itd o u t y s t d a r r co l/ic isu n /

t.f{{P 5.ft:*ro * r c A iY ( > ? ^ ii:r c 6 r r o r a * fo p e iH A rc iU v a flo flistro rra ro B , * a * )}

f HU.LI (
fp y t { 0 u f, p u n : r o _ A r c -n * e a 9 i. r o r r c r i) ;

fcic*(poftttro_A rcftl *#flu:rorrflri);


coa *uftc:ane ta rd a r

/Archivo a o ia rto y c o rrid a

o* C, no ce<i

an aaas a

t U M U /

) is a
' p c t s l Kc i t poco w i r

t i a rc h iv o o* r * Q ii: r o \ n \ it a a r r ) ,

Isa
fpvtH O w ?, a tfla rr| ;

VUsftlMXJ.); /* P-aiijar tooo / .'tum ; > Para crear an a biblioteca esttica, uno debe prim ero com pilar au cdigo a formato de objeto. Luego, u sar la u tilid ad a r p a ra cre a r el archivo que con ten d r los mdulos. Si todo anda bien (si no existen errores lgicos m de tipeo en el cdigo fuente), se b ab ra creado ia biblioteca esttica O lD i i o t e c a _ e rr o r e s .a .
S ;:c -c O iD s x s - ^ _ 3 r r o r i.c -o c i3 lic t c & _ > ir r o " s .a i s i o l i o '.t c s .i r 'a r e s . a l 5 li c t e c a _ i r r o r * s .o $ i - - r -c

S -a s u l i c r i j r ' s r i s . i
SALIDA

o : iiot*ca_ir-: '5 s . o:
j ^ e tW i* T _ r r rc _ la c a t:o n

iB o r - j ir _ s r r o r

ttM M M T

-a to r r a _ !_ = .--o r

U a tit j fcioss

>

'

>

>

'

3 08

Programacin en Unux

U
U

" lush
*aper,

U fpiits
0e?3fl08 t JW<3C3"3 T N a e w S r 9 c c 2 _ c o r o ii : . 2 s e n t.* r_ y _ 5 a la r 3 S 9 n ta r _ y _ re r o rr jr

U J
U U . U U

3 p n n :f 3tfiflrr
3t<J0Ut s trca t stre rro r 3 t r l n

J vscrint El segundo comando croa b i b l i o t e c a _ e r r o r e s . a a partir del archivo objeto creado por el compilador. El tercer comando, nm b i b l o t e c a _ e r r o r e s . a. lis ta los miembros del archivo que aloja los mdulos de la biblioteca seguido por las tunaone3 que contiene la misma. Como se puede apreciar a p artir de la sa lida de nm , el archivo que nloja la biblioteca contieno las funciones definida*, en ol archivo objeto b ib L o t e c a _ e r r o r 8 S . o. Las misma vnn precedidas en el liatad por una 7.
E m p le o d e u n a b ib lio te c a e s t t ic a

A hora quo ha nido croada la biblioteca, se necesita un program a para poder controlarla. El progrnm a de prueba forma p a ite del prximo ejemplo In sis timos, pora utilizar la biblioteca, incluya el archivo correspondiente archivo de encabezado on su cdigo fuente, utilice gee con su opcin 1 p ara vincular la biblioteca al cdigo fuente, y luego em plee la opcin L p ara ayudar a g ee a encontrar el archivo de biblioteca.
E je m p lo

ejfMPLO

El siguiente program a, c o m p ro b a r j n b l o t e c a , in te n ta a b rir un archivo inexistente cuatro veces, una vez por cada una do las funciones de procesa miento de erro res presentes en la biblioteca. y Sonbra archivo *n Internet: e rrtest.c r
c c a a '- o b a r . o ib lio t c a . o - ? r o g r .in a da c o n p r c o a c ic n d e La b i b l i o t e c a a# na r.e to

S erares t inc'.ie <stsio.n>


L i c l j a e < 5 :d i:b .n >

induce Libere.n *C5!u .fl SALTHAfl_SAi.Ifl.Sl_SRtt>R I CJf^e &LTARjSeN7ARY_SA.IR I

.>

) _ t

/ 309

Capit-jlo i - : Creacin y utilizacin d e bibliotecas de programacin

r t in(tfo la

{ -l ^z '?.r-3rc_srcr-iYZ; -z-j-*('C<scn:$ir.c: r e to m -_ 3 i_ e r r o r. .\n*, stddut);


:*{(& j* t* a _a rcn vc fooen{*foo\ V ) ) = NULL) -JWffla.- 5; erro- ' Si \s -9 t c r n 3 r _ s i r r c r * . *no pudo a c r lr *0 0 . se 5 x1 3 * 5 3C50 archivo 3 directcruT.*)"; fputsrOaprobr>dO Hflt4i*_y_r*tornar. :ocRt9ro_afCiIvo * 'c a e r{V o o \ \n , std su t);

*r*)) == NULL);

ju n ta r j <*w rn*r( cei5 <-'ar_btbU 5 t c a .l 09 *. Ss S*, asor.tarj retornar , no pcco'asrir fcc. So t x s t t 4ic.no artfnvo o directorio.*); if '-C if SU.TA_SAL:3_SI_ei0fl SUtsCCeBprobtflCo W llr _ jl_ * r r g r

,\n ', rtdOUt):

f{(ow >tro_rcnivo rcceiC fco* . V ) ) == v j:.L ) r*:crr.ar ai r'or(*>i3 Va*. s a U r_ Ji_ # rrc r , no poca abr-- foc. xc erist* lefio arsftivo o d ire c to rio )!

#*vat*

/ imjXJITjSCf

Itf s a if SALT5M_ASMTAfl_Y_$ALtfl f5ut('Cocr3M n.:o a j n t ir _ y _ s a lt r ...\ n ', stdoot); lf{(0 w n ro _a rcfllv0 fapenCfoo', - ) ) * MULLI
* c :* r _ y _ r * :0 rr * ,-r c e fl0 M 0 ;ir jn a iiC W c a .lc g \ V #\ \ i? .o n u r _ y _ 3 a ir ,

no pas a e n r feo. h o m * t # oicno arcntvo o d t rt c ta r io . ) : #*acif

/ J_XIIT_SXI> V *i:x:r_$ycc<ss);

I Luego de com pilar y correr c a m p r o b a r _ b id L i3 te c a e obtiene la sig u ien te salida:


i 0:c a cccr50jr_DifiLi3C4ca.c -o coaproesr_d:blioteca -L . -le r r i ..'eoeprcear_oi3ictca

t^BprizircG rato rrar_ii_erro r


'* * .o rra r_ s i_ rrc r nc certa a e r ir i'oo. *(o x i j t e atino irc n iv a o d i r o c w r lo .

Ccaorcoa.-VM ':c#Tjrj_3safl:ir
J cat cwcrc&ar_bibl:.=tsc3.l0C

. . .

jier.Tar_y_r5torr.ar no ccCfl io r t r roo. No exista dicto arenvo o c ira c to n a .

Los cm bloques i f n d e f - # e n t i f ev itan la ejecucin de las funciones _ q u i t . P a ra com probarlas, cm em e uno de los macros y vuelva a compilar, y luego comento la o tra y recom pile de nuevo. P ruebe la comprobacin de las funciones * _ q u it como ejercicio d e prctica.

310

Programacin en Linux

Bibliotecas compartidas
Las bibliotecas com partidas tienen v arias ventajas por sobre las bibliotecas estticas. Prim ero, utilizan m enor cantidad de recursos del sistem a. U tili zan m enos espacio en disco porque el cdigo de las bibliotecas com partidas no debe ser compilado con cada archivo objeto sino que se lo lin k ea y carga dinm icam ente en tiempo do ejecucin desde u n a nica ubicacin. E stas bi* biiotecas em plean m enor cantidad de m em oria de sistem a porque el kem el distribuye la memoria que ocupa la biblioteca e n tre todos los program as que hacen uso de ln m ism a en un momento dado. O tra ventaja de las bibliotecas com partidas os quo son ligeram ente ms r pidas porque deben se r cargadas o la m em oria slo una voz Finalm ente, las bibliotecas com partidas sim plifican el cdigo y el m antenim iento del siste ma. A m edida que se van corrigiendo orrorc> o agregando prestaciones. los usuarios lo nico que tienen que hacer es procurarse una versin actualiza da de la bibhotoca e in stalarla en su s sistem as. Con las bibliotecas estticas, cada program a que huga mo de la biblioteca deb ier recopilado, Como ya fuu :iu'.aludo, ul linkor/cargador dinm ico. I d . s o , vincula los nom bres do los smbolos en tiempo de compilacin n la biblioteca com partida en dunde lo rainmoa etn definidos. Las bibliotecas com partidas tienen un nom bre especial, sonam e, derivado de la extensin .no (shareablt object u objgto comparCihia) do ui archivo (nam<? significa nombre), cue consiste del nombro di; la biblioteca y ul nmero principal de nu versin. E! nombro completo do la biblioteca de C en unu de mis sistem as, por ejemplo, es li C . s o . 5 .4 .4 6 El nombro de la biblioteca es libc.so; el num ero principal de la versin es 5; el nm ero secundario os 4 ; y 46 es el nivel de su edicin o parche. De mudo que el sonam e de (v>a biblioteca de C es l i b e . s o . 5. El sonam e de la nueva biblioteca de C, l i b c 6 , es 1 i b c . s o . 6; el cambio do dgito principal de la versin indica una modificacin de la biblioteca, ol g ra do de quo la m ism a y la an terio r resultan (muy!) incom patibles. Los nm e ros secndanos de la versin y los nm eros del nivel de parche v an a p are ciendo a m edida que se van corrigiendo los errores, pero el sonante perm anece invariable, lo que significa que las nuevas versiones son esencial m ente com patibles con las versiones anteriores. R esulta im p o rtan te ten e r en cuenta el sonam e de u n a biblioteca porque los aplicaciones se vinculan co ntra el soname. Cmo funciona eso? La utilidad ldconfig crea un vinculo simblico desde la biblioteca efectiva, digamos l i b e . s o . 5 .4 .4 6 , hacia el soname, liO C . s o . 5. y alm acena dicha inform a cin en / e t c / I d . s o . c a c h e . Er. tiempo de ejecucin. Id .S O recorre el a r chivo de cach, en cu en tra el sonam e requerido y, debido a la presencia del vnculo simblico, carga a la mem oria la biblioteca que efectivam ente corres ponde y linkea las llam adas a funciones de la aplicacin a los smbolos a d e cuados en la biblioteca situ a d a en la memoria. Las sucesivas versiones de una m ism a biblioteca se vuelven incom patibles en las siguientes condiciones:

Capftu3 1 - : Creacin y utilizacin de bibliotecas de programacin

311

K an sido modificadas las interfaces de fo ndn exportadas. H an sido aad id as nuevas interfaces de funciones. El com portam iento de ciertas fu n d o n es varia respecto de su especifcad n o rig in al K an sido modificadas las estru c tu ra s de dato s exportadas. H an sido aad id as e stru ctu ras de datos exportables. P a ra m a n te n e r la com patibilidad en tre bibliotecas, utilice como gua las si guientes p autas: E n lu g ar de preceder a cam biar fu n d o n es existentes o modificar $u com portam iento, uada a su bibliotecas funciones con nuevos nom bres. A ada elem entos de e stru c tu ra slo ai final de los estru ctu ras do datos existentes, y o bien deis* carcter opcional o inidolcclas den tro do la propia biblioteca. No expanda las e stru ctu ra s de dato<* utilizadas en arreglos,
C o n s t r u c c i n d e u n a b ib lio te c a c o m p a r t id a

E! proceso de co n stru ir uno biblioteca com partida difiere ligeram ente del que es em pleado p ara construir una biblioteca esttica. La siguiente lista e s boza los pasos necesario# para c o n stru ir una biblioteca compartida: 1 C uando v* compile el archivo objeto se debe u tilizar la opcin t'P IC do g e e , que genera cdigo PIC (Cdigo Independiente de la Posicin) que se puede lin k ear y carg ar en cu a lq u ie r direccin do memoria. 2. N'o so debe utilizar ln opcin f o d itt fram e p o i n t e r de g e e ; si se lo h iriera , la depuracin del pro g ram a e volvera prcticam ente im posi ble de realizar. 3. Se deben u tiliz a r las opciones de *gcc - s n a r e d -sonaino. 4. P a ra p asa r argum entos al linker, I d , utilizar la opcin-W1 de gCC'a. 5. Se debe lin k ear expresam ente la biblioteca de C utilizando la opcin l de g e e *s. E sto g a ran tiza que el program a el mdulo no sea compila do a u n program a que carezca de la versin correcta de la biblioteca de C porque la s referen d as a las fu n d o n e s nuevas o modificadas ocasiona r n errores en el compilador.
E je m p lo

E ste ejemplo construye !a biblioteca de m anejo de errores como u n a biblio teca com partida. Prim ero construye eL archivo objeto y luego linkea la bi blioteca. D espus crea vnculos simblicos en tre el nombre completo de a biblioteca y su soncm e y arre- el nom bre completo de la m ism a y ei nombre de la biblioteca com partida que, sim plem ente, term ina e n a . SO.
S -? :C c 5 U }it3tca _rrcras.c -o D_:LiotCS_5rr:r3s.? s acc -5 -$*<*.** -d l.-s c r-ia , coliotecs_rrors.so -o

3ioU'r:sca_<* - r'53.;c.!.$.2 sifcLicteca_srn)rss.o -le * :n -s i.3li3rci_irrc'53.S5.T.0 .2 &ifiU0t9C3_8rnjr3s.30.1 5 ln -s 5ioiiotcc=_;rr:,-3s-so-i-O. 5:nii.:-:3C3_cr.-0rcS.50 Como e s ta biblioteca no ser in sta lad a como biblioteca e sistem a en / u s r o u s r i i b . se deben crear io s vsculos. uno para ei soname y uno p a ra la bi-

)
312 Programacin en Linux

blioteca compartida. Cuando linkec b i o l i o e c a _ e r r o r e s , es decir, cuando je utilice - l e r r r ei n k cr em plear el nombre de la biblioteca com partida.
Em pleo d e u n a b ib lio te c a c o m p a r t id a

Ahora, para em plear la nueva biblioteca com partida, regresem os al p rogra ma de prueba presentado en la ltim a seccin, c o rc p r o b a r_ b ib lio " t9 C a . c. Otra vez. hace falta indicarle al iin k er qu biblioteca u tilizar y dnde encon trarla. de modo que se debern u tilizar las opciones -1 y -L. F inalm ente, para ejecutar el program a, se n ecesita indicarle a I d . SO, el linker/cargador dinmico, dnde encontrar la biblioteca com partida, de m anera que h a b r que emplear la variable SLD_LI5RARY_PA7H.
Eje m plo

EJEWPIO

Este ejemplo linkea a c c m p r o b a r _ o i b iio t e c a la versin com ponida de la biblioteca b i b l i o t e c a _ 0 f 'r o r a s y luego corre c o m p r o b a r _ o i O i io te c a . S gcc -g canpraoarjjibUoteca.c -o conprabarjubiloteca L. lerr S L0.'.tfiRA3Y_?ATH-$(3iit| ./orrtoat C^narobanaa rtarnar_s;_rrar. .. P9torr>ar_l_rrar p.o puo a s r t' oo. o M ista dicho archivo o oixectorio. Cotprobanfio as*<itar_yj*otoi*nar... Tal como so lo seal anteriorm ente, la variable de entorno SLD LIBRARY PATH aade la<s) rutis) do acceso quo contieno a loo directorios de bibliote cas confiables / i i b y / u s r / l i b . ld.no buscar prim ero en la ru ta especifi cada en dicha variable do entorno y le b rin d ar lu seguridad de encontrar su biblioteca. U na altern ativ a a om pleur osa complicada lnea de comandos os aadir ia ru ta de n biblioteca a / e t c / i d . s o . c o n f y actu alizar ol cach . / e t c / id .so .c a c h e )c o rrie n d o < c o m o u au ario ro o t) l d c o n i g Aun otra altern ativ a consiste en m e ta la r su biblioteca como biblioteca de sistema. P ara efectuarlo, convirtase en uauario rcot, coloque la biblioteca on / u s r / l i b y corra ld c o n i1Lg a fin do actu a lizar ol archivo de cach. La ventaja de esto ltimo mtodo es quo p a ra a ad ir la ru ta de acceso a dicha biblioteca uno no tiene que u tilizar la opcin -L de gcc.

CALIDA

Objetos cargados dinmicamente


Existe una m anera adicional de u tilizar las bibliotecas com partidas: c a rg ar las dinm icam ente en tiempo de ejocuciu. no como bibliotecas linkeadas y cargadas de forma autom tica sino como mdulos totalm ente independien tes que se cargan explcitam ente em pleando la interfaz d i (carga dinm ica). Se puede qu erer em plear la interfaz d i porque provee m ayor flexibilidad tacto p ara el program ador como p ara el usuario y porque resu lta u n a solu cin ms general para la cuestin de la reutilizacin de cdigo.
En q u c o n s is te e s te tip o d e o b je to s

Los objetos cargados dinm icam ente son mdulos de cdigo cargados espec ficamente en tiempo de ejecucin con el propsito de utilizar la funcionali dad que proveen sin que sea requerido que la correspondiente aplicacin sea linkeada con los mdulos que contienen el cdigo cargado. Supongamos que

}
C30ru!0 1 - : Creacin y utilizacin de bibliotecas de programacin 313

uno est escribiendo u n program a grfico im portante. E n su aplicacin, se m an ip u la datos grneos de u n a m an e ra personal pero sencilla de utilizar. q desea poder im p o rta r 7 exportar los datos desde y h a s ta Sin em barco. < cualquiera de los e n te s de form atos grficos de archivo disponible?. U na m an era de lograr esto seria re d a c ta r u n a o m s bibliotecas que m a n i pulen es diversos formatos. A u nque se tr a ta de un enfoque de tipo m odular, cada modificacin de u n a biblioteca req u e rira la correspondiente recompilad o n , o por lo m enos un nuevo linkeo. de su program a, lo mismo que lo re qu erira n el aadido de nuevos form atos y las m odificadones a ios e x isten tes. E l efecto del agregado de bibliotecas se ilu stra en la figura 14-t. iccf-zaxr 0>M

F ig u ra 14.1. Cada mdulo de biblioteca aadido a un program a incrementa su tam ao y obliga a su rccompitacin. Como :e puedo ap reciar en U figura L4-1, cada voz que 8e audo otra biblio teca a un program a, au m en tan el tam a o y ln complejidad del mismo. El ta mao crece enpecialmcnte rpido cuando se lo vincula con bibliotecas e s t ti cas, rep resen tad as en la figura por l i b e . a y 1 1 b d . a. La interfaz d i perm ite un enfoque diferente: uno disea una interfaz g en ri ca, de formato neutro, p ara lectu ra. escritu ra y m anipulacin de archivos p 1 ficos de cualquier formato. P a ra a a d ir a su aplicacin un form ato grfico nuevo o modificado, uno sim plem ente redacta un nuevo mdulo quo ad m in is tre el nuevo formato y ad vierta de su e x isten d a a la aplicacin, tal vez modi ficando un archivo de configurarin colocando el nuevo mdulo en un directono predefinido (los aadidos (p/u-i/j.s| que increm entan las prestaciones del navegador de Web N etscape em plean una v arian te de este enfoque). P ara extender laa prestaciones de su aplicacin, los usuarios deben procu rarse u n nuevo mdulo editando u n archivo de configuracin o copiando el mdulo a u n directorio preestablecido. La recom pacin se hace innecesaria El cdigo existente en su aplicacin carga los nuevos mdulos y, oh sorpresa, uno puede com enzar a im portar y ex p o rtar un nuevo formato grfico. E 3 te enfoque se m u estra en la figura 14-2. C ada vez que se necesite o btener cdigo de una biblioteca diferente, sim p le m ente em plear la interfaz di a fin de carg ar la funcin que se requiero, lo que se ilu stra en la figura por las lechas que a p u n ta n desde ia aplicacin hacia 1zs diversas bibliotecas. Los requerim ientos globales de recursos por

>

>

316

Programacin en Linux

*/ *;1Cll;d3 <SWi0.h>
=irclude <$:diic.n> nrclu d e <dlfci i>

iot cain(void) C void -nar.cls;


vot<3 ( 'r u t i n a j 'o a u a r i d a ) ( I ; r c o n st e r a r * n ifi5 a je _ 3 r r c r ; F I l p u n t ro _ arc :lv o ; Pun tero a U r u tin a cardada a 38 " i ; t i l i i 3 0 3 /

'.argar al objeto ? j n9c?5lt3no$

'I

n a r o l* = d l o p n |* b i b l i o t e c a jrro ro s. s o * , Rn.o_WWl;

ifinandi? - suu> (
o r in t r r v a so 3UC0 carear bibliotcca_r"ores.so. 's\n*. fllr r o r(| J ; exit(EXIT_FAUJRE);

>
> S lu iinar la cadena descriptiva ol e rro r, si or.ta * l to / d le rro rf ); 'utir.n rcjuoridu oisynhnndln, , r o ? o r f l i r j U j r r g f ) ;
:f| |M " * a |flj r r o r jio r r a r ( | - MJU.) {
: V s\r ,

a rtn t^ rv o

jo

encongo r to r o a f _ _ r r o r (

n#nsajoj*rror| ;

xlt(EXXT/ALUBEJ;

] r M\or.\ u ti il j r ol sudlo cacado. rmornar_3j_err<ir /


:f({ jX in t ro _ a r h iv i> rcn(* f o o b n r ', V J) ** NUIL} r u u n * _ r s < ju * r id a ( 'X o 58 suda a b r i r f c a b a r , * ) ;

r Sea consiiarjdo con i projmo y descargue 1 oojsto carraca ",


diclc$i*(nandL|
4xit(cX I7_Sl.C C eSS>;

\
s

La salid a de oate program a es la siguiente: jcc -q -wali ccirp.-obarjji.c -o c a ro b a r_ c l -le

3 lO_l3ftMY_PATVtSi pw3) . i cc-iaro6ar_oI fio s puco j t r r f cacar. do existe dicna archivo o a i's c to n o
SACIO A

Tal como se* puede observar, uno no tiene que linkear b i o l i c c e c a _ e r r o r e s ni incluir el archivo de encabezado b i b ! j . o t e c a _ e r r o r e s . h en suedigo fuente. Todos lea accesos a b i D l i o t e c a _ e r r o r e s . so se realizan por medio de la interfaz d i. El uso que realiza c o m p ro a r_ a l de la llam ada a d i e r r o r ilustra sobre la m anera -correcta de utilizarla. Se llam a una vez a d i e r r o r

Captulo 1 - : Creacin y utilizacin do bibliotecas de programacin

317

para poner La cadena descriptiva de errores a NULL. se Uair.a a d lsy m y luego se busca nuevam ente a d l s r r o r p a ra gu ard ar el valor retom ado por la m ism a en otra variable, de modo de poder u tilizar dicha cadena cuando se lo requiera. L ia s e a r u * ir a _ r 9 Q u e r id 3 de a m ism a m anera que lo hara norm alm ente a 3 fundn a la que a p u n ta la m ism a Finalm ente, descargue el objeto com parti do y term ine ei programa.

Lo que viene
Este captulo h a explicado el em pieo y la creacin de bibliotecas de p rogra macin. Tam bin concluye con la co b ertu ra de los A PIs de program acin. La P arte IV, Comunicacin e n tre procesos*, exam ina una diversidad de m an e ras con la s cualcs los program as pueden com unicarse e n tre si. En particular, el lector ap ren d er sobre pipes y FFO s. m em oria com partida y colas de m ensajes, y tam bin sobre sockets.

Parte IV

Comunicacin entre procesos


1 5 . P ip e s y F IF O s 1 6 . M e m o r ia c o m p a r t id a 1 7 . S e m f o ro s y c o la s d e m e n s a je s 1 8 . P r o g r a m a c i n d e T C P / I P y s o c k e t s

). )

15
Pipes y FIFOs
Este es ei prim ero de cuatro captulos que cu b rirn los diversos m todos em picados por Linux p ara p erm itir la comunicacin e n tre procesos, tam bin denom inada IPC InUrprocess C om m unicatiqn). IPC es una sigla genrica que se re ere a los mtodos que u tilizan los proceso3 p ara comunicnrso onrre s Sin una IPC. loa procesos podran intercam biar, slu intercam biar, d a tos u o tra informacin e n tre ellos n icam en te por medio del ilesystem o -e n ei caso de procesos que tu v ieran un ancestro comn (tal como ocurre con la relacin padre/hijo despus de un f o rk : por medio de cualquier posible deacr.ptor de archivo heredado E$t*? captulo tr a ta sobre pipes y FIFO s, la? formas md3 a n tig u as de tPC con la quo cu en tan UNIX y los sistem as o p era tivo derivados del mismo. E ste capitulo cubre lo siguientes tam as Pipes sin nombre A pertura y cierre de pipes sin nombro L ectura y escritura en pipos s in nombro U tilizacin de p e p e n y p e l s e Q u son los FIFOs C reador., ap e rtu ra y cierre do FIFOs Lectura y e se n tu ra de FIFOs
La nenioaa ca oescrip<cn ce archivo* forlc*. Dgfc'\a 78.

ow parte de procesos se trata en 'Emploo de

Tbcoa los program as de este capitulo pueden ser encontrados en el sitio Web h t t p : i A W .a c p . e o s n f o bajo e l nm ero de ISBN 0789722151.

P ro g ra m a c i n en L in u x

Pipes
Los pipes (conductos) sim plem ente conectan la salid a de u n proceso con la en trad a de otro. Lo mismo que su contraparte fisica, un pipe de Linux es (habitualm ente} unidireccional o semi dplex; los datos fluyen slo en una direccin E ste capitulo analiza des clases de pipes, los pipes sin nom bre y con nombre, respectivam ente. Los pipen con nom bre se denom inan habitualm ente FIFOs (F irst In First Out, ;o que e n tra primero sale primero), con el mismo significado que en la prctica comercial. Los pipes yin nombre care cen del mismo porque nunca necesitan una ru ta de acceso, y por lo tan to nunca existen en el filesystem. Hablando con precinirin, todo lo que son con siste en dos descriptores de archivo asociados con un inodo en mem oria El ltim o proceso que cierra uno de estos descriptores de archivo hace que el inode, y por lo tonto ni pipe, desaparezcan, Los pipes con nombro, por el con trario, cuentan con u n a ru ta de acceso y existen en ol filesystem. Son deno m inados porque loa datos se leen de los mism os en el mismo orden en que han sido escritos, do modo que ol prim er dato que e n tra a un FIFO e3 tam bin el prim er dato que sale del mismo. La figura 15-1 ilu stra las dife rencias y sim ilitudes entre pipes :iin nom bre y FIFOs.
i C4l'to^saN(j I eu -I1 -i:

c*/K.tiaa**a -i ^ n n a m e o p ip e ) i *- ut -m

P&OCESS i

PIP6F:FO

Ctt-ttpdSSwd > /tmp/rpylHo t

' pjW ytJ'O

eul !! 'a: <

S o ji il -o: < .tro-ny'o i $ oaV'saasr.d >.'K ra'rr.y.fc

F ig u re 15.1. Los pipes y los FIFOs funcionan de manera sim ilar pero er.en diferente semntica. La m itad superior de !a figura 15-1 ilu stra la ejecucin ce la pipeline de- in te riaz c a t / e t c / p a s s w d | c u t -f1 - d : . La m itad inferior de ia mism a m uestra cmo seria ejecutada la pipeline de la parte superior de la m ism a ai se em pleara u n pipe con nombre en lu g ar de uno sin nombre. Las lneas v e r ticales de guiones rep resen tan el punto en ei cual los datos son escritos o le dos de un pipe. Las flechas de doble cabeza m u estran cmo se corresponden entre s la en trad a y la salida de los dos tipos de pipes. Todos los detalles se

Captulo 1 5 : Pipes y FiFO s

323

rn explicados en las secciones subsiguientes. de modo que, posiblem ente, re grese a e sta g u ra medida c u s avance por ei captulo. En la parte superior de '.3 m ism a, la salid a del comando c a t e s tran sm itid a a travs de un pipe sir. nombre creado en el kemeL La salida del mismo se convierte en 1a e n tr a d a de Cut E ste constituye un empleo tpico de las pipelines de interfaz. En particular, ntese que la utilizacin d e pipes sin nombre requiere que e! o r den de os comandos c a t y c u t sea invertido. Por razones que sern explicadas m as adelante, ei comando c u t debe se r ejecutado primero (y corrido en segun do plano) para que uno puedo, en el mismo term inal o desde a misma consola, em itir ei comando c a t que provee su en tra d a de datos al pipe con nombre. El pjpe con nombre, /tr .p /m y f i f o , y al pipe 3n nombro cumplen ol mismo propsito, a lim en tar su salida con los dato s que m b a r, a au en trad a. Todo lo quo realm ente d i e re cuando -e tra b a ja con pipes con nombre es ei orden on el cual son ejecutados los comandos y la utilizacin de los operadores de redireccia de la interfaz. > y <. en el caso de lo pipos sin nombro. NOTA
lo s R F O * am ar, so r m ctfo <u' fund** rck? t f o

La m ayora de los usuario de Linux se h allan fam iliarizados con los pipes sin nombre, aunque ta l v no ae lloguen a d a r cuenta. Cada comando cuya sintaxis sea sim ilar a 1a siguiente em plea pipes sin nombre:
* C tt * tc /p $ w r3 ; cut f t -3 : i O r :

En este ejemplo, la jalid a del comando c a t so convierte en la e n tra d a del co mando Cut. cuya salid a a .su vez se convierte cu e n tra d a para s o r t . Tal co mo es sabido, el carcter es el smbolo de! pipe. Lo que tal vez el iector no se haya dado cuenta es quo su interfaz probablem ente im plem ento | u tili zando la funcin p ip e que conocer enseguida. De todos modos, resu lta cla ro que nunca hay un archivo real en disco asociado con | . P R E C A U C I N
bn consejo ai aaso soora lemuncfog^: A mer-os Que se ceou dejar ien en aro ia aire re s . ?oe e* es: caetJo se refiere s-o a to-s o-ce* n nonxxe, y F1FO se aplica nlcam era a os p oes cc'i 'ornare. ranto es aioes como los FIFOs. sin amoargo. son sem duor*: : sea. es stes fuyen silo en una arecan. :o mismo que el agua en una co^-r'.j aesage. ranto es aces ccmc fes ^lFOs son non_3eekale, es decir, no ir sescepticies ce sa' marimrfadcs internamente: es tieci/, uno no pueae ur.iaar uncc^-es laies cohxj .<<ek para 'iC<ar carca o sesee un puntara ce archivo.

Los pipes sin nombre tienen dos lim itaciones Prim ero, tai como se observ, son slo sem : dplex, por !o que ios d ato s pueden recorrerlos en u n a sula d i reccin a !a vez. Segundo, y m s im p o rtan te, los pipes pueden ser utilizados nicam ente en tra procesos relacionados e n tre s, aquellos que tienen un a n cestro comn. Tal como el lector reco rd ar del captulo 4. Procc-sos", los pro cesos hijo creados m ediante un f o r k o u n e x e c h ered an los descriptores de archivos p resen tes en su proceso padre. La figura 15-2 m u e stra cmo luyen ios datos por u n pipe.

>

d24

hfogramactn en Unux

j .

y .

>

9 l---------------------------------------------------------- sao --------- 1** P|PE { -------- F ig u ra 15.2. Los pipes sin nombre son semi dplex y pueden ser accedidos slo p o r procesos relacionados. Tal como lo m u estra la figura, los d ato s son escritos (por u n proceso) a un extrem o de] pipe y ledos (por otro proceso) desde el otro extrem o dei mLsmo.
A p e r tu r a y c ie rre d e p ip e s

N aturalm ente, antes de que 3 pueda u tilizar un pipe p ara ser ledo o escri to. ste debe existir. La funcin requerida p ara crear uno es precisam ente p ip e Su prototipo est declarado en < u n i s t d . n> de la siguiente m anera int sipe(yit arralej* Jcrip to rt5 j2 )); Si la funcin D ipe tiene xito, abre dos descriptores de archivo y alm acena 3 us valores en el m iniarreglo de tipo in t a r r e g l o _ d e s c r x p t o r e s . El p ri m er descriptor alm acenado en el mismo. a r r e g l o _ d e s c r i p t o r e s f 0 ], es utilizado pura lectura, por lo que pipe lo ubre em pleando el indicador de slo lectura 0_RD0NIY El segundo descriptor de archivo, a r r e g l o d e s c r i p t o rss [1 j, se utiliza para las operaciones de escrituro, de modo que pipe lo abre utilizando ol indicador do slo e sc ritu ra 0 _V/RONLY de open. p ip e re to m a 0 s: tiene xito o -1 si ocurre alg n error, en cuyo caso oata funcin asigna tam bin un valor adecuado a la variable global de erro r e r r n o . la in*/ixi3 -Jo las llAmjas i ststomu opon y dosn est cwoiorta en 'Acorara y cierre ce ve?.-vos*, pgina 140. Las posibles condiciones de error son EMFILE, que .significa que el proceso que efectu la llam ada tiene ya dem asiados descriptores de archivo abiertos, EFAULT, que significa que el arreglo a r r e g l o _ d o s c r i p t o r e s era invlido, o ENFILE, que tiene lugar cuando la tabla de archivos del k em el est llena. Repetimos, debe ser enfatizado que los descriptores de archivo no correspon den a un archivo de disco, slo lo son a un nodo que reside en el kem el. La figura 15-3 ilu stra esta cuestin.

F ig u r a 15.3. Un pipe de U n u x existe slo en el kem el.

Para cerrar u n pipe 3e deben c errar sus descriptores do archivo asociados m ediante una llam ada a sistem a c i s e .

>

'

) 325

Y )

Capitule 15: Pipes y FIFOs

\ /

E je m p lo

-*

1/
E JE M P LO

E l siguiente ejemplo abre y cierra u n pipe:


v^ac-j c ro g ru a =- Interna? ptopn.c V og<

r
* t fir_ o ic a .c y =ir,-3 ^

/ tircluOe <oristd.rs>
incluce <st2 ic.ft> m c iirie < s ttl 0 .&* int M in | i}>

(
in t rr# gIa_4*scrlptor*a{2l:

?((pp*Urr*flio_<SC'iO?orM)) < 3) {
parfor(*plpa*)
il*(EX:r_FAL!Jft);

>
C .o a ic n e to ra a jon va, arrgIo_eac'> ptore)( 1 1 );
c io jt( * r r e g io _ a a * c r io tc r i[ t|) ; :io j ( rfa g lo _ d a * c p ip to ra n ||;

p r a g lo ^ a c rp to r a a l ! ,

W(OtlT_SUCCeSS>;

> La salid a de este program a m u e stra que Ir llam ad a a p ip e tuvo xito ios valorea de los descriptores pueden s er d iferentes en su sistem a) El p rogra m a ilam a a la fu n d n pipe, tran sfirin d o le el arreglo de descriptores do a r chivo a r r e g i o j S e s c n p t o r s s Si la llam ad a a p ip e tiene xito, el p rogra m a im prim e los valores en teres de loa descriptores de archivo, cierra amboa y term ina. S .li tr ir j u s e -3* C flflto m m J, 8
L e c tu ra y e s c r itu r a d e p ip e s
S A C IO *

P ara leer y escribir pipes, sim plem ente utilice las llam adas re a d y w r i t e . R ecuerde, read lee desde e! extrem o del pipe cuyo descriptor es a r r e g l o _ a e s c r i p t o r e s [ 0 ] y r i t e escribe al extrem o cuyo descriptor es a r r e g i o _ a e s c r i p t o r e s { 1]
Para te n e r un r.Spido recoccatoc ce as la/nacas a sistema read y v rite , refrase a ta 3 * Lectura y escritura ce a r v .cs \ ofig^a l-i2 .

326

Programacin en Unux

En realidad, no tiene demasiado propsito para u n proceso a b n r un pipe para uso propio Los pipes 3e utilizan p a ra intercam biar datos con otro proceso. Como un proceso ya tiene en vigencia el acceso a los datos que com partira por medio de u n pipe, no tiene sentido com partir dichos datos consigo mismo. N orm alm ente. un proceso llam a a pipe y despus llam a a brk para engen d ra r un proceso hijo. Como el proceso hijo hereda todo descriptor de archivo que m antuviera abierto su padre, queda establecido e n tre ambos procesos un canal de comunicacin IPC. Cuando un proceso est leyendo debe m antener cerrado el extrem o do escritura del pipe, y recprocam ente. El paso siguiente depender entonce de cul sea el proceso quo realice la lectura y cul el que efecte la escritura del pipe La regla general ob quo los respectivos cierren sean cruzados, es decir que el proceso que lee m antenga cerrado el extremo de escritura del pipe m ientras dure su lectura y el proceso que escribe cierre ol correspondiente extrem o de lectura m ientras procedo a escribir sus datos. Los siguientes comentarios hacen este proceso m s evidente: Si ol proceso pudre ost enviando dato s a tu hyo. ol padre cierra a r r e g l o _ d e s c r t p t o r e s ( 0 | y escribe a a r r e g l o _ d e s c r i o t o r e s ( 1 ]. m ientras que el hijo cierra a r r e g l o _ d e s c r l p t o r e $ [ 1 J y lee de a r r e g lo _ < i e s c r i .p to r e s ( 0 J . Si el proci-MO hijo s el que enva suo dato s o proceso padre, el hijo cie rra a r r 0 g l o _ d e s c r i p t o r e s ( 0 ) y escribe u a r r e g i o _ d e s c r i p t o r e s ( l | , m ien tras quo ol padre cierra a r r e g l o _ d e s c r p t o r e s ( 1 ] y lee de a r r a g l o _ d e s c r i c t o r o s ( 0 | La figura 15-4 le deberla servir al lector p a ra visualizar el procedimiento adecuado y recordar la regla.
PRECAUCIN Cualquier -manto 3o cr y escribir en smra extremos de un nico cipe COnstfluye un sano er-ct d ^o^ra-'acn. Si CCS procesos necesitan a ?unc*onalicaa (le un pipe ful! dplex. o arcceso paore tew proceder a abrir aos >cs en u;gar de uno antes de i-atiar a forK.

F ig u re 15.4. Luego de efectuar una llam ada a fork, u n proceso deber sola m ente leer o escribir, no am bas cosas a la uez. La porcin superior de la figura 15-4 m u estra la disposicin de ambos des criptores inm ediatam ente despus del fork: tan to el proceso padre como su hijo tienen ambos descriptores de archivo abiertos. E sta figura presupone

Capitule 15: Pipes y FiFOs

327

que el proceso padre ser ei que escriba y su hijo el que lea La m itad inferior de la figura ilu stra el estado de los descriptores de archivo despus que el p rx e s o p ad re cierra el descriptor que conespor.de al extremo de lectura del p;pe y su hijo cierra el correspondiente descriptor del extremo de escritura. P R E C A U C I N
Despees oua naya id o o**rado el etre^o ae escritura ae un piM. cuatouier intento de -ce' Ce ese ooe retomara 3 tara :-dcar ? fin del ar;hr<o. Sin enoergo. s es el exVe- c 3 o x a e m "a s*5o serpeo. cuaicver intento <3 o esenoir al oipe <?norard la se^a so/a d proceso que :o nters# nacer, y la oropta Harraca a w r i t e retor nara - 1 y estaofecerft a .afla&a ^50a> armo a E P PE. & el proceso que asta escrio-w-do no ntiKcatKa o rc*a a SXG*!fc. el onsceso de escritura terminar.1 . *>V3 soasar soore <a maneja da .marcaotar o pasar por alto las lalas, ver IntnrcooctAn de sertas*, pig ^a 102.

E je m p lo

El siguiente program a. a b r :r p x p e _ n . m u estra el procedimiento correcto de ap e rtu ra de un pipe entre procesos relacionados. / waec.-t 04i ofoorwrj en Internet: pspen / /*
i*ur_pip c - .a taer correcta de D r ir un pspe

y % * rd ra r Pra<o lu jo . S tn ta m : u a r jn e ionore de arcnivo */ i v i j i wuita.n*


llo c lu M *aroio.n mciude s te lio .n

laclse cfcnt.h ir-cU-e <Uatt.n> ce^vne TAjuQ_ayf


vcus i i ; : r _ i : _ * r r c - ( c r i ' *era]e). r a t M in (m t ar$c, car irg v ;;)

C
ipz irrg:o _d*cri3tcresl<|, arenivo asrs ei- 3ipe /

/ Arreglo oe descriptores de Descriptor oel archiva que sw iinistra los / t'a r.s a irir por e i pise ei

n t dascriptOfArcAlvcOsras; catcs c.-e 253ea / 5-ocso 553.-e i u m jo |el

arcriva cue va cono argumento ee

l* lift*a ce ejaarvsosi * dar


i n r 3 1 3 , syres_ieicos; Craacion oel pioe -* oipe 2 " f : : o j 5 s : r : : : ; r 3 aii.-_i._a rrcr: pipa* I ;

< :

328

Programacin en Unux

/ ' Sfectuar jn

i f p i d = ?or<(}) < l f pid 0) {

fr< y cerrar ios descriptores adecuados t Z)

s a iir _ s i_ s r r o r ( 'f o r k *} / 61 prccaso n i jo lae del oip o, 35- que c ie r r a o l descric-to1 " Se l axtrero 2a e s c ritu ra '/ cV3-l(arreglo_descriDtor9s| 11J; # tU lldyte3_lei30S = re a d a rre g lo d s c rip to re s i3 ), Puf, T w v ic 5UP1| >

*>
writi(8TOOUT/lLENO, &uf. bytas.le ldo s};
;lo s e < a rr g io je s c ri.p to re s (< S ! \

} alse {
E i p r x s s u aatre e s c r ib a l pipe, 3St quo c ie r r a e i flescrxator del extnwto de le c tu ra / d o s e ( arreg lo _ d 9 scrip tcre s[a |);
if{(d 9 8 c rip to r* rc n iv o 0 a to D o p n n {a r g v ( tJ, OJIOONLY)} < O { p e rro r| opun ) ;
o ioe algo p -e d e rn jn a d o */

/ No se cuodo a t ir ir e l a rc h iv o de d a to s ' !

r i .t e i a r r g l o _ d * 3 c r t B o r e $ { l ] ,

, l23\n , 4 );

r Al

nenas e n v ja r pjr e l

} is | > )

I Todo anduvo ox en /
r c a c id o s c r ip t o r A r c n iv o D a to * . b u f . ' w i 3UF||

* i:* ((B y t !.l ie o s

w r l t * ( a r -# g l a _ d e s c r i p :o r 3 | t | l b f , b y t _ lm d 0 5 1 ;

clc s o id M c rip to rA rc n iv o O a to s } ;

>
/ Cono i proceao padre ya t a m in o do r n u r a l p ic o . V

! procede a c e r r a r e l d e n c r ip t o r d o l e x c re to d t e i c r l t u r a /
c lo a o (a r r e g lo _ 0 0 8 c n p t o r n s ( 1 J } ;

/ O btener La co n d icin de s a lid a d e l p roceso r u jo / w a it p id ip ia , n u i l , t)| ex i t (XlT_3UCCESS) ; /od s a u r _ i i _ e r r a r { c n a r *.ensa|e)

(
p e r r o r in e n s a ia ) ;

e * it( X :T_ ? A lL ^ E );

u s a r_ D pe espera en !a lnea de comandos ol nombre del archivo que con tiene loa datos. Si la linea do comandos no contuviera ningn argum ento, u s a r _ p ip e , que es proceso padre, enviara a su hijo la cadena pred eterm i nada l'23\n. U na corrida de prueba que utiliz el program a anterior. a o n r _ p i p e , como archivo de datos, produjo la siguiente salida truncada por razones de espacio):

'

>

'

) 329

C aptulo 1 5 : P ip e s y FIFOs

5 !

isn rj3 ia .c

* b i r _ p i 5 e - o r * y c ie r r a ur. c ic o
S A LIO *

tn c ljC 4 a r i s t a . r i>

#xncXac < *5 c.r> *m cLnt Como es dable ver a p a rtir de la correspondiente alida, a 6 i* irn ip e _ rv / se comporta do m anera sim ilar al comando c a t . excepto que utiliza un pipe en lugar de rem itirse sim plem ente a m o stra r los dato s que recibe en s t d o u t . D espus del f Ork, el proceso hijo c ie rra el extrem o de e sc ritu ra del pipe cu ro descriptor hered, porque el proceso hijo es el que ge encarga de leer del pipe A nlogam ente, el proceso padre e3 el que escribe al pipe, de modo quo e3 el que cierra ei descriptor del extrem o de lectura del pipe. En lugar de disponer la term inacin del program a si no pudiese a b rir su a r chivo de en tra d a do daUw (a r g v ( 1 ]), el proceso padre proceder en cambio a enviar a su hijo por el pipe la cadena pred eterm in ad a 123 \n . C uando ol pro ceso padre term in a do en v iar datos a s u hijo a travs del pipe, cierra ol des criptor del extrem o de escritura y se a p re s ta a term in ar C uando el proceso hijo constata que no hay m s dato s <^ue leer desde el pipe (lee 0 bytes), cierra <1 descriptor del extrem o de lectura y tam bin term ina Finalm ente, aunque no resu lta claro si es el proceso padre o au hijo el quo term ina primero, ol proceso padre llam a a # a l r p i d p ara o btener la condicin de salida dol pro ceso hijo y prevenir as 1 creacin de un proceso zombio o hurfano.
NOTA
S vino* proceso t a n eac'.e.erYjo al mismo o-pe. cada llanada o vnte doho oscfibtr menos d ?IPS_6UF bytes, que es un macro fin id o en < 1 On to osoKurar 5 9 * f ic w 3e sc/ir-* (jo* sear atmtaw; o* deor. q^a os datos ocntos pee un proceso r% o M entremedien con 0 1 to s oe otro proceso Para hacer do esto una reia. esenrurw Y.&rncn. limite .a cerccod de datos asentas en cada llamada Arr.e a meros jue ?!P_BUF oytea.

U n a m a n e ra m 9 s im p le

El program a u s a r _ p ip e tuvo que realizar mucho trabajo tan solo para lograr replicar ia accin del comando C at sobro un archivo: debi crear un pipe, efec tu a r u n f o r k , c errar descriptores innecesarios canto en el proceso padre como en su hijo, abrir un archivo de datoa, escribir y leer dei pipe, c errar loa arch i vos y descriptores abiertos y luego o btener la condicin de salida del proceso hijo E sta secuencia de acciones es ta n comn que el ANSI/ISO C las incluy en dos funciones de biblioteca estndar, popen y pe lo s e , cuyo prototipo en < s t d i o . n> es el siguiente: flL 5C0*rf:njt cnar *caw>nd, corst era r nacen L-n pelse(FXl * $ trt ); popen crea un pipe y luego u tiliza u n f o r k p ara g en erar un proceso hijo, se guido por un e x e c que llama a O in / s n c p ara que el mismo ejecute la ca-

330

Programacin en Linux

d en a presente en la linea de comandos tran sfe rid a al argum ento comm and. El argum ento mace puede 3r r o w, que tienen la m ism a sem ntica que la que poseen en la biblioteca e stn d ar de E/S. E s decir, 3i mode es r. se proce de a ab rir p ara lectura la secuencia de caracteres {scream) se alad a por el puntero de tipo FILE que reto rn a popen (o sea, ei pipe: no olvidemos que la funcin fopenO de C reto m a ur. puntero de tipo FILE y no un descriptor de archivo, tal como lo hace su respectiva co n trap arte, la llam ada a sistem a o pen ( ) de Linux). !o que significa que dicha secutmcia queda agregada a la salida e stn d a r de command, tal como si se redirigiera la m ism a desdo la li nea de comandos; leer do dicha secuencia es lo mismo que leer la salida e s t n d a r de coinmand. De m anera sim ilar, si modo ea w, la correspondiente se cuencia de caracteres queda agregada a la e n tra d a e stn d ar de command, de modo quo escribir a esa secuencia de caracteres (nuevam ente el pipe) equi vale a escribir a la e n tra d a e st n d a r do command. Si ln Llamada a popen fracasa, la mism a reto m a NULL. I-a condicin de error quo ocasion lu fallo de la llam ada es entonces a sen tad a en la variable de erro r e r r n o . P a ra cerrar la secuencia do caracteres ae dobc utilizar p e l s e en lugar de la funcin e stn d a r de C f c i s e . La (uncin p e lo s o cierra la secuencia de caracteres de E/S. ag u ard a a que se completo command y reto m a su corres pondiente condicin de salid a al proceso que la llam. Si la llam ada a pelse fracasa, la mism a retorna 1,
>i / E je m p lo

] ,'B f
ei l Mf LO

El siguiente program a es una versin a ltern ativ a fie u s a r _ p ip e que utiliza popen > p e l s e :
. NOKOrt aei prograna <tn Internet: nw r#.C /

/
nuevojJ3ar_pipo.c l.a nanera corrttCta ae a b rir un pipe y engendrar Ln prccoic l i j o Sintaxis: nuevo_uaar_pipo r.Mitre ce arcnivo

l
n e l u d e < o < u a ta.n > * in c lu a e < s td io .f i> f in c l u d e < 5 ta ;iB .n >

<inclusa <fcatl.it> *uicluo n m t s . r


a fin e r w w s o j F
p i p e _guf

v o ia s e :ir _ s i_ ( !i* r o r ( c h a r n e n s a 'B ) ;

m t sain(void)

(
PILE *p u n te rs _ 5 rc n iv c ; s tr e a se t ip o F l i p a n

cooer / ccar *caaen=_Li,iea_co;inaos - "cat at>rirj>ipa.c* char oufTAMA.O.S'jF); /* 9uffer para *entrao* oe patos \ /* Creacin e sl oip V
i (puntero_arcr.lvc = jcn (cad en3 _liw a_ciand os. . ) ) = W U)

aiir_si_errorj*30cei*);

Caoitulo 15: Pipes y FIFOs

331

'

'. i

s a l i d a a s :a c e > - 3 _ u n s 3 ^ c c a a r.c < 5 j /

* iilt{ (f g ts f f e if t

puntaro_.arcni.vc j) :=

v a l

srwtf*H$:, ocfj;
y 5 C t e - - - i c v a z i c n oe s a i l f l a /

0Cl0*(Dvr:rc_aixMYo); e*lt{El-.5WXSS:; #o:C S*lir_*t_rrcr(cftar ( ptrrr<*c>'ui>;


slt{G ttT _ftU U *);

) Como se puede observar en el listado. p o p e n y p e l s e logran que irubajur con pipe? req u iera mucho menos cdigo La contrapartida e i tenor que r1 nu n ciar a cierta capacidad de control. P o r ejemplo, el lector so ve loriado a utilizar la biblioteca de secuencias de caracteres de C en reemplazo de las llam adas de E/S de bajo nivel r e a d y w r i t e de Linux. Adems, popen obliga si program a a realizar un e x e c , que ta l vez ur.o no doaoe o no necesite. Fi nalm ente. la funcin que utiliza p e l s e p ara obtener el estado de salida del proceso hijo puede no acom odarle a los requerim ientos de au programa. De jando de lado e sta prdida de flexibilidad, pop en perm ite ahorrar entro 10 y 15 lineas de cdigo, y el cdigo em pleado p ara ad m in istrar la lectura y la es critu ra de ios datos es asimismo mucho m s sencillo que el empleado ante riorm ente en a b r i r _ p i p e La salida, p a rte de la cual se m uestra a conti nuacin, perm anece invariable. La sem ntica em pleada con mode puede parecer algo ex tra a, asi que conviene recordar que r significa quo uno lee de SC dout y r significa que uno es e n be a 3 t d i n S /ftu*vc_u**r_pix /*
s ip o o r .:
SALIDA */

Oe ' w

e le r* a a is*

incioM unisra.r *VVIvOt <StC10.,*l>


u n c i d a < s ? c l i3 .n >

FIFOs
Tdl como -*i ement anteriorm ente. los FIFO s se denom inan rambiu pipes con nom bre porque equivalen a archivos, es decir, tienen presencia n el lesystem . L o; FIFOs son especialm ente tiles, porque perm iten el intercam bio de dato s enere procesos no relacionados e n tra s.

332

Programacin en Unux

Q u e s un F1FO

Un sencillo ejemplo que em plea comandos de interfaz podr ayudarlo a com prender loa FIFOs. E l comando mkf i f 0 (1 ) tiene por funcin crc3r FIFOs: sk-fc [oocionl raabra^fifo ( . . . | Esto comando crea un FIFO denom inado n o m b re_ f i f o. 1 parm etro op Cion es generalm ente -m .Tiodo, donde modo indica el modo (ec dgitos oca les) del FIFO que se procede a crear, sujeto a modificaciones por p arte de la umask. Despus de h ab er sido creado el FIFO , uno puede utilizarlo como si fuera parte de una pipeline (secuencia de pipes) norm al. > i
s )
EJEMPLO

E je m p lo

El ejenpio que viene a continuacin enva la salida de n u e v o _ u s a r _ p ip e o travs de un FIFO im ag inativam ente denom inado f i f o l quo, a su vez. en va su salida hacia el comando c u t. Primero se croa el FIFO utilizando el siguiente comando: S ixfifo < * 3M ftfol Luego 3o ejecutan loa do.s comandos siguientes: i cat < fiffll cut .01-5 < J S ./ftuvo_uiarj)ipo > ffol A continuacin se sum inistra la sai id n do estos comandos de interfaz: <

01

I SALIDA
mcl

Une!
in c l

un n l it

9er
Ej u

\
'p r i

clos

)
Captulo 15: Pipes y Fli-Os 3

clos
* * It

} Ei comando c a t . ccrr.er.do en secundo piaao, lee s u enerada desde el FLFO f i~ o * . La e n tra d a de c a t es la salid a del comando c u t , que recorta todo excepto los p rim e r cinco c aracteres de cada lnea de su en trad a. La enera da de cu*. Analm ente, es la salid a del program a n u e v o _ u s a r _ p ip e . La salid a n a i de estes comandos d e interfaz es el cdigo truncado y de a s pecto extrao que com pleta el listado. Si f i f o l hubiese sido un archivo n o r m al. el resultado h ab ra sido que el mismo fuera rellenado con la salid a de n u e v o _ u s a r _ p ip e . C O N S E JO
.3 39' c o ira r o 13 cor.flrr.arfa < n e u k f i f c :re<J a ' FI?0 solicitado. Este jarocrfa con u n a p ocf an el cam oo corrisaporMiente a (loo de dispositivo &> -ncOo de a re n co y t a a M n . oebxjo a la a e c n del sw tcn -P . acareccrfa con un carcter i SgTtgSCO a r e n e n

C r e a c i n d e u n F IF O

La funcin requerida para crear u n FIFO se denom ina fflkf i f o . Su sintaxis s sim ilar a la de Cpen:
i r t * fifo (c o n tt c.nar *no*w*_a_*ifo, occ_: aocoi;

P ara utilizar e sta funcin se d eb en incluir en el crxligo fuente del program a loa archivos de encabezado < s y s / ty p e s .h > y < s y s / s t a t . h>. m k f fo crea un FIFO denominado n o m b r e _ d e _ fi? o , donde ste debe incluir su ru ta completa de acceso, con los correspondientes perm isos especificados, en notacin octal, en c o te . Como do costum bre, el valor asignado a modo ser luego modificado por la u a a s k d o l proceso. NOTA
L* uoask jfecta a i mayorfa o as funcione que crean arenaos o dircctonos :o r per. rr:os e*ccr,coa- Para octerminar ->cr adelantado cuAlas jaran loa permisos ic un ,v cn*o o rtcrxso iesou*i de nacer aido modificado* por la urnas K cal oroceso. simplerrantt efecto una operacin i Y w a M entre el modo que se desea cstoDlccer con * corroiemento a uno ce; votar de a u.uask *cresaoo en ^rminoa de programacin, esto tenaria el s i e n t e aspecto: mooe.l mcOe - 0666; t o o i -umaak; Por terrot. cada una umask de 022. rroae 4 -urnas* retomar 0644.

Ss tiene rxito, ~k* i f o re to m a 0. En caso contrario, asigna el valor adecuado a la variable de erro r e r r n o y re to rn a 1 al proceso que la llam. Los erro res posibles incluyen EACCESS, EEXIST, ENAMETOOLONG, ENOENT, EN0SP-. ENOTDIfi y EROFS.
Tac a 6-1. *Cgosac em x generados te r* una sta

zcr -as amadas a sisaba*, en pgina 1 . f. : x tos errerss que retoman generalmente las llamadas a sistema.

334

Programacin en Linux

%i /

E je m p lo

j 3 [il'y
EJEMPLO

El siguiente program a crea un FIFO en ei directorio corriente:


vonor nuevon.f3.c orogr.ir .1 or Interna?: n f lf o .c C'*a un FIFO. SifltaxiS: 'tuovoftfo no.7iDr9_f*o

I
trclude <9ys/:yacs.C> tncludo <sy5/stat.h mclude <8rrng.n> nnclud# <soio.n> #uiciud* <stoll3.n> int u in iln t argc, c m r *argv| |)

<
nooe_t nooo 6W ; ;f(a rg c t* 2) { argun*ntn V / i r.ctJKa dL srograua taobion c u n ta :ooo

WtiCMCCO 0 EWP'.EO: nuavo'l'o <noncro_flt*_fli*o> !; XUJEJC:7.FAII.UR);

)
:f ((a k f if o < rg v ( 1 J, todo|) < ) (

S^rrorCnkWo*);
o*it|X[r_FA!LUR);
i*LttEXlT_$UCCESS>

U n p a r de corridas de ejem plo de esto p ro g ram a produjeron Ih .siguiente

woco C vgPLC:
SALIDA

ifo n w n b rs j^ j^ fa

S ./ntMV o ifo f ifo 1 $ /nuevolfo f l'o i

akf'.fo: File *xiS La prim era vez, n u e v o f i f o no fue llam ado correctam ente y por lo tan to ex hibi su m ensaje de error; el program a espera como nico argum ento ade m s de su propio nombre) el nombre del FIFO que 5e desea abrir. La segun da corrida ie provey un nom bre p ara ei FIFO , y n u e v o f i f o procedi a crearlo. Como cuando se realiz la tercera corrida del program a ese FIFO ya exista, la correspondiente llam ada a mkf i f o fracas y se le asign a e r r n c el valor EEXI3T Este valor de e r r n o corresponde a la cadena que im prim i p e r r o r : F i l e e x i s t s (en ingls por tra ta rs e de un m ensaje del sistem a;.

Caoitulo 15: Pipes y FiFOs

335

A p e r t u r a y c ie rr e d e F iF O s

Los procesas de a p ertu ra , cierre, elim inacin, lectura y escritura de PIFOs utilizan as m ism as llam adas a sistem a opan. c i s e . u n lin k . re a d y w r i t e . respectivam ente, que uno ya ha visto, lo cual constituye una de las ven tajas dei enfoque de Linux segn el cual todo es un archivo" Como la aper tu ra y e; a e rr e de FIFO s es idntico a la ap e rtu ra y el cierre de pipea, cal vez le sea provechoso rep asar el program a que abre y cierra un pipe, tintado a n teriorm ente en este captulo con el ttu lo A pertura y cierro de pipen''. Se debe ten e r en m ente algunas sutilezas, sin embargo, cuando se lee o es cribe FIFOs prim ero, ambos extrem os ci un FIFO deben de encontrarse abiertos an tes de que puedan ser utilizados. Segundo, y ms im portante, ts el com portam iento de un FIFO ste h a 3do abiorto utilizando ol indicador 0_'<0N8lC3CK. Recurdese que los indicadores 0_WR0NIY y 0_RD0NLY pue den ser sometidos a u n a operacin de 0 lgico con 0_NON8lCK. Si un FIFO se abre con O_NON0lOCK y 0_RD0NLY, la llam ada retorna inm ediatam ente, pero si es abierto con 0_N0NBIGCK y OjAflONLY pero no tam bin con 0_fl 90NIY. o p en reto m a un error y asigna u e r n o el valor ENXIO Si. por e! contrario, no se especifica 0_NONBlOCK e n tre los indicadores de Open, 0_RDONLY har-A que op?n se bloquee no retorne) h asta que algn otro proceso abra el FIFO p ara escribir. A nlogam ente, 0_WR0NLY se bloqueara h asta que el FIFO sea abierto p ara lectura. Igual que en el caso de los pipes, c sc n b ir a un FIFO que no est abierto pura lectura enva la sedal SIGPIPE al proceso quo est intentando escribir y signa a e r r n o el valor EPIPE. Despus, que el ltim o proceso que haya es crito al FIFO proceda a c errar el mismo, cualquior proceso que uitent* leer del mismo d etectar en su lectura un ca r c ter de term inacin de archivo (EOF). Como fue mencionado con relacin a los pipes, p ara asegurarse que las operaciones de escritu ra sean atm icas cuando hay varios procesos escri biendo a un mismo FIFO. ia cantidad de bytes escrita en cada operacin de e sen tu ra no debe su p e ra r en tam ao e! v alo r PIPE_3UF
L e c tu ra y e s c r itu r a d e F iF O s

Siem pre y cuando se respeten las p a u ta s com entadas al final de la ltnu parte, la lectura y e se n tu ra de FIFOs es sim ilar a la lectura de pipes y de archivos convencionales.
E je m p lo

eje m pio

Este ejempio es u n tanto complicado Un programa. i e e r _ f f o, crea y abre un FEFO p a ra lectura, y exhibe la salida del FIFO en s t d o u t. El otro prograe S C r i o i r _ f i f o , abre el FEFO p ara escritura. R esulta particularmente interesante el proceso de correr en diversas ventanas varias instancias del proceso que e r e a cargo !a escritura y observar la salida de cada una de ellas en la v entana donde corre el program a que realiza la lectura.
c e i :* : c * i3 = =i I r i s - : C re ste 3 - c 'i r s :

i r _ ifo .c

r a resa f e s *

/
in e l O e < s y s / t y p e s .f l >

Programacin en Linux

E je m p lo

El siguiente program a crea u n FIFO en el directorio corriente: l Nonbra - a i o ro gra x a a r In t e r n a : flewfifo.c /


J I M PIO

a uvofifo.c

C-ea

un

PIPO. 3inta*is: nuevo*lo nooir9_fifo

/
*:ciu d <jy*/:yfls.h> nnclude <sysm at.n> nncluC* <qrrno.h tnciud <stoio.n> Uic'-ud# <tcUo.n> tn: namU/it argc. Jia r a.-gv|)

i
nodc.t nodo 6C; iffarge 1 - 2 ) { i iw b ro d*l progrno caablon su cuenta :oio

argun*nto /

put j ( M OQO D UP .SC

nuovo'Ko <nont!r#jJi>_f lfo> 2 ;

# x it(6 X IT _ rA lL U R );

} -f(

lfo<arowC1). *0601 1 < *) (


rro rC n k fifo * } ;

xitiJt:r_PAiLUR); )
ix :t!E X ir_ 3 u C C E S S );

Un p a r de corridas de ejem plo de este p rogram a produjeron la sig u ien te

mwj K aw-bcC: nusvotl/o <noncra^:g_fifa>


sauoa

S ./nuevoUfo Ttro i S /nueve*Lo fi-'ol

tfio: Fila exists La prim era vez. n .u e v c ~ if o no fue llam ado correctam ente y pur lo tan to ex hibi su m ensaje de error; el program a e sp era como nico argum ento {ade m s de su propio nombre) el nom bre del FIFO que se desea abrir. La segun da corrida le provey un nom bre p ara el F IFO , y n u e v o f i* o procedi a crearlo. Como cuando se realiz la tercera corrida del program a c-se F IF O ya existia, la correspondiente llam ada a mkf i f o fracas y se le asign a e r r n o el valo r EEXI3T E ste valor de e r r n o corresponde a la cadena que imprimi p e r r o s : F i l e e x i s t s (on ingls por tra ta rs e do u n m ensaje "del sistem a).

Captulo 15: Pipes / FiFOs

335

A p e r t u r a y c ie rre d e F iF O s

Ltfs procesos de ap ertu ra, cierre, elim inacin, lectura y e sen tu ra de FTFOx u tilizan las m ism as llam adas a sistem a o p en , c i s e , u n li n k , re a d y .vri t e , respectivam ente, que uno ya h a visto, lo cual constituyo una de las ven tajas del enfoque de Lmux segn ei cual 'to d o es un archivo" Como la a p e r tu ra y ei cierre de FIFO s es idntico a la ap ertu ra y el cierre de pipes, ta i vez ie sea provechoso rep a sa r el program a q u e abre y cierra un pipe, listado an teriorm ente en este capitulo con el titulo A pertura y cierro de pipes". Se debe te n e r sn m ente alg u n as sutilezas, sin embargo, cuando se lee o escnbe FIFOs. pnm ero, ambos extrem os d e un FIFO deben de encontrarse abiertos a n te s de que puedan ser utilizados. Segundo, y ms im portante, es el com portam iento de un FIFO r. ste h a sido abierto utilizando el indicador 0_NCNB10CK. Recurdese que loe indicadores 0_WR0NLY y 0_RD0NLY puod*n ser sometidos a u n a operacin de 0 lgico con 0_NONBLOCK. Si un FIFO >e abre con (MIONBIOCK y 0_RDONLY, la llam ada reto rn a inm ediatam ente, pero a abierto con 0_NONBLOCK y 0_WR0NLY pero no tam bin con 0_R DONLY, oper. reto m a un erro r y asigna a o r r n o el valor ENXIO. Si, por e! contrano, no e especifica 0_NON8LOCK e n tre los indicadores de o p e r, 0_RDCNIY h a r que op*n bloquee ino retorne) h a sta que algn otro proceso ab ra ei FIFO p a ra escribir. An!ilngamfnr., 0_>VR0NLV se bloquear h asta que el FIFO sea abiorto p ara lectura Igual que en ol caso do los pipes, escribir a un FIFO que no est abierto pura lectura enva la serial SIQPIPE al proceso que est intentando escribir y asigna a e r r n o ei valor EPIPE D espues que el ltimo proceso que haya os e n to al FIFO proceda a cerrar el mismo, cualquier proceso que intente leor del mismo d etectara en su lectura un c a r c te r de term inacin de archivo (EOF). Como fue mencionado con relacin a los pipes, p ora asegram e que las operaciones de e se n tu ra sean atm icas cuando hay varios procesos escri biendo 3 un mismo FIFO . Ia cantidad d e bytes escrita en cada operacin de escritu ra no debe su p e rar en tam ao e! v alo r PIPE_BUF
L e c tu ra y e s c r itu r a d e F iF O s

Siem pre y cuando se respeten las p a u ta s com entadas al nal de !a ultim a prte id lectura y e se n tu ra de FIFOs es sim ilar a la lectura de pipes y de archivos convencionales.
E je m p lo

E ste ejemplo es un canto complicado. Un programa, l e e r _ f i f o , crea v abre u n FIFO p a ra lectura, v exhibe ia salida dei FIFO en s t d o u t. El otra progra ma. e s c r i c i r ^ - i * c . abre el FIFO para escritura. Resulta particularmente interesante ei proceso de correr en diversas ventanas varias instancias del proceso que nene 2 cargo la escritura y observar la salida de cada una de ellas er. la v en tan a donde corre el program a q u e realiza la lectura. vwors cei progrsas Internet: ' r i f o .: /
r s ie.*_f Te.e
91

Zrt j : a

ira

rsaa rrea :

f i a c l 'J H < SJr3 /ty p . >

>

f'

336

Programacin en Linux

ir.cluse <sysi'sia*.h> lrcluda <rriw.ft> ificl'jae <stdio.h>


incl'jd <sMllD.it>

<irclvfle <fcnU.l> flnelcrf* <llnit3.ft>

int aain(volfl)

<
i r : <Jscrlptor_archivo inc / Descriptor del FIFO / / Nunero de oytes leaos desde e l

:fti /
char bf{PI?_0M FJ;

ma byras;

acdt^! mo *666;
if d f lk f if o C f t f o i* , oc< lo)j < o> {

p rro rC n H lfo ); xlt <GXIr_FA t UJHE) :

> r ^ferir i fifo aara jola lo c iu n /


t#iM serio;or.archiva - aptnf f i r p i * , OJCONiV)) < ei f p*rror<'oo*n*); tiqXIT_FAILUBtJ;

y
al FIFO y xhotr *u salida do o.iios rm ta onco.itrar EOF *ml<l>uB.pym 'ao{ds<n,otor_4rcfnvo1 nuf, >IPE_8UF p r in :f i* lr _ f tro ly o : %s\ buf|; cio(<lscriptcr_arciiivo) ;

.)! 0>

ttlt{CXir_SUOCSS);

r fin ce iw r .f tf o /
,'COMIENZO GE ejcrlblP_fLfO

So*trs csl prograna n Internet, r f i o . c /

/
escrib ir^ifO -C - E ic rio ir 4 un

FIFO bien conoctfo*

I
L-wiud# <sys/tys.n>

iirtcloa# <sys/stat.h> irclwJe <ermo. n>

>

>

>
337;

Captulo 1 5 : P ip e s y F IF O s

#ir*clufls <5tdio.r?>
#ttCluos < E t : i i c . n >

ireluS t < Iifll.


<;ise.fc>

C o T (V C iC )

{
in t ;sc.-:D t3<-_irc.5 .i v c ; is t Itn ; c s * r b u f{P iP E _ 3 u F ]; o e , : *so o - #46; / D e sc rip to r d e l * :F 0 y / tuj^ro ae b y te s -* c ritc 3 1 F [? o *, S a r a m u a r e n t u r a s a t n ic a s *

p u rte ro ^ o ^ ftic );

r Para la liw ada * tie V

6*rlo tr U id e n t i f i c a c i n ce c-ada i/ is t o e ia (son as de unai da a sto

3r:fll5 /
p r '.n r f (*Yo sey w \

* 1 F tfO o ir aolo s c rltu r a /

s * c -:a tc r _ a r o i ) o p # o [ * if o t \ OJWONIY)) < > ji


p4 r r c - ( * 3 ;fn * ) ; *x it< * x iT _ F < u u w 6 );

>
Se*erar datoa cua s* puoaar. esertoir m

f IFO /

n ^ (i) ( I 0 6 :rr la ftor* e r u n t l


: : m (ip u fl: s P o _ ;4 _ r * la j ;

Craar Lt cadena 1 ser c rt * a l FIFO * / r^s_ o y : i = s p r u i t n e u f , n c r M i r _ f i r a Hd onyia Ha- , j a :? ia ( j . rria(i{WjnterQ_ae_P9loi j ) ;

/*
t r t iliia r nu*j>yt*s - l conju* sprincf no incluye
er, c con te a e i c e rc b iA * r c a ae c e m in a c io n

I
i f f( rit9 (te 9 C t D to r _ ir n iv a , a u f, iu a _ 3 y t e s - ' I I < (

s e rro rC w ritr* ):
c i c s e < e s c r i 3 t o r _ .i r c r i v o );

jt it t lxrr_.=A lL'ifiE j ;

>

333

Programacin en Linux

5 l p !3 l, o o ra a c u tiv a s a i FIFO

* in t e r v a lo 3a t r e s segundos e n t-e dos e s c r i t u r a ;

>
c i s e Id 8 s c rip to r_ a rc l> ;v o l ; < it| XlT_SCCES3);

J La salida de estos programas se m uestra en la figura 15-.5. El lector, l e e r _ f f o, corre en !a xterm grande. Las tres xterm s man pequeas corren cada una de ellas una instancia diferente del program a que escribe al FIFO. e s c r i b i r - _ f if o . La P ID d e cadu instancia de e s c n b i r _ f i f c es exhibida en su respec tiva pantalla. Cada L tvs segundos, cada instancia de e s c r i b i r * i f o pone en el nusmo FIFO. f i f o 1. un mensaje que consiste de au respectivo PID y la hora com ente. Como ?e puedo observar, ni program a de lectura. i e e r _ f i f o. exhibe el mensaje recibido y lo precede con la expresin l e e r _ f t f o l e y ; para di* farenciar hu salid a de la entrada tom ada desde el FIFO.

F ig u ra 15.5. Vanos prncenos (varias instancias del m ism o programa; escriban ai m ism o FIFO. Vale la pena observar que estos programas constituyen una forma primitiva, aunque relativam ente intil, de aplicacin cliente!servidor. El servidor es i e e r _ f .f o; el mismo procesa m ensajes enviados al mismo a travs dei FIFO Los clientes son cada una de las instancias de e s c r i b i r _ f i f o, cuyo nico propsito es enviar m en s^es ai servidor. U na aplicacin cliente/servidor m s sofisticada llevara a cabo algn tipo de procesam iento de loa datos que reciba y en v iara algn tipo de datos o notifi cacin de v u elta a sus clientes. La co b ertu ra a fondo de las aplicaciones cliente/servidor se encuentra m uy fuera flel alcance de este libro.

Captulo 15: Pipas y FIFOs

339

Lo que viene
Este capitulo ha cubierto a forma ms sim ple de la comunicacin entre pro cesos: los pipes y FIFOs El prximo captulo contina con la discusin do los mtodos IPC. concentrndose en la m em oria compartida. Aunque su mec nica es m s complicada que ' 3 de los pipes y Los FIFOs, la EPC por memoria com partida es mucho m s potente y flexible y se ia utiliza comnmente er. aplicaciw es m s ex ten sas y sofisticadas, tales como los 3i3emas de adm i nistracin de bases de datos relacinales RD BM S o Relational Datn Base Ms-ia g a n tn S y ittm s ) que ofrecen em presas como Informix y Oracle.

ij

)>

) .)

).

>

>

M a

Memoria compartida
La m em oria com partida es la p rim e ra de eres clases de IPC. o Comunicacin Interproceso>s. que se ap ren d ern en este libro. Les otroa dos tipos de PC son los sem foros y las colas de m ensajes, que ser n el tem a del prximo ca pitulo. E! conjunto que form an esta3 tres d a s e s de IPC 30 denom ina h a b i tualm en te IPC System V. porque tos mism os se originaron con el UNIX Sys tem V, lanzado originalm ente por AT&T. Las im plem cntadones do UNIX derivadas por BSD y otros sistem as operativos del tipo de ITNDC. incluido Linux, tam bin las incluyen. Er ti osp-tuo 17 vjrrsr. jtra una ata motota d 'som.'foros y colas < 1 < i m a n a e s'

E ste capitulo cubre los siguientes temos: Descripcin general del IPC System V Problem as que p resenta el IP C System V Utilizacin de mem oria com partida Todos los program as de este capitulo pueden ser encontradas en * ! sitio Web h ttp :/ u c p .c o m /m f o bajo el nm ero de ISBN 0789722151.

Programacin en Unux

Introduccin al IPC System V


Este es el primero de dos captulos dedicados a an alizar los mecanismos dol IPC System V Esto 3istcma do comunicacin entre procesos casi no se em plea en la* nuevas aplicaciones porque ha sido reem plazado por el IPC POSC. No obstante, el mismo se cubre en este libro porque es probable que el lector se tope coa l en program as de cierta antigedad que fueron escritos antes del advenim iento del estndar IPC POSIX. Los tres tipos de comunicacin entre procesos provistos por el IPC System V tienen bsicam ente la m ism a interfaz y el mismo diseo general. E sta seccin p resenta los conceptos fundam entales del IPC System V y analiza las prestaciones y modalidades de programacin que son comunes a semforos, colas de m e n a je s y memoria com parada Las estructura* IPC (semforos, colas de m ensajes y segm entos compartido* de m em oria) existen on ol kernel, como si fuesen pipes, en lu g ar de estar presentes en el filesystem , como los FIFO s. Las e stru c tu ras IPC son denom i nadas a vecen en conjunto objetos IPC, p a ra ev itn r as la necesidad do tenor quo referirse a ullou como "semforos, colua di* m ensajes y segm entos com partidos de memoria". Por la m ism a razn, la expresin objeto IPC se emplea para referirse ; cada uno de estos tipos de e stru c tu ra en p articular sin necesidad de se r especfico ai respecto. Ln figura 16-1 m u estra cmo se co m unican en tre si dos procesos no relacionados m ediante un objeto IPC

F ig u r a 16 . 1 . Los objetos IPC perm iten que puedan intercam biar datos dos procesos n relacionados entre ai. Como se puede observar en la gura 16-1, los objetos EPC son m antenidos en el kernel (en verdad, en la memoria del kernel), perm itiendo a= que procesos que no se encueraran relacionados entre s (o sea procesos que no tienen un padre -ornn; se comuniquen entre ellos por medio de uno de los mecanismo IPC. es decir, memoria compartida, semforos o colas de mensajes. Los datos fluyen li brem ente en tre los disantos procesos por medio de los mecanismos IPC.

Captulo 15: Memoria compartida

343

Cada objeto es referido y accedido por medio de s u ideniificcdor, un nmero entero que identifica inam biguam er.tc aJ objeto y su tipo. Cada jdenticador es exclusivo p a ra su tipo de objeto, pero el mi3mo identificador puede h allar se en uso p ara una cola de mensajes, un. sem foro y un segmento de memo ria com partida. Es decir, podra h ab er sim u ltn eam en te en uso tres ider.tificadores del mismo valor numrico que se refieran a tres objetes IPC distintos El identiScador se convierte a s en un descriptor o hondU para to das las operaciones que se realicen sobre la estructura. NOTA
tos oert-'-cac^w est''.ctv*s d IPC "o ser valores pecuertos. mores y posiUKW. qwe se o n e c e n gol> a t yreuV'tar * a manera en que se lo hace con 10 $descriptoras cto archwos. 0 necro. 3 re !as estructuras Van siendo creadas y elimi'- u <r: cferoMOo fo.-malrr*jnfe deoc<nir.3Co nnwo secuenciai tt u M <Je va alimentando "asta ciat ur valor mximo. en i cual vuu-'vo a 0 y reccn-. erra ia secuencia ~orr*oca. Q valor mximo depefld* dol na tw a operativo y dol ntrs+ w O la se *s:4n uv .rando En Lnu os icontlflcadoros je declaran como enteo vn i*gPO de tipo n t . de rodo o.c el mximo vator cosic paro 'tos en 65. 535.

Cada estructura IPC es creada por modio de una Juncin que termina en {jet: s e n g e t p ara o a semforos. n s g g e t para las colusdu mensaje y sh ig et para la m em ona compartida. Cada ves que * .* croa un objeto por rnedio de las funcio nes *QQt. el procedo que efecta la Ilumutla debe especificar una clave de tipo k e y _ t (declarada en < s y s / t y p e s . h>>, q u e el korael utiliza para generar el identificador. El cemel de Linux 2.2.jc define k e y _ t como un valor de tipo in t. Despus que una e stru c tu ra IPC haya ido creada, loa llamada* uhuiguientes a una funcin * g e t que utilicen la m ism a clave no crean una niiev es tru ctu ra sino que m eram ente reto rn an e l identificador asociadu con una es tru ctu ra ex istente Por lo tanto, dos o m s procesos que deseen establecer un canal IPC pueden llam ar a una funcin * g e t con la misma clavo. La cuestin es. por lo tanto, cmo g aran U a r que todos os prucesos que de seen em plear una instancia d istin ta de la m ism a estructura IPC putdan uti l i z a r la m ism a clave E n uno de los mtodos, el proceso que inicialmente de se a cre a r u n a nueva instancia de esa e stru c tu ra le transfiere a la fundn ' g e t u n a clave IPC_PRIVATE, la cual g a ra n tiz a se crear una nueva ins tancia de la m ism a. El proceso creador d e esa instancia de la estructura IPC alm acena entonces ei identicador reto rn ad o por la fundn *get en el lesystem . donde otros procesos puedan accedera. Cuando un proceso efecta u n * o rk p ara g en erar un proceso hijo o un exec p ara cargar determinado procesa, el proceso padre le transfiere a 311 proceso hijo el idenc^cador retor nado por g e t como uno de ios argum entos de la funcin exec que carga el nuevo proceso en m em ona. E n el caso d ei uso de f o rk . dicha transferencia de atrib u tes desde el proceso p ad re a s u hijo es automtica. Otro mtodo alm acena una clave e st n d a r en un archivo ce encabezado co m n a todos .os program as, de modo que iodos los programas que incluyen di'h o archivo de encabezado tendrn acceso a ia misma clave. Un problema que se presenta ccr. ~~j =enfoque es que n in g n proceso puede saber si est crean do nueva estru ctu ra o sim plem ente accediendo una que ya ha sido creada

344

Programacin en Linux

por proceso. Otro problema es que la clave puede encontrarse ya en uso por un programa no relacionado. Como resultado, el proceso que utilice esta clave debe incluir el cdigo necesario p ara a d m in istrar dicha posibilidad. Un tercer mtodo requiere el empleo de la funcin f to k , que adm ite u n a ru ta de acceso y un carcter nico cuyo tipo es obviam ente c h a r . denom inado identificador de proyecto, y re to m a u n a clave, que luego es tran sfe rid a a la funcin * g e t adecuada. Es responsabilidad del program ador aseg u rarse de que tam o la ru ta de acceso como el identificador de proyecto sean conocidos por adelantado por todos los procesos. E l lector puedo lograr esto utilizando uno de los mtodos mencionados antos: incluir la ruca de acceso y el identifi cador de proyecto en un archivo de encabozudo comn a todos los program as o almacenarlos en u n archivo de configuracin predefinido. L am entablem en te. f to k tiene un serio defecto: no g a ra n tiz a que g en erar u n a clave nica, lo que crea los mismos problem as que el segundo enfoque comentado a n te riormente. Debido a los posibles problem as que puede g enerar el empleo de f to k , este captulo no la tom a en cuenta.
PRECAUCIN
Dicto do rrarijra crido, a imoiomentociOn de Unux <Jo o funtn ftofc no funciona b ?n La misma una clave na nica en Ia3 siguientes situaciones. Cuando do*, vnculos s-mOMco* Aferentes vinculan ol mismo orcr-vu Cuando o b primeros
16

bits dol nmoro to inode do la ruta do accoso coinc-ten.

; u u n sistema tiene dos supositivos de .llsco con el mismo r -e ro rv.-oc o cu* icuiTe on i^tomas quo cuonton con mloploo controladoras se disco. El nmero p^ncical rte- dispositivo sera dlfe'enttr. pero el nmero menor d# misma puodo w igual Cada i debodad d< la implomontaclo por parte do Linux do la ftjndn ftok, -e recor enc^cciOansefite t :q$ ro re s considerarla intil c ignorarla.

Adems do unu c la v e , las fundones *<jet tambin aceptan un argum ento in d ic a a o re s que controla el comportamiento de * g et. Si la clave especificada no encuentra ya en uso para el tipo desdado de estructura y el bit IPC_CRAT es t activado en in d ic a d o r e s , ser creada una nueva instancia de la estructura. Cada estructura IPC tiene un modo, un conjunto de permisos que uc compor tan de m anera sim ilar al del modo de un archivo (cuando ae lo transfiere a una llamada a open), excepto que p ara las estru ctu ras IPC no rige el concepto de permisos de ejecucin. Cuando crea una estru ctu ra FPC. uno debe efectuar una operacin 0 bit a bit en el argum ento i n d i c a d o r e s con los permisos es pecficos, utilizando lu notacin octal ta l como fue definida p ara las llam adas a sistema open y c r e a t , o no le resu ltar posible acceder 3 la estru ctu ra recin creada. El lector encontrar ejemplos especficos de esta situacin m s adelan te. Tal como seria de esperar, el [PC System V incluye una funcin p ara modi ficar los permisos de acceso y la propiedad de las estru ctu ras IPC. Para un 'pido recordatorio sobra modos de archives, ver *0 mooo de un archivo*. sagi na 134.

Capculc 16: Memoria compartida

345

Problemas que plantea I IPC System V


El IPC- S ystem V tiene v arias lim itaciones. Prim ero, la interfaz de progra macin es compleja p ara los beneficios que provee. Segando, las e stru c tu ra s IPC son un recurso ms firm em ente restringido en cuanto al nm ero que un istem a perm ite ten e r e r uso al m ism o tiem po que, digam os, el nm ero de archivos abiertos que puede a c e p ta r el mismo o si nm ero de procesos acti vos que ste perm ite. Tercero, a p esar de ser u n recurso coa lm ites, la s e s tru c tu ra s IPC no m antienen un cocieo de refereacia, o sea un recuento del nm ero de prcceso que se e n c u e n tra n utilizando una e stru c tu ra al mismo tiempo- Como resultado de ello, el LPC System V no cu enta con u n a m anera autom tica de recuperar la s e stru c tu ra s IPC abandonadas. Por ejemplo, si u n proceso ere?, u n a estru c tu ra , ingresa datos 3 la m ism a y luego term in a sin eLm inar adecuadam ente ni la e stru ctu ra ni los d ato s que sta contieno, la e stru c tu ra se g u ir all h a3 ta que suceda u n a de las siguien tes cosas: Se re im e e el sistema. S ea deliberadam ente elim in ad a utilizando el comando ip c r.ti( 1) (re moce IPC struciurr). O tto prow so que UCBW con l<W perm isos de acceso requerido? lea hw datos o elim ine ia estru ctu ra, o amba3 cosas a la ver.. E sta limitacin constituye u n im p o rtan te problem a de diseo. Finalm ente laa e stru ctu ras IPC. como so obser/ antes, existen slo en el kernel y no form an parte del file.syatem Como resultado, los operaciones de E/S que involucren la mi.smn r-qmuren apreudor todava o tra interfaz ms de programacin. Ai carecer de descriptores do archivo, uno no puede em plear E/S de tipo m ultiplfx con lu llam ad a a sistem a 3 e l e c t . Si un proceso debe asjuardar por su E/S en u n a e stru c tu ra IPC, debe utilizar algn tipo de lazo de espera m ientras la e stru c tu ra est hiendo em pleada por otro proceso. Un lazo < ; tipo aguardar a e m o ** ur. lazo quo verifica de m an era continua por La modificacin de alguna condicin, esto constituye casi siom pre un mal procedimiento de program acin porque consum e innecesariam ente ciclos de C P l'. El lazo tipo aguardar-acceso re s u lta especialm ente pernicioso 011 Linux, que cuenta con varios m todos de im plem entar esperas de este tipo, tales como bloquear E/S. la llam ad a a sistem a s e i e c t y las seales.
? v s recftijw a E/S er rrsuttctex y la nairaca a sistema s e le c ? , ver *Mj|tio=exng do
E /5 * .
s

169.

Qu es la memoria com partida


La m em oria com partida es u n a regin (segmento) de m em oria d estin ad a por el kernel p a ra el propsito del in tercam bio de informacin e n tre procesos. Siem pre y cuando un proceso cu en te con los perm isos de acceso al segm ento adecuados, el mismo puede acceder a dicho segm ento mapendolo a su pro pio espacio privado de memoria. S i un proceso actualiza los datos p resen tes en el segm ento, dicha actualizacin re su lta inm ediatam ente visible a los de

346

Programacin en Unux

m s procesos. Un segm ento creado por un proceso puede se r ledo o escrito o arabas cosa.^ a la vez, por otros procesos. El nombre, memoria com partida, tran sm ite el hecho de que varios procesos pueden com partir el acceso a di cho segm ento y a la informacin que contieno el mismo. C ada proceso recibe s u propio m apa de la m em oria com partida en su espacio privado de m em oria De hecho, !a m em oria com partida se asem eja conceptu alm en te a los archivos (apeados en m em oria. La memoria com partida se ilu stra en la figura 16-2.
La creacin y ei empico do archivos mapoados en memora se anaDicon on detallo en 'Arctvvos maneados en nemono*. jsflffinn i7d

La figura 16-2 sobreaimplifica de algn m anera el concepto de m em oria com partida porque el COrraapOridinte segm ento puede consistir tanto do datos en In RAM fsica como en Ia pginas de mem oria que se encuentren tem poraria m ente presentes on disco. Lo mismo vale pura el espacio en memoria de los procesos que hacen uso do dicho segm ento di* memoria compartida.

F ig u r a 16.2. Los procesos m apean os segmentos de memoria com partida c su propia espacio d memoria. No obstante, la figura m uestra un segm ento de m em oria compartida (SHM o Shareable Memory) creado en la mem oria principal (mostrado como un rectn gulo sombreado,. Los rectngulos som breados presentes en :os procesos B y C ilustran el hecho de que los dos procesos h an mapeado dicho segmento a su s propios espacios de memoria. La figura m uestra tam bin que cada uno de los cuatro procesos cuenta con su propio esp ad o en m em oria que se m apea a al

Capitula 16: Memoria compartida

347

guna regin de la RAM Ssica. Sin embargo, ei espacio en memoria ci o n pro ceso es privado, es decir, no puede 3er accedido por los dems procesos. N atu ralm en te, dado que la transferencia de datos tiene lugar de m anera es tricta en m em oria (dejando de lado la posibilidad de que una o m s pginas puedan e sta r residiendo tran sito riam en te en el disco), la m em oria com parti da es una m anera rp id a de que dos procesos se puedan comunicar entre 31'. Tieno mucha3 de las ventajas de los archivos (apeados en memoria.

Creacin de un segmento de memoria compartida


La funcin necesaria p ara c re a r un segm ento de memoria com partida es s h a g e t . P a ra u tilizar cualquiera de las fundones vinculadas con la momofia com partida, se debe incluir en o cdigo fuente do un program a los arch i vos de encabezado < s y s /t y p e s .h > , < s y s /i p c .r t> y < sy s/sim .h > . El pro totipo de abm get es ei siguime: ir : r5?<k*y_t *y, flt li, Iflt t la g s in d ica d o ra <pueden ie r uno o tn i s de los siguiontOs: EPC_CRAT, I?_EXCL y un conjunto do bita de perm rso (modos), todos olios sometido ontre si a u n a operacin lgica de C bit n bit. l.os bits de perm iso deben sor es pecificados en notacin octal. IPC_EXCL garantiza que si el segmento ya exiBtiera la llam ad a ra a u u ru . un vez d e reto m u r ei iccntificador de un seg m ento ya asignado. C O N S E JO
0 mxer* para los jmeles oe este cepfttKJ lpresen n ci litio Web do esta libro) >oc.-ye jn r-scrode crecxccesasar. 0 _XO?N_SOUHCc. Este m/scro *e q uie re oorcuo tocos os c m ^stra -eci'jycn < ioc.~n>, auf~noiere cue X0PM_S0LRCE es:* ocf -do. Ctrsamante. cuarto /O cpripii* estos programas en -jra rwtoioon pretele'rrv'nacsa oe ^uc de Sed Hat 5.0 presenta en m sistema, no mo (sita definir el ma s o . oero Si C.VS que d*-n vr el mac*o cua-oo comoi< can OftBflLrui 2.3.

1PC_CREAT indica que s: aun no existe nin g n segmento asociado con Key clave deber ercroado uno nuevo, c l a v e puede ser ya sea IPC_PRIVATE o una ciave reto m ad a por la funcin f t o k . El argum ento StZ9 (fomao) especi fica ri tam ao del segmento, redondeado h a d a arriba al valor de PAG_SI2E, que es el tam an n atu ra! de una pgina p ara un procesador determinado 4k para ios procesadores de Intel actuales, k p ara el Alpha: Si Shmget ciee xito retorna ei dentieador del segm ento y si fracasa retorna -1
E je m p lo

El prximo ejemplo, c re a r_ s g to a e 3 c a m p , crea un segm ento de memoria com partida y exhibe ei identicador que re to rn a S hig et.
*i0Ecr5 :.-;g.-sfl
ir .

: -.te'*=*-*r
:~ a :

n* ->. *
un sefiflnta i s n c r i s coapartita

:~ n r_ izzzziP i:a z. :

'I
~ z-z'..zi s y s f t y s e > .*>

>

> )

348

P ro g ra m a c i n e n U nux

s i- c lu C s s y s 'i s c . r ir c lu d e

<sys/$lm.n>

#in ctude < s :d io .n >

i.'icluaa <5tflliB.h>

W8ine rAiwoj? -*6 int nainfvoHJ) (


in t W e n :if:ca s o rs e g iJ8 n to ; lf| ( 3 s n tif C 3 d c r S 9 g n n ? o shn got( tP C _ P R IW E , TA1WS0_3UF, 0 6 55)) < 0 ' ( p e rro rC sn n g et*); e x i? { e x iT _ ? A iw E ) ;

)
p . - i n t f W e f lt lf ic a d o r d e l 39gr.9flto oreada: % d \n \ if ln t iic a C s r S 3 n to ); 3 y s t n r ip c j -u*); w itIEXIT _5U CC E3S>

i
i . 'c r rjq tD r rtC o n D
W n U 'ic a ta r Sol legtflnto cre ad o : 40833

sau o a

,hn;!j pornl byto* r u ttc h ita tu xO CM O O O i 0705 kur?Jftll 666 4396 1 Tal como ln m uentrn ln salid a de c3te program a. c rea r_ sg to in em co m p croa con xito un segmento rlc m em oria com partida. E! ejemplo u tiliza asim ism o ol comando ipes (estructuras de IPC1 para con firm ar quo ol proceso que efectu ln llam ado hnyn croado ol segm ento de m e moria requerido. La an te ltim a colum na, n a t t c h (num U ro/'n(nchment/s) do la calido do ip e s -m m ~ mapped), indica el nm ero do procesos que liar, adosado ol segm ento {o sea que h a n m apeado dicho segm ento a su propio e s pacio de memoria). Obsrvese quo no hay ningn que haya adosado ol seg mento. Lo nico quo hacc shir.got OS crea r ol segm ento do mem oria com par fcda; les procesos que lo quieran m npear a sus propios espacios de m am ona, o que vimos que se llam a adosarse al segm ento, deben hacerlo de forma ex plcita. utilizando la funcin sn m a t discu tid a on el prximo punto.
*ly

----------snarod M*nory 3ojnta--------- -

Adosamiento a un segm ento de memoria compartida


Un proceso no puede u tilizar un segm ento de memorio com partida h a sta que no adoife ol mismo, o sea, m apee la direccin del mismo a su propio e s pacio de m em or.a. De m an era sim ilar, cuando al proceso haya term inado de usar un segm ento de mem oria com partida, debe q u ita r ei correspondiente mapeo de su espacio de memoria. El udosam ienlo se lleva a cabo m ediante una llam ada a s h m a t, y su cancelacin requiere u n a llam ada a s n m d t. Estas dos ru tin a s tienen los siguientes prototipos:
cria- snnatlint 9nniij, c l^ r snir.adflr. f lags};

Int 3r.Jt{cra.- -snoaori:

'

C as'tJlo 16: Memoria compartida

349

>

>

s n r i d es el idenricador del segm ento que el proceso desea adosar. E n s h - s t . si - - a d d r es 0. el ncleo c a p e a r el segm ento hacia el espacio en m em oria correspondiente ai proceso que efectu a respectiva llam ada, en u n a direccin que elige el kem eL Si s h ~ a d d r no es 0. indica en cambio la direcdn a la cual deber tnapear el k e m e ! ei segm ento de m em oria co m p arti da. O bviam ente, hacer esto es u n a to n te ra , de modo que siom pre asigne a s n r a d d r el valor 0. f l a g s puede s e r SHM_RDONLY. que significa que el seg m ento aera adosado como de slo le ctu ra . La opcin pred eterm in ad a es que el segm ento sea adosado como de le ctu ra-escritu ra. Si la llam ada a s h n a t tiene xito, sta reto rn a u n p u n te ro a la ubicacin del segm ento adosado dentro del e sp a d o de m em an a del proceso. Si fracasa, retorna -1 y a sig n a ol valor adecuado a e r r n o . s n i d t elim ina el vnculo en tre el segm ento que es adosado por shrn ad d r y el esp ad o en m em oria del proceso q u e efectu la llam ada: dicha direccin debe h aber sido previam ente obtenida p o r medio do una llam ada a S hrrget.
E je m p lo s

l. 1 siguier.to ejemplo. 3 ts h m , adosa u n segm ento do mem oria com partida y luego deja sin efecto dicho vinculo / Ko r , i w n t u tn Internet: atr*. V r
*scr_s3t03*flcc30.c - Acosar y lu-jo doaaccolar w s>>B'ntt> ds n*noria c c * c a rt Sir.ta*i$: a<5ciar_*stco<x<Mio ltn ri'leader

I ir<l-jfl <Jy*rtyc*s.f'>
#incluC < s y m ^ :.* > linciuc* < iy i Iina.!\>

in c lu <*ti.f irclvtf italtD.h>


t M in (lt t a -c , d u r M r r I I I

i r \ ic e r t ific a d s r S e s M flT o ; c n a r *5u f s g r w e c c ip ; - l p rc ca a c *7

/ I d e n t ific a d o r d e l %oiemo / / P u n tara i d ir e c c i n sn . p a c i de n m <oriJ

/ 3<

en la linea de scoanccs naya presente un usentificttdcr de

iS*ento ! if(ar5< i= 2) {
p u tj('C 0 3 Oc =v?'_0: itifin id e n ti^ic-icco * )

: 2 *ftif-.;ioc.*S?aota = a ? o iia r g v (l]); A M a r el sesn^to de jenorLa ccaoartlda < x'Qr&KO*G - tfioaticentiflcadcrsegnento, , 0)| < {char ) 0} {

;^ 'rcr( >

e x i tiS t; T _ P A I u f l S ) ;

330

Programacin en Linux

/ * En sue d ir e c c i n na sio o adosado e l segnunto? ' ( p r i n t f E l s a g ie n t a ha sid o adosado en Vo'.n*, 3 u f_ sgtonsnc&TDi

* Conprobacton e que e f e c t iv a u e it e e l segnento na s id o adosado * i sy ste n d p c s o *};

/ ELLwnar vinculo (oesacoalarl

*1

lf 5 M 0 tD 4_ tgtotw conaj) < 3) (

perrorCsnnot');
X U (E X U _FA IIU R E 1

)
n o tsc s i e n t o / V o r t fic a r u a sa c ilac < i\n ; o fo stiv a n o n t o l sognonto haya s id o d esaco p lad a /
qui)

syt<m|*iKJ -n*|
j< iU ttfcr_ s x cE S S ) ;

> Shmat retornu un puntero de upo c M ar, de modo que cuando se voncn su cdigo de retorno a d 0 s a r _ s g t 0 ineffic0 mp asigna tem porariam ente (cai.v al cero el tipo ic h a r *) p ara ev itar asi m olestas advertencias dol compilador Este ejemplo tam bin utiliza el comando ip e s (estructuras d* IPC\ para confirm ar que el proceso que efectu la llam ada h ay a efectivam ente adosado prim ero y luego desacoplado el segm ento de mem oria com partida. La si guiente salida del program a ilu stra esto. Obsrvese que el nm ero de proce sos adosados, n a t t c h , prim ero so increm enta y luego disminuye.
5 .1 ad05ar_3gtoanco.a 4W533 E J n e n t e h j sid o adosado on 3 *4-3U 0 M

SALtO A

--------s r.a rd vichor / 3 g * e n t S -------------noy Jx&NOOZM shtud 4&S33 oner * u r t .* 3 U p errs


366

O ytes
-0 9 6

n attch
I

Sagwnta desacoplado

-------- Snarad Wenory Segnents ------------

*ay xaoee-wao

3?iflid c<3833

onn$r
k u r? ja ll

perns 566

bytss 4336

natten o

arataa

Como se puede apreciar en '.a salida, luego de desacoplar el segm ento de me n o ra com partida el valor de n a t t c h pas de 1 a 0.

Captulo 15: Memoria compartida

351

\ t/ T | /= l
iT c M e T o

2. El prximo ejemplo adosa al program a u n segm ento de m em oria compartida, escribe d ato s al mismo, y luego escribe el contenido del respectivo b u f fcr en el archivo s a l - .d a _ 5 gto-ne 173c a n p . o u t
* 5 B 5 'f a : 5 '3 S r j * 4 *.1 o p w .c *

/
5 r ir_ s g :o i o o : - * t r r ta i S i r t u l s : * y '_ u ; ,-^*xr.oro c m n ific a a o r M ao ry sscnent

I <rfSXym.n> ircJjtf <ty*/DC-h


ttflclod * <sys*.-o..H

imcluO* itaio .i
< i:a i o .n inclwJ* ^ c rti.ft

rww_3C? <W6 i: < pr>cwo /


if lt t; $ sisara *us

*!^c. cnr *rQv[ 11


u n ;<J*n:*fic*Scr$*5M n :o :
cfitr *6wf_ iy:oa4KO$o;

/* ;d*ntl.f:c dcr oet jagncnt V


/ Pu m ijro i a tr a c c i n an p a c i do n an o rta dol

w t c *ri?:o p _ * rcn ivo ;

/ O a ic rip ro r c l ir c fliv o da s a lid a / Contador /

ttgaen:* i if(r^c l 2) {

la li-a a le -cnandcs iay preserte un td a m 'lc u d o r

do

p u t s c y c e o 0 5 Sf f U O r i e r i P _ j ^ t 0 n M C 0 0 C

leader*)

*it(Drr_FAIUJRl; }
ia*tifieRr$egw>'!to - a t o iis rjv rrii);
o s -* l s ie n to /

:* '

sjtoni^coie * snaatica.iti'icaccrSegaer.To, a. a>)

< (cr<ar *) D i {

jneH 1) i;: x :t_ c x h i^ j; > Asignar rijc.-ia z z n ai =E-;3ft: sicsaao


i - 3u*_ sgtcaeeccac iioc{3eof< cna< TAKM0_3UFH iULL) {

3 -rcrrsi;oc*); e*it<=Xrr_FAIL^); }

j:

1 f

>

'

>

Programacin en Linux

o r ( i t 0 ; i < 7/AW3_8llF; i ) u?_ sgrcasncors [ ] 1 % I27

96M};

cascriptO!* archivo - 0C8nC33i<Ja sstoirenccso.ouf, 0 M E iT o bov .Y .

'.t8 (d S c riD *.o r_ 3 'C h iv o . cu f_ s-to n e n c w a . rAttAO_BUF); x it ! * :r _ S jC C E S S ) ;

> E ste ejem plo adosa al espacio de m em oria del program a u n segm ento creado previam ente, establece los valoras correspondientes de la regin do m em ona y uego escribe todo el buffer a u n archivo de disco. El program a no tiene sa lida visible, pero el siguiente listado es un extracto de ese archivo de salida, s a lid a _ s g to n e m c o m p . o u t: S .,,aorir_igtoei*coi'0
e-v6'C-o'e*F**: '<*l,*M*N*0*P'*Q*l>*8*T*U V*W*X*Y*ZE9C*\*l ***_ - I ** I ) *, ,/3l2:W56?q9: ;<>'?0A8CCEFOH!jK, _K'OPORSrU/AfXVZ

aocdefg/1il^(l/^.^ocqr^tuv*y^:>-'^*A*8C'0El: La -Jcaicncia de caracteres que so m u estra Gd on renlidnd continua. Los sm bolos indican sim plem ente la continuacin do! texto desde la lnea an terio r

Lo que viene
Este capitulo analiz el sistem ii de m em oria com partida IPC System V El prximo capitulo. "Semforos y colas do m ensajes", contina !a exploracin dol IPC System V. p ara pnsar posteriorm ente a la program acin do TCP/IP y aockets en el captulo 18.

Jt

17
Semforos y colas de mensajes
E ste captulo contina con 1 trata m ie n to del PC System V que fue comen* lad o on el capitulo an terio r El anlisis del mismo norri completado con la co bertu ra de las cola? de m ensajes y los semforo*. E ste capitulo cubre toe siguientes tenas Qu es u n a cola de m ensajes Creacin do un* cola de m ensajes Agregado de elem entos a una cola d e m ensajes existente Publicacin y recuperacin de m ensajes Eliminacin do una cola de mensaje#

Qu son los semforos


Creacin y eliminacin de sem foros Actualizacin de semforos La uUitzaon da octetos PC ae memona cofr-oarnaa se anana en ai caotuo 16. Memo ria conzarsca" Todos los program as de este capitulo p ued en ser encontrados en el sitio Web h t t p : / y www.flcp.com n f a b a jo el n m ero de ISBN 0789722151.

i
356

j y

} ) . ) ) ) ) ) }

Programacin en Linux

El IPC System V y Linux


EL mtodo de comunicacin en tre procesas rPC System V es sum am ente cono cido v habituaim onte empleado, pero la im piem entacin del mismo por p a rt de Linux tiene num erosas imprecisiones, como se hizo n o tar en el capitulo a n terior y se lo continuar haciendo en ste. La versin de Linux dei IPC Sysiem V tam bin es anterior aJ IPC POSIX. pero son pocos los program as de Linux que en la prctica la im plem entan. aun cuando se encuentre disponible en ios kerneLs correspondientes a la versin 2.2.x. El IPC P O S K ofrece una interfaz 3imiiar n la det System V comentada en esto capitulo y en el anterior, pero eli mina por un lado algunos de los problemas que te n a el System V y por el otro simplifica la interfaz. Ei problema es que aunque el IPC System V es e st n dar. est implem entado en Linux de m anera deficiente y casi perversa, por ra zones quo son demasiado avanzadas p ara ser cubiertas aqu. El resultado es que Linux, que tr a ta denodadam ente du satisfacer las norm as POSX (y en general tieno xito), im plem ento una versin demasiado antigua tanto del IPC POSX como del IPC System V. La dificultad es que el System V se encuentra sum am ente difundido y es m s comn, pero la versin POSIX es mejor, ms sencilla do utilizar y cu en ta con una interfaz m s uniforme p ara poder in teractu ar desde un program a con lo tres tipos de objeto IPC. Ei re sultado? Personalmonto eleg rom per con mi propia regla y opt por cubrir lo quo ea probable quo se encuentro tan to on los program as existentes como los nuevos en lugar de explicar ol Mtodo Correcto O; o oea, ei IPC POSIX. C uando se program a utilizando sem foros surge otra cuestin adicional Loa nemforoa de System V fueron creados en la Edad de los Tinieblas p a ra po der abordar la m ultitud do problem as que surgen cuando varios hilos do un nico proceso (y tam bin do mltiple procesos) que si: en cuentran en ejecu cin necesitan acceder a los mismos recursos de sistem a aproxim adam ente al mismo tiempo Si bien considorb que los program as multi-hilos bien t'.srr:fos son un componente esencial (on realidad, indispensable) do cualquier sis tem a Linux, lo que deseo en fatizar e n realidad es bien escritos La redaccin de program as m ulti-hilos uo encuentra lejos, muy lejos de los alcances de es te libro; no es una taroa que deje lu g ar p ara program adores novicios. Los program adores experim entados, h a s ta los 3per-program adores. tr a ta r n de encontrar una solucin altern ativ a an tes do recu rrir a 1a program acin m ul ti-hilos porque la m ism a es difcil de llevar a cabo correctam ente. Mi solucin? He procedido a sim plificar a discusin de los sem foros por que la versin System V fue creada pensando en los procesos m ulti-hilos. N ro obstante, los sem foros em pleados en program as estndar, mono-hilo, son muy tiles, como lo apreciar el lector en este captulo. La interfaz PO SE ce sem foros es m s sencilla poro su empleo no se encuentra m uy difun dido, por el momento, en ios program as de Linux.

Colas de mensajes
U na cola de m ensajes es u n a lista vinculada de m ensajes alm acenada den tro dei kernel e identificada a los procesos de u suario por un idcnsificador de cota de mensajes, un identieador del tipo analizado en el capitulo anterior.

>

j)

>

>

Cap?u!o 17: Semforos y colas de m ensajes

357

Por razones de brevedad y conveniencia, este capiculo utiliza los trm inos coia e idenr.r.cador de cola p a ra referirse a las colas de m ensajes y a los identicadores de colas de m ensajes. Si el lector a ad e un m ensaje a u n a co ia. :a m ism a a p a re n ta r ser u n F IF O porque los nuevos m ensajes son a l e gados al final de ia cola ce m ensajes Sin em bargo, el lector no tiene que re cuperar los m ensajes en orden de arribo como en un FIFO. Las colas de m ensajes pueden se r consideradas u n a form a simple de m em oria asociativa porque, ta l como se ver m s ad ela n te, uno puede utilizar el tipo do un m en saje p ara recuperar ei m ensaje fu era de secuencia. La diferencia e n tre las colas de m ensajes y los FIFO s se ilu stra en la E gura 17-1. =FO

w b 9i

Ouvua

F ig u r a 17.1. A diferencia de lo q u e ocurre con las FIFOs, los m ensajes p u e

den ser ledos desde una cola de men-iajes en cualquier orden deseado. Como el lector ya sab*. deudo un FIFO loa datos son luidos en ol mismo o r den en que fueron escritos al mismo Esto e st ilustrado en la m itad :iupt* o r de la figura 17-1. Sin em bargo, si uno conoce el tipo de un m ensaje, pue de extraerlo de la cola m era de secuencia. Como lo indican las Hechas que salen y se alejan do a cola d m ensajes, loa elem entos in teg ran tes do las m ism as son en general ledos on orden FIFO, o se a el primero que se escribe es ei prim ero que lee. Los dos rec tngulos dibujados con lneas de puntos con Lechas apuntando hacia arnera de la cola de m ensajes m u estran cmo pueden 3 e r ledos los m ensajes en orden arbitrario. Ib d as las funciones de m anipulacin de colas de m ensajes se en cu en tran de clarad as en < s y s / rcsg. h>, pero se debe tam bin incluir en el cdigo fuente del program a < sy s,; :y p e s .n > y < s y s / i p c .n > p a ra acceder al tipo do va riables y constantes que contienen su s declaraciones. P a ra crear u n a n ueva cola o p a ra a b n r u n a cola ex isten te se deber em plear la funcin m s g g e t. P ara aaLr u n nuevo m ensaje al fin al de u n a cola, utilce m sgsnd. P a ra ob ten er u n m ensaje do ia cola, em plee flJSflrcv. La llam ad a a m s g c tl le perm i te a uno tan to m an ip u lar las prestaciones de !a cola como elim ina r la m is m a. siem pre y cuando el proceso q u e efecte la Llamada sea el creador de la cola o cuente con permisos Je uperasuario.

3 5 8

P ro g ra m a c i n e n U n u x

C r e a c i n y a p e r tu ra d e u n a c o la

La funcin m s g g st crea una cola nueva o ab re u n a ya existente. S u prototi po es el siguiente; int nsgg*ti**y_r '</, int flags); Si la llam ad a re su lta exitosa, recom a el identiF.cador de la cola nueva o exis tente que corresponda al valor contenido en key [clave), de acuerdo con lo s i guiente: Si key es IPC_PRIVATc, ge crea u n a nueva cola em pleando un vaior de clave que genera la im plem entacin del sistem a operativo de que se trate. U tilizando IPC_PRIVATE se g a ran tiza que so cree u n a nueva co la -irm pre y a jan d o no sean excedidos con la m ism a el nm ero total de colat o el nm ero total de bytes disponibles p ara la totalidad di- ias co las que p erm ita el sistem a operativo. Si Key no es IPC_PR IVATE, pero key no corresponde u una cola exis ten te que tenga idntica clave, o si so oncuontra activado unimiiimo el bit IPC_CR6AT en ol argum ento Daga, la cola ser igualm ente creada. Sn ol caso resta n te -o sea. ai key no ea IPC_PR IVATE y el bit de IPC_CREAT de flags no so encuentra activado- m sg g et reto m a el identificador de la cola existente asociada con key St m sg g et fracasa, reto m a - l y unigna a la variable de erro r e r r n o el valor adecuado.
E je m p lo

ejeM Pto

El program a de dem ostracin quo sigue, c r e a r _ c o l a , crea una nueva cola de m easajes Si se lo vuelve a ejecutar una segunda vez, on lu g ar de cre a r la coid especificada sim plem ente abre la cola existente.
I ' Sonor <11 p r e g ra u #n In tu rn et: al<q.c */

/
c r e ir .c o ii.: Crea uns c c ln d* rrnsaios o IPC S y sten v

V
riiiclL-ce < s y s / t y p e a .io w c iL o e < s y jn o c .n > * in c '.u 2 < s y s/n $ g .h > in c l w ia < s t a io .r > i n c l w e < s t a lib .n > in t r c a in d n : a r g c , ch a r * a r g v [ [)

{
i n t ie e flt fic a < Jo r _ c o i* < y_t c la v # = 1 2 3 ; ; * C raar la c o la / * C lave aa i a c o la / r.5n ssje3 *>' 556 } } < ) {

f ( ( ! d e n i i f i c a r j : o l a = s g o t ^ c la v e , IPC_CREAT

CsDftuto i ?

Semforos y colas de mensajes

359

p.-ror; K C gsticriatj';; 9Xt(EXiT PAILAS}; i


ir .x H 'C rtic i : o i a -se ic s r .t i r i c a a c - - - V \ r > \ W ^ s i f tca d orjrp la) ;

O&r. tne Tuffue ^air '


i< {ite n tlfic jd 3 r_ c o U - tso3t(<ey. ) I <

9) (

C 4rrcrrnsy;-et::s0 i
exi5 EX IT_FM U );

}
O f i n t ' l s o l a e ia a n n ic a o o r sc\n*, itJantfic.ioar_cala|

*tt(aiT_succrss); > La salida de este program a en mi sistem a present ol *iguente aspucto: J ,/crr_coU
Cr*c* c o ia U * 3W A ftitr ta c a l i 4 id cn tificM e * * te*

Si la p rim era llam ada a n s g g e t tiene xito. c r e a r _ c o i a exhibe el ideatificador de la cola recin creada y luego llnm a a msgge t una segunda vez. Si la segunda llam ada tam bin tiene xito, c r e a r _ c o i a informa esto de nuevo, poro Ia segunda llam ada m eram ente abre la cola existente eu lugar de crear una cois nueva. Obsrvese que la prim era cola especifica permisos de lectu ra/escritu ra p ara todas os usuarios em pleando la notacin ootul estndar.
PRECAUCION

AOsfrereace a ccc.'re cor a- owrsMftamier. ce la f-rcicn open. cuardo se :-B2 ut3 e^rructjra *=C S>-=fen v. a usask -r-> ornease io mocics los pampos Oe acceso o a estrjct--3 5- -oo r.o astaoiece permisos <e acceso, el tccu pfcdeier minado es 0 . ,io <?j s gnrifca ?--e creacc/ o- .3 strucrurj usnflf pirn-fsea oe ac ceso c* t-ra/e& cr^'a a ta ciis.xa!
E s c r itu r a d e un m e n s a je a u n a c o la

Tai como fue expucado anteriorm ente, p a ra a a d ir un nuevo mensaje al fimil de u n a coia e deber utilizar la funcin m sgsnd. cuyo prototipo es el s i guiente: is ~ i s r c i i R M i c ' -0 12 *ctr, siz_z n a / z i s . in t ? a g s ; ;

-sesend reto m a 3 s nene xito, y en caso de fracasar retom a y asigna a la variable de error s r r n o uno de los siguientes valores:
=AGAIN EACCES

'

Programacin en Linux

EFAU LT E IO S M

E IN TR
E IN V A L ENO M EM

Los valeres posibles de e rrn o y as exot.;cacic**s de ios mismos estn l i s t a s en la ta bla 5.1. 'C e lo s do error generados cor las llamadas a sistema*, pgir.3 125.

El argum ento rnsqid {identificadar de cola de mensajes) debe ser u n identicador de cola retom ado por u n a llam ad a an terio r a rcsg g et. Por su parte, n b y te s os el nm ero de bytes de la cola publicada, que no tie ne que e sta r term inada en u n cero binario. El argum ento p t r es un puntero a u n a e stru c tu ra m sg b u f, la cual consiste de un tipo de m ensaje y de los byte3 de datos que comprenden el mismo. La estru ctu ra m sgbuf (bufferde m ensaje) se encuentra definida en < s y s /m s g . h> de la siguiente m anera:
J t r u c t agouf {

loflfl ntyc;
Cflar n t < t(l| :

i: E sta declaracin do estru ctu ra es en realidad slo una plantilla, ya quo m te x t debo se r del tam ao de los datos quo estn siendo alm acenados, ol cual corresponde al valor de longitud de cadena transferido en el argum ento n b y te s . menos cualquior posible coro do term inacin, m type puede ser cualquier entoro de tipo l o r g m ayor quo cero. E! proceso que efecta la lla m ada debe contar tam bin con perm iso de acceso a la cola p ara escritura. El argum ento f l a g s (indicadores), finalm ente, puede ser 0 o IPCNOWAIT Eote ltim o valor ocasiona un com portam iento sim ilar al del indicador 0_N0N8LQCK que ae transfiere a la llam uda a sistem a Open : si ya se a el n mero total de menaojes individual! quo forman la cola o el tam ao do la m ism a, en bytos, es igual al limito especificado por el sistem a p ara el m is mo. m sgsnd reto rn a inm ediatam ente y asigna a e r r n o el valor EAGAIN. Co mo resultado de ello, uno no podr a ad ir m s m ensajes a la cola h a sta que por lo menos uno de los m ensajes haya sido ledo Si ? Lags es 3 y ya sea que la cola tenga el mximo de mensaje perm itidos o haya sido escrito a la cola ol nm ero total de hytes de datos perm itidos, la llam ada a flsg sn d se bloquea (no retorna) h a sta que dicha condicin sea mo dificada. P ara modificar esa condicin se debe o bien leer m ensajes de la co la, elim in ar la m ism a (lo cual asigna a e r r n o el valor EIDRM) o a g u a rd a r a que sea intercuptada una seal y el h an d ler correspondiente reto m e (lo que asigna a e r r n o el valor EINTR).
CONSEJO U plantilla ce la estructura msgbuf puede ser expandida de modo de satisfacer las rseceaidaces de !as disertas apiicacor.es. Por emeio, si uno desea transfenr un mensao que consista ? .* . un valor entero y un arrezo de ipo carcter compuesto por 1 0 Oytes 4*o nace fat3 ceciarar msgCuf como sigue:

.1

> )

>

>

>

'
361

Captulo 1 7 : Sem foros y colas do mensajos

r . - 'j r IC-^ tLCCJersaj;


in t c fc a r i; : * t o _ w n 5 3 i n |;

>;
5S-9C.* e * s u n va cr lo ng se^vdc ;<y ios -3ao$ del mensaje, que cvcden Star fe a n sie s cor--" jnc lo constce--* adecuado. B .amarte Ce a estructura decio^aca este ejecxeo es s iz e o f ( s g t u -f) s i z e o f (l o n g ).

E je m p lo

E3te program a. e n v ia r _ 3 _ c c ia . a a d e u n m ensaje al final de u n a cola que ya existe. E l .der.t-.tcador de la cola le debe ser transferido ai program a co n o nico argum ento de su lnea de comandos

r
/

* $ * tr*

5:

;rjg rtx a

In te rn e t.

n d .c

*wriar_a_eata.c - rv ta r on
5 in t u rn a r_ a _ c a ta

a una cola ya ao ie rta con a n te ric rid o s


da c o la

d a n tific a c c r

I
ainclw Ja tya/typas.n in d u c e

<||t/idc.rv>

V K h tto < i y $ ln g . >

u rc l^c t <jtaw.-> tncluo <*:Clie.ft>


incl-ide <t<*trg.n

tftcia# uniste. n>


c e rin a rA*wo_8? 5i2 it m c t santa]* { lo fl tiM _ H e n ia je ; /* Estru ctu ra para a l .majo *f

a u r te*to_a*flsa|*(?AMMiO_SCfl; >:
ir t * a ir .( in t a r;c . c r ir * a rijv J |

{
in t in t se r ia n tific a to rje o U ; ta n f o .tttto ; * / M a s a je e i O u f f a r .a e n j* } ; ic a n tiic s o o r

I' r :e c o l a
tra n s fe rid o en

lo n g itu d

se l

n a n sa ]e

e n v ia d o s tr-c t

e s tru c tu ra ia

se

o a tro n de

n e n s a *

*/ V

Oe te n e r

lin e a

c c ita n o o s

362

Programacin en Linux

if| a r$ c :* 2] { 3a corandcs /

/ A sacer- ncirjre c a l prograns y arjunerto de su i'.nea

p u tii'W Q O O CE SU P lE O : e n v ia r _ a _ c o la < LtJtQ tifC 3 < 3 o r p c o la > )\

/ ahupe) ; >
x < 3 * n t ifc a ila r _ c o la a t O i U r g v O l K

' O b te n e r L e e n s a ja a ue s e r a a flro g a d o a l a o u t s < * t r g r a s un m s a le o a r a p u b l i c a r : ) ;

c o la /

if(|'g et3 0 4 tu -i8f_,Tnsa|9 > MXWJW**j, JAKAVOJUF, stain>| ** NUlLI { 3u ?3 ( "No nay w<ua|* o a r a s e r p u b lic a c o " ) ; x 1 1< exir_3ccS$ > : }
I * A s o c ia r 1 n e n a a je in g ro a d o c o n m g ro c o a o /

(Mffttr
r

* n i. i) * . t ia o _ e a n s a | a g e t p id O ; /

A a d ir 1 n n sa ) a l U n a ! d l a c o l a

: aiui*a_:exto * strUn<buffr_*ar,a|*.tiixto_nonM)#}; i'(( tig jn d < ld r:if:.c * d e r.c o la , 4bjffr_aenaa, tn*aA_t*to, a a rra rC B jg s n a 'l! iitl xtr_ F A a i> e >

0}|

< a) i

)
p u ts C U im a ja p u D lic a W ) ; rtxH(XIT_SUC6SS);

> Un.i corrida de prueba de osle projjrama prodigo la siguiente salidu O bsr vese que el program a utiliza el identificador de cola retornado por la llama* da a c r e a r j j o l a mm ediaLamente anterior.
S . crear_cola Creada co la de id a n tifica c-a r * a<o A c ie rta c o la oe ldenti*;cador * 648
s a l id a

5 s . /e<iviar_a_cola $43 Ingrese un nenaaie para su b lica r: cS*3 as a l oersa;5 3e prueca niero uno aensaie coDiicado

El prim ar programa, c r e a r _ c o l a . cre una cola nueva cuyo idenncador fue 640. E i segundo programa, e n v ia r_ a _ C O la 60. solicit un m ensaje para ser publicado y almacen !s respuesta tipeada (indicada en negritas/ directa m ente en la estru ctu ra de patrn mensa ] e declarada ai comienzo del progra-

Caotulo 17: Semforos y colas de mensajes

363

ma. Si - s g s n d completa exitosam ente, ol program a exhibe un mensaje a ta i efecto. Obsrvese que 9nviar_ a_ C 0 la establece el tipo del mensaje al PID del proceso que efectu ia llamada. Esto le perm ite a uno recuperar mas tard e utilizando s g r c v slo los m ensajes que public este procoso.
O b t e n c i n d e un m e n s a je p re s e n te e n u n a c o la d e m e n s a je s

P a ra e x traer u n m ensaje de una cola se debe u tiliza r m sgrev (recibir m ensa je.'. que tiene la siguiente sintaxis:
1M g r c t l u t c o , vola o tr . s ir _ : oytes, Iccq t>M , rn t f l i g i ) ;

Si tiene xito, a s g r c v elim ina de la cola e l m ensaje que haya extrado. Los argum entos son los mismos que los que acep ta ra s g sn d , excepto que m sg rev rellen a la estru c tu ra sealada p o r D tr con el tipo de m ensaje y h as ta n o y te s de datos. El argum ento adicional, ty p e , correspondo al miembro ti.p o _ r.e n sa j e do la estru c tu ra m e n sa je com entada anteriorm ente. El vulor de ty p e determ ina que m ensaje os retornado, tal como so indica en la si guiente lista: S ty p e es 3 se reto rn a el prim er m en saje (1 uperior) de la cola Si ty o e es > 3 se re to m a el p n m e r m en saje cuyo t p o j n e n s a j e sea igual a ty p e . Si ty p e ea < O e re to m a o! prim er m ensaje cuyo tip o _ m e n s a je sea el valor m is bajo m enor o igual al valor absoluto de ty p e . El valor de f l a g s controla adem s el com portam iento de m sgrev. Si el m ensaje reto m ad o tiene una extensin m ayor a n b y te s y en f l a g s se e n cu en tra activado el bit correspondiente a MSG_NOEROR. ol mismo resu lta truncado a n b y te s pero no se genera notificacin al respecto). Si el bit res pectivo no ie en cu en tra activado, v.s g r c v re to m a -1 a fin de indicar un erro r y asigna a e r r n o el valor E23IG {ERROR: D EM ASIADO GRANDE). El m ensaje seguir perm aneciendo eu lu co la S: en f l a g s se en co n trara activado el bit IPC_NCWAIT (IP C JfO E S P E R A R ) y no se encontrase disponible un m ensaje del tipo especificado, m sgrev re to m a inm ediatam ente y asigna a e r r r .o el valor ENOUSG. De lo contrano. a s g r c v se bloquea no reto m a h a sta quo te n g a lu g ar p a ra u s g s n d u n a de las m ism as condiciones descriptas anterio rm en te. NOTA Se steoa ampte jy .,v:f -*ac osra a gmena 'ico oara crear un ac ce cois denom>-* LifO 2 ano ?tra orrr^rz xe i& iaa ir flrst ouO i mencoo oanoninaao olla s 'jo _s r=r'=-*<-cis corre '.ce oe ur .3 c<oegatrvo permite o uio rocuzcrar rrenssea zc jr '.ys z&x, e ai w : r . 3a-acnseos en cois.
E je m p lo

El siguiente program a i e r _ ! ;o i a . lee un m ensaje da u n a cola previam ente .-reaca que disponga de mensajes. El :cencificador de la cola de la cual se leer se !e tran sfiere al program a como un argum ento s n la linea de com an dos del mismo.

364

/ ) ) ) ) Programacin en Linux

>

>

>

Ver,rz d a : p r c q r a n a e r i n t e r n e t : q r d . c /

r
l 5 e r _ c o i a . c - Read a l l n a s s a g e 'r o n a ie s sa g e queue S i n t a x i s : l r _ c o l a i d e r t i f t e a d o r de c o la

*/
n c l u d * < 5 y s/t'/0 9 3 .ti> i r e l u d e < s y s /i o c .n > *L*.<luce < sy 3 / irsg .t in c u c e < $ td io .h > ln c iu < s td llb .t >

< d ? i.ie XAHMOJUF 512

J t r u c t r o n s a ) < Ic n q t t p o j i e n s a j ; c h a r t x to _ n n 5 3 - e ( r,w ,;o 3U F ;;

E s tr u c tu r a p ara o l r . s a j e /

n: nainjlnt aroc. char *arQV()|


t in t jC 0.1 t i f ic a d o r _ c o l .1 ; i n t ta i a fo _ ta < to ; io r n v u d o / s t r u c : o o n j a j a lw f f r_ o n M J ; / lo n jltu i d * l * n sa )a a / e s t r u c t u r a de p a tr n n e r a a i a /

/ O o te n o r o l i d o n t t f e a d o r do c o l a t r a n s f o r m o o n l a i t n o a ao c o n a n d o a / lia rs e i *2 | 0 c o n a n c a ' / ( / A m o e r - n o r ro c o l p r e g r a n y r j u c t n t a do
j

li n c a

S u t i l -MCOO 2 c cUPLEO; l o o r _ c o l a < i d o n t l ': c d o r ao c o l a * ) ;

oxit<x:r_FA:LURE);

*
ld o r .tif ic a a o r_ c o la * a ro l4 rQ v (l | ) ;

R c u p ra r un n e n s a ja d a l a c o l a y e x h i b i r l e /

tit.irto_taxta - osare-/( identiflcador_cola, .1 buffor_enaaje, TMWlOBUF, o, 0} i f ( tacao je x t o > O! {


p n n t? C '- * y e n d o i d e n t i f i c a d a ." d e : o l a . % 05t\n*. : 3 o / i t i ? l c a c c r _ c o l a ) ; o r m t f C '. t T l p o do t a n s a j e : W d X r T , ( S S u r r e r j i e r . s a j e ) i t i p s j i e r . s a ] * ) o r i n t f ( * \ t T e ) c t o c a l n e n s j ; S - s n *, |A o u ffa r_ r,e n a a } e ) > te x -o _ .tie n sa ;o } ; > Isa { p e r r o r ( * w g r e v '| ;

'

.1

.1

>

Captulo 17 Semforos y colas de m ensajes

365

t i t X I - _ = A lL f t = i;

> **it(Exrr_syccSSj; j A continuacin se m aestra la. saiid a de este program a. En este caso, el m is mo u tiliza ei identificador de cola creado por c r e a r _ c o i a y lee ei m ensaje publicado por en v af* _ a _COla.
5 . / cri^_coI*
C r t JC i c o la : e n w n t i? iz i-lo r A b i t r t a c o H C iUtrtttficacor * s u
S A L IO A

S S ./to*Ur_4_coii wa Ir g s* ur w -saj c-sra pusliC^r: S ttt * t i M-i*!* C ;rij*:4 r w o une


flw jf
b

S Ii : 2 c

S
t / I w _ C 3 l a 544

lib re o i3e.*Lfic*or 3* ccU: 4*0 Tiro <n *r.*ai: i3*3


T to c l o r n t : 6 jt 9 ? I i r | c e pruooa nunora uno

3c puede advertir, observando el cdigo fuflnto, q u r lour di: u n a cola do m en e e n ( m is sencillo que escribir n la m:.ima y requiere de menos cdigo. Re su lta de p articu lar inters en el p ro gram a de dem ostracin quo el m ism o ob tiene el prim er m ensaje que e n c u e n tra al comienzo do la cola porque al mismo se le transfiri 0 como arg u m en to ty p e En esto caso, como el PID del proceso que eacnbi el m ensaje se conoce o puede ser fcilm ente o b ten i do 1*338). l e e r c o l a podra h a b e r transferido 14308 como ty p e y hab er recuperado de ln cola el misino m ensaje.
M a n ip u la c i n y e lim in a c i n d e c o la s d e m e n s a je s

La funcin m s g e ti provee un d e r to grado de control sobre la colas de m en sajes. S u prototipo es el siguiente: it M $crl(in: cvjid. uir cao. stnjct qiajSB *ou#|; r .s q i d , como de costumbre, es el identificador de una cola existente. c~ en este caso, accin) puede a d o p ta r uno de los giguinnt.es valores: IPC_RMID: elim ina !a cola de e stru c tu ra ^ q u i d _ d s cuyo denLificador e s a s q id . 1 PC_STAT: rellena ou* con el contenido de la cola de estructura ms Od j j s identieada por m squid. IPC_STAT le perm ite a uno desplazarse por ios m ensajes contenida? en una cola sin .limmnr ninguno d e ellos. Como IPC_$TAT lleva a cabo una lectura no destructiva, se la puede considerar sim ilar a m sgrev.

P ro g ra m a c i n e n U n u x

I?C_3E7:

le perm ite a uno modificar los siguientes parm etros de u n a cola; UID, GID. modo de acceso y ei mximo nmero de bytes que se perm ito alm acen ar en la misma.

E je m p lo

cjsm p io

El siguiente program a utiliza ia llam ada a m s g c tl p ara elim inar una col3 cuyo identificador se le transfiere on la ln ea do comandos. r Nonort del p r ^ r a n a qn [ n t e r r a t : f i c t i . c */ e
? lt 3 iin a r _ c o la .c E la in a una c o la oc ttan sajo s

S ln ta m iutLna r Tr.ja|9 uianuficacor Oo cola

/
#inciuo <sy$/typ.n> ircluaa <iysapc.n>
*:n c lu o < iy / 8 g.ft>

tnclu<3 <s:dio.h>

inclu
yiciud* < rin g .ti>

irclud* <unw:<l..l>
M i z a in lim arge, char *arQV{|>

<
in t iCantificaaor,cola; struct ajoia_JS colajJBjionsajea;

f(arge := 2) {
puts(*M000 0 EMPLEO: a iir ,in a r _ c o ia <identfiC3!Sr_C0a>' >; e< itjE X IT _FA lU JR S);

>
K JflflC iflC 3d o r_ ola 3 a t o i ( 3 r g v [ i ) ;

i ( ( g c t i i < i a n t i i c a c o _ c o l a . IP C JW 10 . e a r r o r i 'n s g c t l 'J

< 3) {

ex:t(SXIT_FAIUJR.);

)
p rin tff* C o la % d

sliA inttaln ,

ic e n t ific a C o r .c c ia ) ;

9X I ( SXI T_S_'CCS3S i ;

Captulo 1~: Semforos y colas de mensajes

367

S , / ; ' r . a
C r * W l C 3 5 Ce l .* t f ic 4 4 c r =

2zi

cela u :a<i?;';c*3o- * 230


S
SAtlD*

s ipcj n
ir p

----- USJlc Srf. ------* ;5

smr*r

1MHJ?:

k u n jM il

5i-rs ; n S

js a -S y tf

m sa g 9

s
S ..'#!siaar.c9U 'Z Con ' S I

s
S lK t 3

i i -------Kid ownir w nu uieO-ytes mihqi La id a de este program a m u estra que In coto especificada ha sido elimina d a Ei proceso c r e a r _ c o l a crea on efecto la cola. El comando ip e s confir m a que la cola fue creada. Em pleando 1 liego el identificador de cola reto m a do por c r e a r * _ c o la , a l r u n a r j r o l a llam a a m s g c tl, especificando el indicador IPC_R.UID que es requndo por esa ru tin a para elim inar la cola. U na segunda corrida de tp e s confirm a que e li m t n a r _ c o l a efectivamente elimin la cola de menaajes. El comando i p c s ( 1) estructuras de IP O , utilizado en vario* de lo* progra mas de dem ostracin, m uestra el nm ero y el estado de todas las estructu ras de IPC System V que se encuentran presentes en el sistema cuando en esa instancia de su ejecucin. El comando ip c r o ( 1) elim inar la e stru ctu ra IPC cuyo tipo o tdcntificador sea especificado en la lnea de comandos. Ver las pgina* dei manual para ob tener m ayor informacin. La figura 17-2 m uestra la salida del comandu tp e s .
*7

-----MtU( X k

F ig u ra 17.2. Ei comando ipes m uestra :odo$ los objetos dei [PC System V que se encuentran presentes er, el m om ento de correr el mismo. La figura 17-2 m u e stra que por lo menos uno de cada tipo de objeto IPC excte. Se encuentran corrientem ente en uso rres segmentos de memoria com parad a, una cola de m ensajes y dos semforos los semforos se an ali zan er. ei prximo ttulo). P ara cada objeto ?e listan claramente u clave.

.1
368 Programacin en Linux

>

identifcador, propietario/creador y perm isos de acceso. Las estadsticas rela'iv.i? a cada tipo de objeto se m u estran en u n a o do3 colum na? de: extrem o derecho de la tabla, segn sea el tipo del objeto.

Semforos
Los semforos controlan ol acceso a los recursos compartidos. Son su m am en te diferentes de todas las dem s form as de 3PC que se han visto h a s ta aho ra, porque ao por.en informacin a diaposicin de los procesos sino que en -ambio sincronizan el acceso a los recursos com partidos que no deben de ser accedidos ai mismo tiempo por m s de un proceso. A ese respecto, la s opera ciones con semforos se parecen m s a u n a generalizacin del bloqueo de a r chivos, porque se aplican a m s recursos que 3 0 I0 archivos. E sta p arte a n a li za slo la m odalidad m3 3imple de un sem foro, el sem foro binario U n semforo binario puede ad o p tar slo uno de dos valores: 0 cuando u n recurso se encuentra bloqueado y no debe s e r uccedido por otros procesos, y 1 cuan do ol recurso queda desbloqueado.
Para oOtanorms Informacin acerca dol cloqueo tfc 3rcbvos y registros, ver 'Bloc^eo de arenaos*, ogina 182.

Los sem foros funcionan de una m an era muy sim ilar a seales de trn sito de .nilo dos lucea (roja y Yerdc) u b ic a d a en un cruce transitado. C uando un proceso necosita acceder a un recurso controlado, tal como un archivo, p ri mero venlica el valor del sem foro p ertinente, lo mismo que un conductor verifica quo u n a luz do trn sito est en verde. Si el semforo tiene el valor 0. quo es equivalento binario de la luz roja, el recurso se h alla en uso, de modo que ol proceso c bloquea h a sta que el recurso deseado se vuelva disponible es decir, el valor dol aemforo se vuelva no cero. E n la term inologa em plea da por ol IPC System V, oste bloqueo tem porario so denom ina w a i t < espera i Si el sem foro tiene un valor positivo, lo cual equivalo a u n a luz verde p ara dicho acceso, el recurso asociado al m ism a se en cuen tra disponible, de modo que ol sem foro procede a dism in u ir ol sem foro (enciende la luz roja), Uevn a cabo su s operaciones con ol recurso y luego vuelvo a encender la luz verdu. es decir, increm enta el valor del sem foro a fin de lib erar u bloqueo".
C re a c i n d e u n s e m fo ro

.Vacuralmente. antes de que un proceso est en condiciones de in crem en tar o dism inuir un semforo, y suponiendo que el proceso cuente con los permisos adecuados, el semforo debe existir. La funcin p a ra c rear u n nuevo sem fo ro o acceder a uno existente es la m ism a, s e m g e t, prototipada en < s y s / s e n . h> do lu siguiente m anera (se debe tam bin incluir en el cdigo m ente los archivos de encabezado < s y s / i p c . n > y < s y s / t y p e s .h > ) : m* Mger(kay_t Key, int nsons, ia : flags]; sem get retorna el idenrificador del semforo asociado con un conjunto de se mforos cuyo nmero es n sem s. Si key (clave) es IPC_PRIVA7E o si key no se encuentra y a en uso y adems en f l a g s se encuentra activado el bit IPC_CflEAT, el semforo ser creado. Lo mismo que en el caso de ios segmentos de memoria compartida y las colas de mensajes, p ara establecer los modos de

Capitulo 1 T : Semforos y colas de mensajes

acceso a i semforo r l a g s puede ser tam bin objeto de u n a operacin lgica de 0 b it 3 hi: car. ios bits de permiso, expresados en notacin ccsal. Obsrvese, sin embargo, que los semforos deben co n tar cor. permisos de lectura y de m odifi cacin en lugar de con permisos de lacrara y escritura. Los semforos emplean el concepto de modificacin en lugar del de escritura porque nunca en realidad se escriben datos a un semforo, sim plem ente se altera (o modifica) su estado mcreraentando o disminuyendo su valor. Si ocurre algn error s e n g e t reto m a - * y asigna a e r r n o u n valor adecuado. Si todo anduvo bien, reto m a al proceso que !a llam el identieador dei sem foro asociado con el valor de key.
NO T A
j h amadas a semforos Ce* 'PC System V en roalidsd operan sofcre un arreglo, o con junto. Ce m*oros. en lugat ce hacerlo soo'e solo do d'os. El doc-eo do esta expUcactfn, no oostsnte. es molificar try.am ten y presentar el rrtsriol -3 1 JoCtOr en tvear ce cubrir 'c-3 semforos n toda su co^ple^dad. '* fc sea que se trabaje con un ni co soentforo o cor. mochos af mismo tiempo, el errfoaue bs-cc e3 el mismo, cero resus la r s o rta r oue factor comcronda os semforos dai !PC System V vienen en corpxtics. Perw-aimerrte. considera cue la Interfax es nnecesariamonto compleja. y el \>Z =>OSW estandart una ir?eff3r ms simple pero igualmente coteote. a tratamiento que se efecta ce os ser^fiyos en este capitulo omite tambin su orr pi*o er. otras situaciones en as cuates un proceso ene muchos hilos de ejecucin, los orocetcs mu.t)T.!ct y ol empleo de semforos en tlicho contexto se encuentra mfis

and oci atanco tic o sa foro. La funcin se n o p 'ibr semforo) constituye el ncleo de las ru tin a s que involucran semforos. La m ism a realiza operaciones aobre uno o m s de los sem foros creados o accedidos por la funcin se m g e t. Su prototipo es el si guiente:
m t M c e U n t ta. itru ct J*nouf !) , unlflpec nopaj;

s e o i d es un identificador de sem foro previam ente retom ado por seinget; que vincula el conjunto de sem foros a se r m anipulado. n o p s es el nm ero de elem entos p resen tes en el arreglo de e stru c tu ra s semb u f al c u al a p u n ta s e c o p s . s e o b u f , d su vez. tiene ln siguiente estru ctu ra:
itru c t leesuf { ira rt s*_nut; saart ssa_5p; short s w _ f l g ;

/ Ku**ra d swiaforo */ / Operacin a LLtvar i caso "I ! Ire ic M o rc quo controlan /

>; E n las e stru c tu ras de parrn se m b u f. el elem ento seis_nufii es un nm ero de sem foro ubicado e n tre cero y n s e n s - 1 , en tanto sem_op os la operacin x realizar y s e n _ f Lg modifica con s u valor el com portam iento de semop s. El valor de sera_op puede se r tan to negativo, cero, o positivo. Si se~ _ o p es positivo, el recurso cuyo acceso es controlado por el sem foro resu lta liberado y el valor del respectivo sem foro se increm enta. Si sem_Op es negativo, el proceso q u e efectu la llam ada est indicando quu desea ag u a rd a r h a sta que el acceso al recurso requerido est despejado, en cuyo mc-mento el semforo era n u ev am e n te decrem entado y el recureo que-

Programacin en Linux

d ar bloqueado a fin de que pueda 3e r utilizado por el proceso que efectu la llam ada. Si sem _op vale cero, finalm ente, el proceso que efectu la llam ada se blo q uear (aguardar) h a sta que el sem foro pase a v aler cero: 31 ya se encuen tra en coro en ese momento, la llam ada recom a inm ediatam ente se m _ flg puede ser IPC_NOWAIT OVO ESPERAR), que exhibe el comporta miento ya descrito anteriorm ente (ver E scritu ra de un mensaje a una cola"), o SEM_UiSDO 1 DESH.ACER), que significa que la operacin realizada deber ser revertida a su estado original cuando el proceso que llam a semop termine.

c i t m9 l o

lado por el sem foro recin creado jo e n cu en tre desbloquod') o disponible: / tonbr* oel progr*a on :nter-iot: nkaoni.c / /
crear irrm faro.c Croa y docrcrrntJ un r.mrai'orc
I in d u d * < * y s/ty so n .h > r c lu d e < *y i/s.ac .h > U flc lu * < y i/ o .h >

melud*
in c U O o < 5 ta ia b .b > w t ta in (v o ld )

{
inc idantiricaflo^jOTafors;
in t o ta l.S M iu r o r o i * t i in t in d ica d o re s * *686; todos io s u s u ir ic s I s t r u c t saBDu- Ouf; Guanina a en a fo ro s c r e a r < I ern ch as do le c tu r a y e o d ilc a c io n para

/ Croar e l ser.aforo :on aerecnos ae lectura/nodiricacion para tocos los usuarias / idant:tlcaair_sonafQro - aengec^[W_PRIVATg, ?otal_s0nr<ro3, inoicaoores); ff iaontifcaaoc_wnaforo < 0 ) { perrorCsanget*); exittsXIT FAlLURSi;

>
prncfCSenaroro craado: idVn*. sanidj;
A sign ar v a lo re a a la e s t r u c t u r a J e p a tr n senDuf p ara setop /

aur ,n u n era _ s n afo ro s 0 ; u .c a e r a a io n x r e a l i z a r c a r o i t l r JCC8 S0 *7

1;

/ ' U n s o lo 36R gorc / in c r e a e n ta r o l s e n a o ro ,

:j*.corftg_:ndicaccr=-: - :PC NCNWn; /alar pe.-siticc */

81aquear 3: se llega a naxu.a

i f ( (s e n o p ( id a n tific a d c r _ s 6 o a fo r e , r .u f, tc :a l_ i6 T a fo r o 5 ) > 1 { c e r r o r C e n c p * ) ;

Capftulo 17: Semforos y cotas do mensajes

371

xittXIT/AlUBE);
srtw C ifics .*>;
I1 :( X :'_ S X C S 5 );

> La siguiente es la salida de una corridu d e c re a r _ s e m a f o ro. Los valores do loa dencadores que se vea pasiblem ente resulten diferentes on s u sistem a. 5*w*ws credo: S12
--------- S pftort v r j y j ---------------

SALIDA

Ky (IMNNM

icaid 5*2

e*r*r *urt_ li

pems SM

man* t

status

El ejemplo utiliza IPC_PRIVAT p ara aseg u rarse do que ol semforo sea crvado ta l como se lo requiere, y luego exhibe el valor retom ado por sem g e t , o se a el identificador de ese sem foro. La llam ada a semop inicializa adecuadam ente el semforo: Como slo so croa un semforo, sem jvjm e igual a cero Como el recurso im aginario no se eneunntra en uo (en verdad, cate sem foro no ha ido vinculado por *1 projproma con ningn recurso e s pecifico), c r e a r _ s e tr .a f o ro inicializa su valor u I , el equivalente a desblo queado. Al no ser requerida u n a conducta do bloqueo, el indicador S0m_f lg del sem foro se establece a IPC_NOWAIf. para que lo llam ada retom e de forma inm ediata. Finalm ente, el program a utiliza la llam ada a sy s ta m para invocar la utilidad de linea de com andos i p e s a fin do confirm ar una segun da vex que la estru ctu ra IPC requerida, de hecho exiate.
C o n tr o l y r e m o c i n d e s e m fo ro s

El lector ya ha visto funcionar a s s g c r l y s h m c tl. las ru tin a s que m anipu lan las colas de m ensajes y los segm entos de mem oria com partida. Tal como era dable de esperar, la funcin equivalente p ara el caso de los sem foros es s e a c t l . cuyo prototipo e* el siguiente rm SMC?l(utt iei2, int seas*, m : . uflion swur. arg); S e r id identifica el conjunto de sem foros que 3e desea m anipular. s e o n to especifica el semforo especifico en que uno se encuentra in teresa do. E ste libro no tom a en cuenta las situaciones en las que hay varios sem foros integrando u n conjunto, de modo que semnum (en realidad un ndice de un arreglo de semforos) se r siem pre coro. E l argum ento C"K3 accin puede ser uno de los valores de la lista siguiente: GETVAL: R etorna ei atado c o m e n te del semforo (bloqueado o des bloqueado). SETVAL: E stablece el estado co rriente de sem foro a a r g . v a l (el a r gum ento sem un se an alizar enseguida;. GE ID: R etorna el PLD del ltimo proceso q u s llam a semop -

>

>

372

Programacin en Linux

GETNCNT:

Hace que ei valor retom ado por s s r . c t l sea el nm ero de procesos aguardando quo el sem foro se increm ente; es de cir. ei nm ero de procesos a la espera de luz verde. Hace que el valor reto rn ad o por s e m c ti sen el num ero de procesos que estn aguardando p a ra que ei valor del sem foro sea cero. R etorna los valores corrientes de codos ios sem foros p re senci en el conjunto asociado con se ffid . Asigna a todos los sem foros del conjunto asociado con s e mid los respectivos valores alm acenados en a r g . a r r a y Establece es modo (bits de perm iso.'en ol semforo.

GE7ZCNT:

GETALL: SETALL:

IPC_fiMtD: Elimina el sem foro cuyo identificador es sem id. [PC_SET; I?C_STAT: Cada sem foro tiene u n a e stru c tu ra de dntos, se m d _ d s, que d escrita e n teram en te su configuracin y com porta miento. IPC_STAT copia e sta informacin de configuracin al miembro a rg .b u f do la estru c tu ra semun. S: 18 ru tin a s e m c tl fracasa, reto m a -1 y asigna el valor adecuado a la variablu e r r n o . Si on cambio tiene (sito, reto m a u n valor entero que puede se r GETNCNT. GETPIO. GETVAL p QETZCNT, ae^ n cul haya ido el valor de cmd que le haya aido transferido. Tal como ol lector debo do h ab er inferido, el argum ento semun desem pea un uipei vital en ln ru tin a so m e t. Uno debo definirlo en su cdigo fuente do acuerdo con loa lincam ientos do la siguiente plantilla; unton *tmin ( tr.: vaL; /* Valor pura SE T Y A L I .ruct ion:tl_38 *auf; / Bufor c !PC_srA / inncnod tftor? ln: nr-ay; r Buffer do ETall y SGtALL / );
E je m p lo

\ 11
|)

fgl
mj> uo

A >.-.tta a ltu ra el lector debera estar en condiciones do com prender la razn de mis qutijas respecto de quo la in terfaz de sem foros del IPC System V es dem asiado complicada p ara los sim ples m ortales. A p esar de esa dificultad el prximo ejemplo, e li ( n i n a r _ s e n a f o ro , utiliza la ru tin a s e m e ti p a ra eli m inar un sem foro del sistem a. A ntes de hacerlo se requerir ei empleo de crear_ _ sem af o r o p ara crear precisam ente ese semforo y luejjo em plear el deaticador del mismo como argum ento para la lnea de comandos de a iijn in a r _ s e m a f o r o . r V30bre ddi orografa en :n:erni: scU .c V r
aiirunar_j4.raforo.c - Vanipuiar y s iu in * .- un ser.aioro S n u x is : ei:nirar_3ar.fra iaantif lc.Wor ae 36iraforo
V

CaDitUO 17: Semforos y colas de mensajes

373

fiaeiuce *ys types.w fir-citd* <sy*/ i3C -* > #t*Klyae <sys sei..'i> #ir-ciw

L.Tt airfin t argc, cfla- *argv[|) { t i t idenUflcaoor_i*afor: t?{a^c ? 2) {


OutS(*W00 O iVP.O : * liB n r <ier:ifca<cr d 93nafaro>*>;

>

i3eufador_ncafaro *toi<ar?v(1])
r lB ir.ir 1 i34oro */ ((ctKJOtntlftcatfor.Mnfor*, . IPCJWIDII < 0) {
w r-3 P {-* c ti
ik

_*io *);

) #i*t (
0g!(*$MMro U fU M d O '):

tytc{*iocs > **i:t6!T_$uccSSi; > La salid a que produjo e L ic u n a r _ s e m a f o r o en mi sistem a fue la siguiente:
S ^ (crsr^i*af=ro

U a itzro cr 00 --------- im s r ^ r e A r n y ----------------

y
3 i*K*ee*i

i ic 5

mer kurt_*ali

Mriw

n9ejs i

status

> Jirir_ < ^ o ro W

Ssssrc elin u a flo


--------- S M U l n r t A . * r * y l ---------------

*{y

Sflia

W-flC

39TBS

PS8BS

StltUS

374

Programacin en Unux

Ei cdigo de e l i 'n i n a ^ s e 't i a f o ro sencillam ente tr a ta de elim inar un se mforo cuyo identificador !e os pasado en la lnea de comandos. Tam bin u ti liza una llam ada a sy s te m p ara ejec u tar i p c s s y confirmur as que el se mforo ha sido efectivam ente eliminado.

Lo que viene
E ste captulo ha completado n u estra introduccin al IPC System V con un anlisis de las colas de monsajes y loa sem foros. En el prximo captulo, Program acin de TCP/LP y aockets", el lector ap ren d er los fundam ento? de la program acin p ara redes. Lo protocolos TCP/IP y de sockots son los m s conocido* y m s am pliam ente utilizados p a ra realizar un IPC e n tre servido res (hasta) diferentes. Luego de quo concluya el prximo captulo, el lector contar con la suficiente informucin en su poder como para tom ar una deci sin fundam entada sobre cul de loa diversos meconismos de IPC so acomo da mejor a tu - necesidades,

) ) ) ) ) ) ) .) ) ) ) ) ) ) ) )

I m i mi

- u m m U n M - " * ................................................................... ............... ..................

Programacin de TCP/IP y Sockets


A m edida que la In tern et desem pea un papel cada voz m s centra; en la 30d e d a d y especialm ente en el m undo de la inform tica, casi toda aplicacin no trivial necesita incluir algn tipo de prestacin bsica p a ra el trabajo en redes. E ste capitulo cubre los siguientes u*maa:

Introduccin a los conceptos y a la terminologa de las rcde3 de compu tacin


La API Berkeley p ara socketa

Operaciones bsica* con socketa


Sockets p a ra UNIX Conceptos bsicos sobre program acin de TCP/IP N ombres y nm eros de redes Sockets TCP/IP Tbdos los program as de este capitulo pueden ser encontrados en el sitio Web n t t p : / / * w * . e c p . c o o / i n f o bajo el num ero de ISBN 0789722151.

378

Programacin on Linux

Conceptos y terminologa de redes


Para la mayora de la gente, las redes parecen funcionar como telfonos. C uan do uno efecta una Uamada telefnica, m arca un numero y se conecta directa mente con la persona con quien desea hablar. La3 frases que se em iten son transm itidas y recibidas en el otro extremo de la lnea en el mismo orden en que se las expres y, simplificando un poco, nadie m s puede escuchar su conversacin o incorporarse a la misma a m itad d e 3U desarrollo L*n telfono, en tonces. provee la recepcin garantida de su mensaje, lo entrega en el orden en que se lo emiti y no lo m anipula m ientras el m?mo e st en trnsito. De m ane ra Tinular, cuando uno hace clic en un hipervlnctdo de una pgina Web, el m is mo lo remito casi inm ediatam ente a la corraipondiente pgina vinculada. No hay paradas intermedias; la pgina no resulta corrompida o interrum pida. En realidad, 3iii em burro, las redc3 de com putacin no funcionan de manor tan impficable y eficiente. A diferencia de los sistem as telefnicos, que provoen un circuito directo en tre dos ubicacionos, laa redes de computacin tr a bajan siguiendo un esquem a de alm acenam iento y posterior rem isin, deno m inado en la jerg a inform tica conm utacin de paquotej.. Quien origina el rcensajo onvia Ion datos en forma do bloquea de tam ao fijo, denominado paquetes, al interm ediario m s cercano, denom inado enrutador. El enrutwdor exam ina cada paquete quo a m b a a fin de d eterm in ar si m antenerlo o retransm itirlo. El en ru tad o r transfiero los paquetes quo debe conservar h a cia -ju propia red, y por el contrario rem ite los paquetes quo no debe conser v a r hacia el siguiente en ru tad o r situado a lo largo de la lnea, donde se vuel ve a rep etir el proceso de dedain e n tre alm acenam iento o ulterior remisin La figura 18-1 ilu stra la m anera en que tra b a ja la conm utacin de paquetes
P a c M f-S w if-o d N a lw o w s

F ig u r a 18.1. La manera en que viajan los datos por una red de conmutacin de paquetes. La figura 18-1 re sa lta la m anera en que viajan los datos a travs de las re des de conm utacin de paquetes (m ostradas en la p arte superior de la figu ra; y aquella en que lo hacen por las rodos de conm utacin de circuitos (mos trad as en ia p a rte inferior). rc i_ r e d . com y s u _ r e d . n e t rep resen tan dos redes de re a local que se en cuentran conectadas a la Internet. Como se

C a c i t o 18: Programacin de TCP/IP y Sockets

379

puede ap reciar en ia figura, en u n a red de conmutacin de paquetes, los enrutad o res de n i _ r e d . c c r y s u _ r e d . ne t transfieren su s datos a la red y to m an de ia m ism a ios datos destinados a sus redes locales. Esto est repre sentado por las lneas oblicuas con flechas en ambos extremos que conectan el ujo de dato3 a travs de 13 Internet a las redes lccaics conectadas a la m ism a Los datos des tinados a otras redes son sim plem ente transm itidos ai siguiente enrutador. Por el contrario, u n a red de conmutacin de circuitos croa u n a conexin directa en tre m i_ re d . con y s u _ re d - n e t. Aunque pueda haber puntos de conexin entre ambas redes, como esta indica do por loa pequeos cuadros de la figur;i. las mismas se comportan ms como cruces de vas frreas que como intersecciones de trnsito automotor. Los da to? ol tren que circula por la -.ia rreaj pasa por los puntos de conexin sin interrupcin rumbo a su desuno. En una red de conmutacin de paquetes, en cambi, t i l m o on !a Internet, le datos deben pasar por v an as otorsocciooes enrutadores). La ru ta que toma cada paquete por la Internet est contro lada por el icam irudor. de manera muy sim ilar a la m anera on que la ru ta que sigue un automvil a travs de las transitadas calles de una ciudad est controladu, ul menos en parte, por los intersecciones que va encontrando. Adem s de la diferencia do operacin, la. redos de conmutacin de puquetes tienen o tras limitaciones. Primero, algunos de los paquotos se pierden. S e gundo. los mensajos largo* son desglosados n mltiples paquetes que pue den a rrib a r a diMtino on un orden rfifervntu al que fueron unviadoa, y cual quiera puede in terceptar los paquetes y a lte ra r su contenido. A posar de estos defectos, la conmutacin por paquetes funciona sumam ente bien por que la gente sum am ente inteligente quo dise ei hardw are y el software necesarios pora este tipo de transm isin do datos imagin m aneras de evitar o de resol va r con sencillez todos estos problemas.
NO TA

i'o s pa/rares acedas son s ^ i nrM para describir as coerocio'MS de lai reces as iQ.Tixl3c.y E > ss m nana cortiflrAOlci'V-nte *ooresimplirlcado psique 'a cea es pro.ee a 'ector a sutoenie informacin con para colocar la programacin pa-'S reces en un zemeao ler-ga sigrrficaco, sin acrunaro t m ivo tiempo 050 os satiies. Se r_ega zc' lo tan tener esto en c-enta a rreo:ca que se avaras con la ecnra ce tos rrrno. De manera srm'ar, un z&vj< ;w>de rozsr o superice ce la programacin oara reces. 4 :3 constituye jr- tena avnoJe^j que recuero demos ce aginas para poder
desarrollarlo 00 marera mcegf#.

C uando se an alizan los protocola ce red surgen constantem ente varios t r minos. las recias cordadas sobre cmo debern ser transm itidos los datos a travs de red. Se dice que un protocolo as ementado a conexin si tiene des extrem os dem dos, s; los dems usuarios no pueden irrum pir en la co nexin y si debe existir una conexin pre-via entre los dos extremos p ara que tenga lu g ar la comunicacin Un protocolo que carece de estas caracteristicas es considerado sin conexin. Secuenciamiento significa que un protocolo garantiza que los datos arriben en el mismo orden en que fuere a enviados. Un protocolo tiene control de

I 380

1/ Programacin en Linux

) )) ) ) > J

errores si es capaz de detectar las corrupciones de daros, d e sca rta r los m en sajes corruptos y disponer la retran sm isi n de los datos corregidos. Las redes transm iten datos de u n a de das m aneras: utilizando bytes individua les de datos y utilizando paquetes. Los protocolos d* secuencia de caracteres realizar, slo transm isiones basadas en bytes, porque nicamente- pueden a d m inistrar secuencias de bytes. de m anera m uy sim ilar a los dispositivos de ca racteres de Linux y otros sistem as operativos. Los protocolos de secuencia de datos pueden dividir largas secuencias de bytes a los efectos de su transm isin ms eficiente, pero los mismos estn secuenciatlns, o que significa que arrib a rn en el mismo orden en que son enviados. Los protocolos de secuencias de da tos son conocidos tam bin como protocolos confiables porque adoptan significa tivos recaudos para garantizar que los mensajes transm itidos por la red sean entregados intactos o se notifique al rem itente que durante el trayecto ocurrie ron uno o m s errores y que el mensaje debe de s e r reenviado. Los protocolos basados cu pcqtutlea, a su vez, crean envoltorios (paquetes) de da tos de tamarto fijo y arbitrario. Estos protocolos desglosan el contenido de sus pa quetes cuando proceden a enviarlos, y nicamente entregan paquetes completos. Con estos trminos en mente, resu lta relativam ente simpte clasificar !u mayo ra do los protocolos de red. incluyendo TCP/IP, el protocolo bsico do Internet, y el IPC local 'conocido anteriorm ente como sockets de UNIX), en una de do3 categoras. Los prutocolw de dataginm a, tales como el U D P (L W Datagram Protocd), e3t<in basado en paquetus, que son sm conexjn, r.o sccuenciados. y no ofrecen control de errores. Los protocolos de secuencia de ccmrtcrvr,. por ol con truno, estn orientados a bytes y ofrecen tanto secucnciamiento de datos corno control do errores. TCP {Transmissiort Control Ptvtocol). constituyo un ojemplo clsico de protocolo do a n u e n c ia do caracteres:

La API de socket Berkeley


D ada la inm ensa vunudad de protocolos de red existonto, la perspectiva do tenor que aprender una interfaz do programacin diferente cada voz que uno quisiera ap ren d er a u tilizar un nuevo protocolo resu lta sin dudas d esalen ta dora A fortunadam ente, la API de socket Berkeley, denominada socket Berko ley en razn de que se hizo popular en las versiones BSD de UNIX, fue dise dada para funcionar con u n a diversidad de protocolos de red y pura proveer un. nica interfaz de programacin p a ra uso de los program adores de red E3ta generalidad de uso introdujo complejidad adicional, pero esta compleji dad es un pequeo precio a pagar por no ten er que- ap ren d er las interfaces * bajo nivel p ara AppleTalk, AX.25, IPX, NetRom. local IPC y TCP/IP Este captulo utiliza los sockets B erkeley p a ra p rogram ar tanto en POSIX local IPC, que opera 3lo en una com putadora aislada, y TCP/IP. que perm ite co m unicarse e n tre si a m uchas com putadoras a travs de la In tern et. La estru c tu ra do datos fundam enta: de la API de socket Berkeley es la es tru ctu ra s o c k a d d r (direccin de sockel), que alm acena u n a direccin de red, ol requisito m s esencial de cualquier protocolo de red. E sta e stru c tu ra esta declarada en s y s / s o c k e t . d e la siguiente m anera:
s trje t scckjacr {

>

).

Captulo 1S: Programacin de TCP/IP y Sockets

3S1

unsiyeti sort i r t sa_faBy; ciar sa_3atai4i; >; sa__f a a i i y describe el tipo de direccin alm acenada Csa = stored address), m ientras que sz_ 3 a ~ a contiene la direccin concreta. s a _f 3m lv es tpica m ente u n o de los valores listados e n la tab la 18.1. Tabla 18.1. zc~- s s de drscc-c^es sockets Familia de Familia de Descripcin direcciones Protocolos Socxets de entorne UNIX PFJJNIX AFJJNXX Ar_IMET ?F_INET TCP/IP (V\arai6n 4) Protocolo A X 25 para -gdosneionodos AF_AX25 P=_AX25 PF_IPX Protocolo Novall IPX Ar_I?X PF_APPi.ETALK Protocolo Aotfeaik DOS af _ appletalk Les dos protocolos que an alizar e ste captulo son AF JJN IX (lo mismo que F LOCAL), quo cubre los sockets de entorno UNIX, y AF_INET. el protocolo TCP/IP. NOTA
La .i5*.3 corrofeta . '5 0 C k e t . h > .

protocolo y

do direcciones atrtiUdos m raHa en < 3 y o

| Fundamentos de los sockets


Las operaciones bsicas con socketa abarcan la creacin, ap ertu ra, cierre, lec tu ra y e n tu r a de loa miamos. G racias al reconfortante hbito de Linux do tra ta r * todo como s: fuese un archivo, uno puede utilizar las m ism as funcio nes de E/S pura loa sockets que las que se em plean con archivos nrmale. Pa encontrar . r. fcrve arisia 4e -a to rra er cuc trato Unu* ios archivo*, ver *Carctersteas y concepto*,* sagr-o 132. Las funciones de E/S (re a d , w r i t e y as siguiendo) tienen u n a sem ntica especial cuando son aplicadas a sockets, la cual cubre este capitulo, pero on todo lo dem s la interfaz es idntica l\)d as las funciones de sockets req u ie ren incluir en el cdigo fuente de los respectivos program as tan to el archivo de encabezado < s y s l S o c k e t .n > como el archivo do encabezado correspon diente a cada protocolo. C re a c i n d e u n S o c k e t La nica operacin especifica p a ra sockets es ia funcin S o c k e t , que se u ti liza p a ra cre a r u n s c c k e t . S u prototipo es ei siguiente: iflt *oclcK(int de*aifl. ir.: typa. inr protccol); La fjn c i n s c c k e t crea uno de por L o menos dos sockets utilizados p a ra es tablecer u n can al de comunicacin entre dos procesos o sistem as que deseen intercam biar datos.

382

Programacin en Unux

tfo n a in especifica qu protocolo de red utilizar. Este corresponder a una de las fam ilias de protocolos de la segunda colum na de la tabla 18.1. 't y p e establece la categora del protocolo, o sea si se tra ta r de un protocolo de secuencia de caracteres o de un protocolo de datagram a. No todas las clases de comunicacin se encuentran disponibles p a ra todas las familia de protocolos p r o t o c o i indica *1 protocolo a ser utilizado. P ara los propsitos de esto libro el valor del argum ento p r o t o c o i ser siem pre C , indicando que se emplee el pro tocolo por defecto, que se base en los argum entos dom ain (familia de protocolos) y ty p e (secuencia de caracteres, datagram a y asi siguiendo) suministrados. En la tabla 18.2 se sum inistra la lista de tipos <le protocolos aceptados corriente mente. aunque on este captulo slo so com entar el socket SOCK_STREAM,
Tabin 1 8 .2 . Tipos de Socket Berkeley._______________________________________
U p o de aoekat Descripcin___________________________________________________

SOCK_STflEAM
SOCK_CGHAM

Acepta secuencias de caracteres (strooms) orientodoo o conexin, secuencladoa. con control Jo errores y ful dupox.
Acepta mensajes sin conexin, sin orden secuencia!, orientados a paquete no datos de tamnrto fijo.

SOCK_$OPACKET Acepta transmisiones do paquetes secuonclados, fuit dupiox y onn tados n conexin, pero ol receptor del poquete debo oer un paquete completo on cada llamado a la rutina de slstoma roa. SCCK flAW Esta disonado para proveer acceso do Dijo nivel a nivel do protocolo. ti cdigo doo sor redactado de modo de procesar los dalos segn seno las especificaciones del protocolo. No se recomienda a los que sufran dot corazn . . . Acepta la transmisin de paquotas orientada a cor.ox.6n, pero no se garantida quo los dntos sern recibidos en el ordon debido.

$OCK_ROM

Si el socket es creado exitosam ente, S o c k e t reto m a u n descriptor de arch i vo vlido p ara se r utilizado on tas operaciones de E/S subsiguientes. En caso de error, retorna -1 y asigna a la varinblo e r r n o el valor adecuado p ara indi car el problema. Los posibles valores de erro r incluyen los siguientes: EACCES: El proceso que efectu la llam ada carece de los perm isos nece sarios para crear el socket requerido E sto cieno lu g ar si el proceso no cuenta con suficientes permisos de directorio o si los procesos do nivel de usuario (en contraposicin a los procesos root) no cuentan con p er miso p ara c rear un socket de las caractersticas especificadas en ty p e o p ro to c o i. EINVAL: E3te erro r tiene lugar debido a que el proceso que efectu la llam ada requiri un protocolo desconocido o porque el kernel no adm ite la fam ilia de protocolos especificada en d o m ain . Esto a menudo pro viene de un erro r de tipeado. EMFILE: Se genera cuando la tab la de archivos del proceso est llena y no se pueden cre a r m s procesos. E ste error indica la presencia de un sistem a m uy recargado. ENFILE: El kernel carece de suficiente mem oria como p ara crear las es tru ctu ra s de apoyo necesarias para poder adm itir otro socket. ENFILE generalm ente indica la presencia de u n problema serio en el sistem a.

Captulo 1$. Programacin de TCP/IP y Sockets

383

ENOBUFS o ENOttEU: El sistem a (nc -el keroel) no cuenta con ia suficien te m em oria como p a ra crear la estructura requerida. Aunque 03te pro blem a no es ta n sen o como el que existe en el caso de cNr IlE , en el mom ento en que ocurre el mismo el sistema no se encuentra funcionan do a todo su potencial. EPROTONOSUPPORT La fam ilia de protocolos especificada en dOttain no adm ite ya sea el argum ento sum inistrado para type o para p rotO C O l. o am bas cosas a la vez.
C o n e x i n a un s o c k e t

Aun cuando un socket ya haya sido creado, resulta intil sin a b n r conexio nes h a c a el mismo. Adems, el proceso de conexin ea diferente para ios procesos de servidor y p a ra los procesos de cliente Los proceso de servidor son procesos que reciben u n pedido de informacin, da toe. u otorgan a quien lo b a pedido algn tipo de acceso h a d a algn recurso o facilidad. De m anera correspondiente, los procesos de servidor, generalmente, crean un wckot y luego ag u ard an la llegada de pedidos de conexin por parte de Ion clientes o solicitantes. Los procesos diente, anlogamente, requieren del servidor que les provea informacin o datos va el socket. o envan un pedido, de nuevo a trav s del socket. de acceso a algn servicio que provee ol servidor. U n servidor, entonces, tiene ma trabajo que realizar que un diento. Pnme* ro. habiendo creado un socket, debe ligarse al mismo, lo cual crea una aso ciacin e n tre el socket y una direccin. En el caso de los sockets do entorno UNIX, e sta direcdn consiste sim plem ente de una ruta de acceso y un a r chivo (tal como se detalla en la prxima seccin) En el caso de un socket norm al TCP/IP, la direcdn es una direccin estndar de Internet (comenta d a en el ttulo "Programacin de TCP/IP". ms adelante en este captulo). D espus de h ab er ligado la condicin, un servidor debe permanecer a la es* cucha de una conexin, lo que significa que debe aguardar hasta que un d ie n te solicite una conexin a ese socket. Despuea de redbir el pedido de co nexin. el servidor habitualm entc acepta la misma; es decir, abro formal m ente la conexin p ara el d ie n te que lo ha solicitado y comienza a intercam b iar informacin con el m ^ m n a travs del socket. Las fundones para realiz a r una de las tareas necesarias del servidor se denominan in tu iti vam ente b in d (ligar), l i s t e n escuchar ) y a c c e p t (aceptar). Ei cliente, a su vez. sim plem ente necesita requerir una conexin al socket que h a sido abierto por el serv id o r De m anera igualmente intuitiva, el clien te utiliza la llam ada i sistem a connect p aja requerir su conexin ol socket en el cual se encuentra interesado. La g u ra 15*2 ilustra el proceso de cread o n y conexin a on socket tanto para un cliente como para un servidor. Como se puede observar en la figura 1S-2, el servidor controla el acceso del cliente al socket por medio de a llamada 3 a c c so t. No existe ningn re querim iento de que el servidor deba aceptar el pedido de conexin de un d ien te.

Programacin en Linux

G o n ain especifica qu protocolo de red utilizar. E ste corresponder a u n a de las fam ilias de protocoios de la segunda colum na de la tab la 18.1. ' tyD e establece la categora del protocolo, o sea si so tra ta r de un protocolo do secuencia de caracteres o de un protocolo de datagram a. No todas los clases de comunicacin se encuentran disponibles p ara todas las familias de protocolos, p ro to c o 1 indica el protocolo a sor utilizado. P ora los propsitos de este libro el valor del argum ento p r o t o c o l ser siempre 0 , indicando quo se emplee el pro tocolo por defecto, que se base en los argum entos dom ain (familia de protocolos) y ty p e (secuencia de caracteres, datagram a y as siguiendo) suministrados. En la tabla 18.2 se sum inistra la lista de tipos do protocolos aceptados corriente mente, aunque on este captulo alo se com entar el sockct SOCK_STREAM

Tabla 18.2. Tipos de Sockct Berkeley.__________________


Tipo de sockot
SOCK_STAEAM SOCKJXJflAM

Descripcin____________________________________________
Acepta secuencias to caracteres {strsnms} or-eniodas a conexin, wcuenclatas, coa control do orroros y fuii dplex. Acoplo mensajes $in conexin, sin orden aecuonclal, onontados a poquotos de datos do tamao Ajo.

SOCK_SEQPACKT Acepta transmisiones de paquetea secuenciados, full duoto* y onen tacos a conexin, pero el roceptor dol paquete debe loor un poqueto completo en cada llamada a a rutina de sistema rnad S0CK_RAW Est disertado para proveer acceso de bajo nivel a nivel do protocolo. 1 cdigo d be ser redactado de modo du procesar los datos segn sean na especificaciones riel protocolo. No se recomienda o ios que sufran del cora/n . . . Acepta :a transmisin do paquetes orientada a conexin, pero no so garantiza que los datos sern recibidos un el orden debido.

S0C<_RDW

Si el socket es creado exitosam ente, s o c k e t retorna un descriptor de archi vo vlido para se r utilizado en las operaciones de E/S subsiguientes. En caso de error, reto m a -1 y asigna a la variable e r r n o el valor adecuado p ara indi c ar el problema. Los posibles valorea de erro r incluyen los siguientes: EACCES: El proceso que efectu la llam ada carece de los perm isos nece sarios p ara crear el socket requerido Esto tiene lu g ar si el proceso r.o cuenta con suficientes permisos de directorio o si los procesos de nivel de usuario (en contraposicin a los procesos root) no cuentan con per miso pora crear un sockct de las caractersticas especificadas en ty p e o p ro to c o l. EINVAL: E ste error tiene lugar debido a que el proceso que efectu la llam ada requiri un protocolo desconocido o porque el kernel no adm ite la familia de protocolos especificada en d o m a in . Esto a menudo pro viene de un error de ripeado. EUFILE; Se genera cuando la tab la de archivos del proceso est llena y no se pueden crear m s procesos. E ste error indica la presencia de un sistem a m uy recargado. ENFILE: El k em el carece de suficiente memoria como p a ra crear las es tru ctu ras de apoyo necesarias p ara peder adm itir otro socket. ENFILE generalm ente indica la presencia de un problema serio en el sistema.

Captulo 18: Programacin de TCP/IP y Sockets

383

E N O B L lF S o E N C U E V : El sistema (no e l kernel) no cuenta con la suficien

te memoria como para crear la estructura requerida. Aunque este pro blema no es tan seno como el que existe en el caso de E N F IL E , en el momento en que ocurre el mismo ol sistema no se encuentra funcionan do a todo su potencial.
E P R O T O N O S U P P C R T : La fam ilia de protocolos especificada en d o n a in no adm ito ya sea el argum ento suministrado para type o para p r o t o c o i , o am bas cosas 3 la vez.

C o n e x i n a un s o c k e t

Aun cuando un socket ya haya sido creado, resulta intil sin abrir conexio nes hacia el mismo. Ademas, ol proceso do ccnnxiOn es diferente pora 1m procesos de te id o r y p ara los proco ios de cliente. Los procesos do servidor 30n procesos que reciben un pedido de informacin, datos, u otorgan a quien lo ha pedido algn tipo de acceso h a c a algn recurso o facilidad Do m anera correspondiente, loa procesos de servidor, gene ramente, crean un socket y luego ag uard an la llegada do pedido# de conexin por parte de los d ien tes o solicitante*. Loa procesos clientes. anlogamente, requieren del servidor que les provea informacin o datos va al socket, o envan un pedido, do nuevo a travs del socket, de acceso a algn servicio quo provee el servidor.

Un servidor, entonces, heno ms trabajo que realizar que un cliente. Prime ro. habiendo creado un socket. debe ligarse al mismo, o cual crea una aso ciacin entre el socket y una direccin. En e! caso de loa sockets de entorno UNIX, esta direccin consiste simplemente de una ruta de acceso y un ar chivo (tal como se detallo en la prxima seccin). En el caso de un socket normal TCP/IP, la direccin es una direccin estndar de Internet (comenta da en el ttulo Programacin de TCP/IP*. ms adelante en este capitulo). Despus de haber ligado la condicin, un servidor debe permanecer a a es cucha de una conexin, lo que significa que debe aguardar hasta quo un chente solicite una conexin a ese socket. Despus de recibir el pedido de co nexin, el servidor habitualmenie acepta la misma; es decir, abre formal mente la conexin para el dienta que lo ha solicitado y comienza a intercam biar informacin con el mismo a travs del socket. Las funciones para realizar cada una de las tareas necesarias del servidor se denominan intuiti vamente b in ti ligar), l i s t e n (escuchar) y accept (aceptar).
El chente, a su vez, sim plem ente necesita requerir una conexin al socket que h a sido abierto por el serv id o r De manera igualmente intuitiva, el clien te utiliza la llam ad a a sistem a connect para requerir u conexin al socket en el cual se encuentra interesado. La figura 18-2 ilustra ei proceso de crea cin y conexin a u n socket tan to p ara un diente como para un servidor. Como se puede observar en ia figura 13-2, el servidor controla el acceso del d ie n te al socket por medio de la llam ada a a c c e p t. No existe ningn re querim iento de que el servidor deba aceptar el pedido de conexin de un cliente.

,,

> v

/ V

\l

}S >\ f - >' >' > >

> > }

'

'

'

384

Programacin en Linux

CU=N7

$E*VEW

cci : i)

^ correcto j

woac

ttooni) j

J a-xecM

ACnve jCCKfT

F ig u ra 18.2. Un cliente y un .servidor conectndose a un socket Las cuatro llam adas necesarias p ara o stib lo cer una conexin con un .ockct tienen ios siguientes prototipos:
if l t t > t n d ( ir t u c k t a , J f u c t jc c fc a d d r a d d r, a a cfclo Q ); * a d d rl n } u i t a c a r le n j ; i n t d d r lo n j;

irn

U )t n ( tn t

socKfs, nt

:n : i c c o t t l n :

if lC h 'd , t e r v e t lO C K a d d r a a d r , :n t

t n t CO flnct(U? c c x a , a t r e u t a o c k a fld r * a a d r.

Para cada una de las llam adas: s o c k fd [socket fdc descriptor) e el descriptor do archivo retom ado por una llam ada anterior a S o c k e t. so c k ad d r &, un puntero que apunta hacia una estructura de direccin do socket a d d r l e n es el tam ao de s o c k a d d r {advirtase que !a llam ada a c c e p t puede modificar este valor al retornar). o a c k la g define para l i s t e n el mximo nmero de conexiones pendientes que se perm itir ag u ard ar en cola en un socket dado antes de que sean co menzados a rechazar los pedidos de conexin adicionales. H istricam ente, este valor ha sido cinco, poro puede se r modificado. b in d , l i s t e n y c o n n e c t retom an 0 si tienen xito. Como de costumbre, si fra casan, retom an l y asignan &e r r n o el valor que sea requerido para reflejar el error ocurrido. La llamada a a c c e p t, sin embargo, retorna un nuevo descriptor de archivo que puede ser utilizado por el proceso aceptante {habituaimente un servidor) para sus operaciones de E/S utilizando las llamadas a sistem a w r i t e ja read . Si fracasa, accept retom a 1 y asigna el correspondiente valor a e rrn o .

I i

}'

"

C3c"u>0 $ : Programacin de TCP./IP y Sockets

385

NO TA
3- : a - a ?i ^ S i x sara sccfcets admita aJira s testaciones de segundac (concreta--c-'.b. r e c e r c a o s re*erWa$ a es frisaos, no se as cucre 3C-> eomue ai acoso de - -i* es sdc*e*s CS:x se eocuer-'/a astado de evolucin. 1.3 Mtpfementacin x< M rto ce r j* de :s -C osra POSix se encuentra rcempteta. Gran parte del mate .=. se i especmcac : * =CSUC e; ect.-.3^-e''te existe pero ir. muchos -ases las l ama ras y .e e s ta r a nueva *cfcaci ir- carecen se^ 3fi>o envoltorios do las a rd u a s 3.-3G3S ./roer'Jfl'ocss cor :a eseectfleadn 'clasica* cr^PCSiX. ero an, as sagi nas de -a n se encuertrar '0 S 3 n e n t. desaecua^adas.
-2 rsersrca oe prcgr*naon rf$5 s o ro -K J j i .a esDecficaor. IPC ce oqsix laconscn,ye a ser 3e ftcfwB S-*e\ns Vew/fr Prcffscvnr^. S el lector vatara Ce uilirar e C de ^ C S X OcOor teo *- en ros-ta --= el rrsrro tal vez oo se comeorta como uno 'o escervwla.

Sockets de entorno UN IX
Les sockets de entorno ITNTX o p eran slo en com putadoras aisladas, de mo do que se asem ejan mucho m s a pipc-5 con nom bre que a un protocolo de red. Las direcciones a la s cuales se ligan los .ocketa de entorno UNIX son archivos reales presentes en ol fileaystem . Sin em bargo, los sockots uo pue den -er abortos; deben ser accedidos utiiizundo la interfaz p ara sockocs.
C r e a c i n d e u n s o c k e t d e e n t o r n o U N IX

En la p arte L a API de socket Borkoloy". pAgina 38'2. el lector aprendi que la estru c tu ra sockaddr contieno on sus do* miembros el tipo y los d ato s do u n a direccin de red. Eso en realid ad fue una sobregeneralizacin. E n reali dad. dicha e stru c tu ra s o c k a d d r el formato general. Todas las familia* de protocolo* cuentan con su propia vorein de sockaddr especfica p ara cada entorno. La estru c tu ra s o c k a d d r p a ra los sockets de ontorno UNLX ao e n cu en tra definida on < s y 3 /u n .n > d e la m anera liguiente;
$t<vct

*9Zkmar_ie

{
/ AFJJNtX / / ?atniau /

uslSn*fl m or ! A t lu f i.f a a iiy : cna r w.n M tn ( tC 8 1 ;

1; P a ra c re a r un socket de entorno L'NX. s u n _ f a m ily debe ser p u esta al va lor AFJJNIX. A su vez. s u n _ p a tn contiene el nom bre del archivo quo ser utilizado como socket. El socket se liga al archivo por medio de la llam ada a b i n d , ta l como uno lo esperara, pero el archivo es creado recin cuando se llam a a D m d . Si el archivo ya ex istiera b in d fracasa, asigna a e r r n o el va lor EAD0P.INUS5 direccin spe rada en uso) y reto m a - * al proceso que efectu la llam ada. El macro SUN_LEN\ tam bin definido en < s y s /u n .h>, re to m a el tam ao de u n a e stru c tu ra de patr n SO Ckaddr_un. Les pru^-ramas c r e a r _ s o c k e t y c c -n e c ta r _ s o c k e t que /ienen a contm uac n ilu straran el mtodo correcto conque se puede abrir un socket do servidor y un program a d ie n te puede conectarse al mismo. Preste especial atencin, sin embargo, a cmo tanto c r e a r _ s o c k e t; como c o n e c ta r _ 3 o c k e t deben asignar provisoriam ente (cast; i su e stru c tu ra de protocolo s o c k a a a r_ u n on patrn de estru ctu ra sockaddr genrico p ara cada llam ada que se efecta a !a interfaz de la corresa>ndiente APL

Programacin en Linux

E je m p lo s

Los siguientes program as de dem ostracin. c re a r_ S O C k e t y c o n e c t a ^ _ s o c k e t . ilu stran las operaciones bsicas cor sockets de entorno UNIX.
f JMPLO

1 c r e a r _ s o c k e t crea, liga, queda a la oscucha y acepta conexiones a un aocke: de entorno UNIX.


/ Scrofcr* flel prograna en In ta rrat: r.Ksock.c */

ac<t
I

?r*ar_sockt.c - Crear y lig a r .in jo c M t. Sintaxis; croar socket nOTfir

ae

Incita* <syj/cckf f> *includ <*ys/un.n Lnclud* <stdliC.n> inelude <3tdio..'> inelud* noipor.n*

int M in (U U arge, Cur argvU)


i

lnt attcriotor_5ock#:;
s t r v e t C K a d a r _ u n a:ruc_sorvldor; s o c k ln _ t t i n u i t o j j t r a c c i n ; / Estructura d soexot n i s e r v id o r /

/ 84( aguarda cono arounrnto de ia lin o do ccaandos el no*r d#l sockot /

tf Urge I 2} {
putaCWOO CE MPLEO: er?r_socho: <nonbro do socket*); u:{E X tT_?A :iuftet;

)
/ Croar el sockt / if((aescripzor_socKe: = sccaetlPF.'JNIX, SOCX_STAEW. &|) < 3) 8rr_quit(*aoc<6f}; / Definida en neipar.n e mplsaertsca e halpar.cl

/ in ic ia lU a r y estaoiecer la estructura del servidor v nefsaciistrLC.ssrviaor, a, jlzeof<$truc_serviaor)>; itruc_5ervinor.suft_faiii.ly = J ttlX ; itrncpy{stri;!:_S3rvidor.5un jjatr., a rg v ftj, / Ligar e l socket a una Srece ion / l*:(Difld(descriptor_socket, (stn jct 3ockaodr Ssrruc servidor, SH_LN(istruc_lrvdor|)) < 0)

sleof(StruC_srvidor.si)njiatn)J;

arr_5ui~rbl^d >;

Caclt-jio 18: Programacin de TC P /IP y Sockets

387

i^-arsa- por la i corencftsi jj arrisen */


r f(( U s t * n (a * a c r ip to r jM c k * C . 5 |) < !

priflt? *Soce: 3iiOO', :3'.#. Ss'n*. iti-jc_3srvidor.sun_patfi};

* W

.r r

jf U f o i n f i n i t o , acepta.vJo ttxJas l a s co n e xio n es f

Sescriotor ccxer. (s tru a t 3ocaccr *;&srv, \ (amalo sirqccion)

)
x t s C '.a 'iiva c:* * i:n fa o H abilitada ! i

x it< X II.S U C C S S );

> c r e a r _ s o c k e t acepta u n nico argum ento, el nombre dol s o c k e t u ser creado. Ei program a prim ero llam a a socket a fin de crear un aocket do en torno UNIX (definido por el argum ento PF JJNZX) orientado a aecuencias de caracteres tal como lo estipu la el arg um en to SOCK_STREAM) y que empleara el protocolo por defecto De*pu de m icutltzar la estru ctu ra s t r u c _ s e r v i c o r , c r e a r _ s o c k e t establece la fam ilia de sockets a AFJJNIX y copia la direccin dei aocket al miembro s u n ^ p a th de la estru c tu ra S tr u c _ $ e r v i d o r. Luego, la llam ada a btr.d procede a asociar el descriptor do archivo d e s c r i p t o r _ s o c k e t con el socket d escr.pto por s t r u c _ s e r v i d o r . Obsrvese que s t r u c _ s 0 ''v t d o r fije d eclarad a como u n a e stru ctu ra de pa trn so c k a d c r_ u n . ia e stru ctu ra requerida p ara loa sockets de entorno UNIX. P ara prevenir eventuales advertencias del compilador, e le asigna tem porariam ente m ediante una operacin d e casting un patrn de e s t r u c t u r a s o c x a d d r ( s o c k a d d r *) de modo de corresponderse con ol prototipo de bind. Finalm ente, ia llam ada a listen seala que el servidor e st aceptan do conexiones a ese socket, y la llam ada a a c c e p t perm itir indefinidamente efectuar nuevas conexiones a dicho socket h asta que a c c e p t retom e una condicin de error o h a sta que el program a sea term inado de alguna manera. El archiva de encabezado h e l p e r . h y su. im plem entadn, h e l p e r . c, incluyen fundones de utilidad que emplean todos ios program as de este capitulo. Su ra sen de ser t s cortar los listados de cdigo fuente- Tanto cre a r_ S O C k et como c o n e c ta r _ s o c k e t utilizar. La funcin e r r _ q u i t , que llama a perror con el mensaje espenficaco en a s g y luego term inan el programa. La definicin rfe e r r _ a u i t es la siguiente: voi *rr_3vi:(chsr asa) {

3S^

i I K y , ; . ro&.omo^ion en u n u x

.1

>

lii

2. c o r;e c T a r_ so c k e t conecta loa procesos al socket. atendido por c re 3 r _ s c c k $ t.


: T Ncnfcre s e l prc-gr&na en I n t e r n e t : o c k c o n r ..: /

/
E JE M P L O

archivo

c c n a c t= r _ 3 o c k e :.c C onectar a un s o c k e t. S i n t a x i s : co n e c ta r so c k et itoore j ?

-.r-cljde <3ys/jc-:'<st..,i>
ic lu d e < s y i/o n .h # u jc iu d e < 3 td iib .n > 'in c lu d e < s t ia .h > r c l u d a iia lp e r.n *

uit *>3in(ln? argc, cfcar *argv[f|

{
i r t ascrlptar_oc<(4t; irru c t ockad(Jr_un 5truc.cU*itto: wcxLen_t ta-iartojlirccion; Jtruc_clt#nre / / Estructura co socket a proceso cliente

/ tnitarto aol nioit&ro nockasdr C# estructura

So aguarda cono argunonto to 14 lin o * do conancos o l nonbre Col socket / I- 2 ) (

if(a rg c

putiCWCCO 5E EMPLEO; conectar jio c u o t JOJWre de xrcnivo>"}, xlt{X:T_FAllu):


i

! Crear ol socket /
L f ( | l d n t i i , ica<jor_socK et * s o c S M t(JfjjN [X , 30CK_smEAV. a j ) ' a ) e r r j j u i t j 's o c M * ) ;

/ In ic ia l izar y astaalecor ia estructura de: cliente /


< t t t & 5 t r u c _ c iia n r e , , s u eof ( s v r u c _ c l i e r t l ) ;

3t'*uc_clienta.3iin_fa.Tl y = A F jjM X ; 3tmcpy{strc_cuante.3(in_path, a r g v [i), s ueof(strc_clie nto .sun j>a tn));

) ) )

*
389

Captulo 13: Programacin do TC P /IP y Sockets

C o o e c t r n ioc't * zsaaojiirecciQf'. * SUK_l9(Kstnjc_cien-:ei;


if(c c m e c * o s a c r io to r .c c k e t, s t r - j c - s o c ic a d d r * ) 4 $ t r > j c ^ C l e r : e ,

is*sAo_airicc:jni

*,'_3vjit, ccnr2c:*);
p c ir . t f - C I s ttt* co<-!:tj5o = iocKe: \ s \ n \ $ tru e _ c li9 n te .s n j c n );

? n i 0C IT_3OCCSS);
La configuracin o c c n e c t a r _ s o c k e t es ia m ism a que la de c r e a r _ s o c k e t: crear u n socket y poner algunos valores en su estructura operativa. De hecho, los procesos dien te tambin pueden utilizar p ara ligar la direccin local u n a llam a da a t i n a , pero esto es opcional porque los clientes habitualm ente desean conec tarse a un socket remoto. En general los clientes descartan la direccin local. La llamada a c o n n e c t liga el descriptor de archivo d e s c r ip to r* _ so c k e t dol d ie n te con el socket abierto por el servidor, que es transiendo corno argum ento en la lnea de comandos de c 0 n e cta r_ 5 0 c< e t. La salida de estos dos programas se ilustra en la figura 18-3.

F ig u ra 18.3. Tren dienten conectndose a u n socket de servidor. En ia figura 18-3, la x term de la izquierda est corriendo el program a dol servidor. c r e a r _ s o c X e t, y se halla a la escucha en un socket denom inado l p e - s a r p l e . E l program a cliente, c o n a c t a r _ s o c k e t , fue ejecutudo en cuda u n a de las tres xterm s m s pequeas de la derecha. c r e a r _ s o c k e t informa sobre cada conexin exhibiendo su leyenda de nueva conexin h a b i litada cada vez que acepta u n a n u ev a conexin. C o n e c ta r _ s o c k e t, de m a n era sim ilar inform a las conexiones al servidor exhibiendo la direccin (en este caso ei nom bre; de: socke: cada vez que se conecta cor. xito.
O %/ E je m p lo

i / =7 E sta ejemplo m uestra qu sucede cuando uno tra ta de a b rir u n socket que se L1=1 en cuentra en U30. El ejemplo considera que ur.o ya ha creado el archivo de e je m p l o socket I c e - s a n l e y se ha conectado al mismo corriendo los dos prim eros

390

Programacin en Unux

program as de demostracin. Luego el comando de Linux rm elim ina ol archivo lp e - s a n p le y se vuelve a correr el program a c r e a r _ s o c k e t : . Is -1 iD e-sanpLe j m r -x r -x i k iir t jn ll usars < 5 *uc 17 18:29 lpe$aripla=
l ./ c r* a r.K < e t Ipa-sanpie eirtd: Mdress arady i vsa S ra lpe-3aipie I ./crearjccX e t lp-3anpl Scchat disconible: lpesarole

La llam ada a b ln d fracas porque ol sockot se encontraba en uso pero, iuego de elim inarla, la llam ada a D in a tuvo xito y el servidor dio paso a su lazo infinito de aceptacin de conexiones
L e c tu ra y e s c r itu r a d e u n s o c k e t d e e n to rn o U N IX

Tal como fue enmontado al comienzo del captulo, p ara leer y escribir en sockets uno puede u tilizar llam adas a sistem a e stn d a r d<* E/S El procedim ien to es directo. El proceao que llam a a nccept utiliza el descriptor de archivo que retom a a c c e p t para E/S. Lo procesos que llam an a c o n n e c t, g en eral m ente procesos cliente:, u tilizan p ara P7S el descriptor do archivo retom ado por la llam ada a s o c k e t.
J E je m p lo

Este ejemplo m u estra una m anera do leer y escribir sockets de entorno UNIX. Dicho de m anera sucinta, el proceso quo escribe copia su e n tra d a es t n d a r a un socket. m ientras quo el proceso que leu copia los datos ledos df-.xle el socket a su en tra d a estndar. e s c r i b i r _ s o c k e t es el proceso que ascnbe, o cliente, y L e e r_ s o c k e t es el proceso lector, o servidor. P ara lograr que el cdigo resulte algo m s simple y sencillo de seguir, he L p e r. c defineuna funcin, xf er_data (transferir datos), que* copia datos e n tre los dos descriptores de archivo. La mism a se e n cu en tra declarada er. el archivo local de encabezado nelper.h. La definicin de xferjJata es la siguiente: voia <fer_3ataiint srcfd, :nt tgtd) i
:nar sur[102*1;

int COnt, ien;


r
L3r a e w * 1 ir c h i v o ce e n tra d a y a s e n t i r a l s re n iv o Oe s a lid a / > ej (

v * n il# ((c n t = r e a o js r c f d , c j f , s i 2 e o f| 0 u f > n

'lien < a)
e r r j q u i t i n e lp e r.c :x f8 r_ ca ta :re a c* |;

f|{l*n = ritetgtfs, au*, crt)) r* :nt) err_quitf, h6lper.c:xfer_aata:wrvt); >

Capsulo 13' Programacin de TC P /IP y Sockets

391

E s ta fun cin ie e c u a lq u ier e n tra d a quo pru-.-enga d el arch ivo d e en tra d a c u y o d esc rip to r e s s r c f d so urce f ile d e s c rip t o r y lu eg o la escrib e in m e d ia ta m e n te ai arch ivo d e s a lid a cu yo d esc rip to r e s t g t d (descrip tor de archivo d e ta r g e i). S i y a s e a r e a d o . v r i t e lle g a n a to p a r se con un error, la funcin r e to m a . P a ra u tiliz a r e s ta fu n cin , a a d a la ln e a S i n c l u d e ' h e L p e r .h ai cdigo d e fu e n te d e l program a d on d e l a v a y a a u tilizar. L os d es s ig u ie n te s e x tra cto s d e codigo m u e stra n as m odificaciones n ecesarias p ara co n vertir el program a d e servidor, c . " e a r _ s o c k e t , y al program a d ie n te-. c o n 3 c r a r _ s o c k e t . en procesos d e le c tu r a y escritu ra, resp ectivam en te P rim ero, a ad a la sig u ie n te d eclaracin a l com ien zo do c r e a r _ s o C K e t tn t SMCristcrArcnvoCatoa; L u ego, r e em p la ce la s ln e a s 4 0 a 45 d e c r e a r _ s o c k e t . c con la s sig u ien tes: r * tp tir la p r tftr i enea ion <ju ir r .e e */ i f l&criatorArcniviCato* * accptKJJcrlotor^icc**:, <itruer iccuntidr ')j,trucw rvidor. 4:wirtC_5irKCirJ j > ai CJfciU (Xma conaxian r* atdo n je iiit ia a * !; * u r i 1 ircMvo tntra 3* u t o y tscrb ir 4 itaout / xfe-_3I*a(0tcrict0rArcnio04t0J, f :U<iO(t*lout>, E n lu g a r e r em itirse sim p le m e n te a a c e p ta r cu a lq u ier con oxin q u e Ih se req u erid a , e! n u evo cdigo a cep ta slo ia p n m e r con exin , y lu ego ilurna a x ' e r _ d a t a p ara leer loa d a to s e n t r a n te s d e sd e el sockot, id en tificad o por d e s c r i p t o r A r c n i v o D a t o s , y esc r ib ir lo s a s t d o u t . F in a lm e n te , a a d a el -.igu ien w cd igo j u s t o a n te s d e la se n ten cia e x i t del p rogram a C o n e c t a r _ s o c k e ? . c : / Cssiar j ta i .1 ai arcnivo Ce sc*9t / tfa r _ 3 * ta (fi!w o (jtiifl). dsc-ipTor_jackti. .-.t* cd igo ad icion al le e ia e n tra d a de^d* S t d i n y la escrib e il archivo lig a d o a l so c k e t. Los r e sp e c tiv o s arch ivos m o d ifica d o s e s t n d isp on ib les en ol s i tio W eb d e e s te lib ro bajo loa n om b res r d s o c k . c y w r s c c k . c . P ara correr e s to s program a?, ejecu te r'OSO'Ck en u n a xterm o consola virtual, y lu eg o in icie w r s o c x e n otra ven tana. C a d a v ez q u e e oprim a Intro. las ln eas d e tex to in g resa d a s ap arecern en ia v e n ta n a d on d e est corriendo r d s o c k . La sa lid a d e d em ostracin d e estos p rogram as s e ilu stra en la figura 18-4.

F ig u r a 18-4. Lectura y escriture de oche!s de er.zomo UNIX.

3^2

Programacin en Linux

>

>

>

En ia figura 18-4, el proceso lector/servidor, r d s o c k , est corriendo en ia x te n n de la izquierda y el proceso escritor /cliente, w r s o c k . se e s t ejecu tando en la r:e rm de !a derecha. Como se puede ap reciar en la figura, cada linea de texto tip ead a al proceso escritor aparece en ol procoso lector cada vez que ge oprim e Intro.

Programacin de T C P / IP
T C P/IP es e protocolo (en realidad, !a fa m ilia de protocolos) que opera ia In tern et, la m ayor red de com putadoras interconoctadas del m undo. L a ver sin actual de este protocolo es !a 4 IPv4), pero ya h a comenzado la tra n si cin a ia versin 6 (TPv6). Laa especificaciones existentes en las prep u estas actuales p a ra CPv$ h a n sido in teg rad as en loa keraeJs de Linux de la versin 2.2.a. Dado que el nuevo protocolo no est an muy extendido, sin embargo, e sta seccin cubre cu su lugar IPv4. Como 30 destac al comienzo de este ca pitulo, la program acin para redea os u n tom a im portante sobre el cual han sido escritos m ultitu d de libros. Sin embargo, uno puede de hecho red actar program as con prestaciones de red utilizando menos de 10 funciones.
N m e ro s d e red

Entes de sumergimos en la programacin de redes en s misma, resulta im portante .ieilahr quo ei protocolo TCP/fP os de tipo b ig ^n d ia n ; es decir, al macena el bit ms significativo do tos nmeros multibyte en la direccin de memoria ms baja. Muchos computadoras aon tambin do tipo big-endian.
Sin embargo otras computadoras, tales como las que utilizan procesadores In tel x86. ion de tipo little-endian, lo que quiere decir que en los nm eros mul tibyte el quo se almacena en la direccin de memoria m s baja es el byto me nos significativo (el trm ino general p ara indicar la disposicin do valorea en memoria es orden At bytes). La implicancia de esto es que cuando so ingresan valorea numricos u las funciones de TCP/IP las mismas deben se r convertidas desde su orden do bytes del servidor :d orden de bytes im perante en la red. A fortunadam ente, la im plem entacin do este protocolo incluye cu atro fun ciones quo realizan precisam ente esto. Las m ism as se encuentran declara das na <netinet/in.h> de la sig u ien te m anera:
jnatflfud lonc i: ntonlunsicnod Icng in t hostlong); unsignea shor: :nt ntonfl(ur.Bignsd short in t rum soart); unstgnod lang in t ntofilfunuionad Lona in t ivoticngj: u u ig n M *nor; int ntcfls(ursigniid snort u it r.etsnort);

h t o n i convierte h o s t l o n g , un entero de tipo io n g i n t , desde ei orden de bytes del sistem a al orden de bytes de la red. Sim ilarm ente, htons convierte hostshort, un entero de tipo desde el orden de bytes del sistem a al orden de bytes de la red.

short

in t

Las o tras dos llam adas, n t o h i y n to h s , invierten el proceso y por lo tanto convierten desde el orden de bytes de ia red al orden de bytes del sistem a

Cac'-..:o 15: Programacin de TC P /IP y Sockets

393

D ir e c c io n e s d e red

Tal como ocurre cor. 03 sockets de entorno UNIX, las direcciones de red TCPTP son alm acenadas en u n a e stru c tu ra de patrn s o c k a d d r , s t r u c t s o c '< a d d r _ i- . definida en < n e i n s t / n . h > de la siguiente m anera: sxnicx ir { i r t s wf u t y ; f A F J N 6T v U lr t1 3 _ t s in !_ p c rt; / * M u b s t o li 3u r t o / s t n c : i r v a t d 3i r , 3 acr; / 3 ir tc c io r I? */ P a ra o btener la definicin com pleta de un socket so debe tam bin incluir
< s y s / s o c k e t.h > .

3a-a TCP/I? { w rjl ec i. ocr io e o s ), sin_4anily db9 3er af.IKt. * l n _ p o - t * ; ?1 n u M r o a i a r t o a i c t a l c e c a c t a r s * . Jln _ d r M la direccin l? (r= = I n t 9 r r t 3ro tcco i). Tanto s i n j i o r t como s i n _ a d d r ( s i n = socket inpul) deben e s ta r en ei or den de by tes de ia red. Sin em bargo, s n _ a d d r es una e stru c tu ra b in an a , de modo que p a ra convertirla a notacin e st n d ar decimal con puntos 3e de be em plear la funcin n e t _ n ? o a ; reciprocam ente, p ara convertir u n a d i reccin er. forma decim al con puntos al formato binario de S in _ a d d r se de ber u tilizar la funcin i n e t a t o n . Amba3 funcionen estn protatipjida3 en < a ro a f i n o t . h> de la siguiente m anera:
c f^ r :n t_ n to a { s trjc t n _ id d r id d r> ;

cM r ir.:_:'snfcocjt cnar Cdaddr, ttru c t ln_*ddr 'tsA C cr);

Sl-nutwarks;nadress

JMfJO,
r rjflia im o fl Central P rotocoi/ln?rM t Protocoi <TCP/IP> i n e t _ n t o a co n vierte ia direcci n b in a ria IP alm acen ada en a d d r y la re to r na e n form a do cadem i de caracte res t la cadena re to m a d a consisto en u n buffer asignado est ticam en te q ue resulta sobrescrito por las lla m a d a s s u b sigu ie ntes a n e t _ n t o a ) . i n e t _ a t o n co n vierte u n a d ire c c i n d e c im a l con pu n io s alm a ce n a d a on d d a d d r al form ato b in a rio a d ccu ado . y luego la alm acen a e n i p a d d r . S i la direccin es v lid a . i n e t _ 3 t o n re to rn a u n v a lo r d is tin to de cero, y en caso c o n tra rio re to m a cero. PRECAUCIN van* faraones API o TCP/JP retoman cero sj fracasan y un valor distinto da ccro si teen x^zc Este comportamiento es precisamente opuesto al conocetamieto oe to das as funeones d O te; oteca / cc sistema que se frayan visto hasta aora.

CONSEJO Jector se --CC2.-3 ocas-onaimente con una funcin denominada m e t _ a d c r . Dicha funon faca la m sma cosa que in e t_ a tc n . Tiene si prototipo unsigned lo n g in t ir.5 t_ a d o r(c o n s t c i a r 'c a s o a r ;. Es una 'uncin obsoleta porque no recoroce 215.253255.255 como oreoan i? vtda. SJ llegase a ancntrar coa o q u e utiliza di c ta fundn, "sga;* un favor s mundo y reerr-piceia por ln e t_a to n

Las direcciones de red em pleadas con TCP/IP son nm eros de 32 bits, gene ralm en te expresados en notacin decim al con puntos, como por ejemplo

Programacin on Unux

w w w .xxx.yyy . z z z . Como se tra ta de nm eros de 32 bits, existen potencialm ente 4.294,967,295 (contando desde 0) direcciones de red diferentes Sin embargo, como cada direccin especfica puede q u erer o necesitar correr m ltiples aplicaciones TCP/IP sim ulineaw ento. cada direccin tien e tam bin h asta 65,535 puertos a los cuales conectarse. Los puertos son nm eros de 16 bits que rep resen tan una conexin o punto nal en un sistem a dado (los puertos 0*1024 e st n reservados p ara sor u tiliza dos por procesos que corran con privilegios root). Do modo que un punto espe cifico de conexin en un sistem a e3t definido por la combinacin de la diruc* c.n IP del .servidor y un nm ero do puerto ln u conexin de red completa y especfica entro dos sistem as e st dolinidu por dos punto de conexin de d i cha caractersticas. La figura 18*5 ilustra grficam ente lu cuestin. Mosn wosra

F ig u ra 13.5. Una conexin completo de red queda definida p o r dos direccio nes IP y dos nm eros de puerto. Tal como :*? puede apreciar en la figura. SERVIDORI y SERVTDOR2 disponen de cuatro conexiones alternativas completas entre ellos, SERVTDORl:PtTERTOl a SERVIDO R2:PUERT02, SERVID0R1:PERT02 a SERVTD0R2.PUERT03. SERVID0R2:PL*ERT0l a SERVID0Rl:PUERT03 y SERVID0R2:PUERT04 a SER\TD0R1:PUERT04. A ntes de exam inar los program as do dem ostracin, el lector debe conocer una ultim a funcin, s e s o c k o p t (establecer opciones de socket). D espus de cerra r un socket. su direccin (la combinacin do IP y de nm ero de puerto} no queda disponible d u ran te un cierto perodo de tiempo. P a ra re u tiliz ar e s ta direccin, uno debe establecer una opcin p a ra el socket que le perm ita ser re utilizado. La mism a est declarada en el archivo de encabezado < s y s / s o c k e t . Itf> de la siguiente m anera:
in : s e tsc c x o p :(in t sockfd, Lnt l e v e i , in t optnane, const v o ia *optvai, soexisn :
o c t le n ) ;

s e t s o c k o o t pone la opcin alm acenada e a optnam e a optval p ara el socke: que tiene el descriptor de archivo SOCKf C . P a ra sockets. l e v e i debe ser

Caoitutc 18: Programacin de TC P /IP y Sockets

395

SOL_SOCKET. E stablezca o p tn a a e a Z y o p t v a l a i . Es decir, la funcin s e t s o c k o p t debera p resen tar u n aspecto sem ejante al siguiente: in t i t;
3 e t io c x o c t is o c k c . $0L_30C*T. I . i ; . } .r o * { i) > ;

E je m p lo s

1. El ejemplo que viene a continuacin. c r e a r _ t c p i p . a c un socket TCP/IP y luego ag u ard a y acepta todas la s cononones. Utiliza el nmero de puerto 50000.^ u e no es probable que se a utilizado por otro programa.
* K *o-- a * ; ;r > j r a *n I r .:* r n * t ; */

* c r n r _ t c o u .c - ciaar**
c o n tiU A ti

un ocket TCf/I> y Lugo qu#(Jr i la

i d#

/
w i u c i < iy i:* e t u :.n

<attrt/tn-r
l* C lo

<unu:.n>
iAClw C* < 5 W U 9 . >

u n u m iv o id l

(
in t 3# *crio *o < _ w c < * f: s tr -jc t * o e **M r_ trt i : r v c _ u r v l 3 e r ; o c k l*o _ t :aa/io_a;r*ccio < *: . E s t r y c r . r j 3 soct 1*1 s o r / ic a r ' * ;sa 4 i*3 a e i n;w ero s c o a a o r ae estru ctu ra

*Trwc_$ni03r 'I
w t j * t / C r ir 1 s o e t i f ( (3 S C r ip t o r _ i * * t C * t t{P F _ :K T . T r_qU t(*SO C kt*); ! 3 * 3 S 1 r ; i i l i z i r i iirtcC'.Qr l o c a l / S8t5OCW0T(<MCrBTOr_SOCJlt. 30C_SCCX=T, a , 1 1 , 3 U O f ( ) i ; ' Z n i c i s l i z a r f c o n fij-j.-a r . i e s t r u c t u r a a s sccd e t 3 e l servido- */ o w s e t '. i s . - . . . s i z e e * . J T r j c _ s e r . : : r ) ) ; T r o c jitc v iC o f. * i u _ a i l y * F ,: n t t ; s t - v t s e r v id o r . sin_po*-c z* l a r ' * j /
no

( s r j s e is o c k o p r /

SCCX_STBMI, 0)1 < 0

o l v ic a r s i o raen : s e y tss

) 396

) ) ) ) > . Programacin en Linux

>

>

>

>

>

>

L ig a r 3 l s c c x s t a ur.a d ir e c c i n /

ta * a n o _ d ire c c ia n - $ i 2 e < jf( s T r jc _ s e r v id o r ) ; : ({O i C {c !e s :r ip :o r soc'<9t, { t r u c : sockaddr * 5 s t r j c s s r v d o r , t-jn a o _d iracco n }) < 6) r r _ c u i t { , bLnd, J ! g u a r d a r a que a rrio o n co n e xio n es *f i f ( | l i 3 :e n { d o s c r i c t a - _ - c c < e t , 5)> )

r r _ q u it(* lls W !! pjt3('Socket TCP/IP availanle ) ;


c r r t t ' ! \tPue.-to *sd\n*, n t f l h s ( s t r u c j e r v i d o r . 3 n j r t } | ; a r i n t f ( \?D lr*cciO i1' IP bstn , Ln9t- n t o a ( 3 t n ic _ s ^ v id o r ,3 in _ d .o r | )

j9CJt3- ifvdofinidanene esto la io , aceorardo todas las conexiones nil9(accept!d93crip*3r scckst, atruct sockaddr )* * fu c servicer, t:anaflo_dir9cci3.i)) >* W
p u :s ('N u v * co n ixio n K a O ilu a a a J ;

Mit!5XIT_3UCCeSS>;

> c r o a r _ t c p i p ea sim ilar al program a c r e a r s o c k e t visto anteriorm ente Las nica,* diferencias son ol reem plazo do las llam adas y di? las estructuro de datos fx>r sus co ntrapartes correspondientes a sockets TCP/IP. A dvirtase que corno c r e a r _ t c p i p especifica una direccin IP do cero, el kem el asigna u n a direccin predeterm inada. La salid a do u n a corrida de dem ostracin de Ste program a se asem eja a lo siguiente,
t / c r # a r _ tc lp

Sflchnt c p / ip ouoomai

Puerto soooe
s a l io a

D ir e c c i n tP . 8 . 0 .

2 El prximo program a. c 0 n e c t a r _ t c p i p , es una v ariante de c o n e c t a r _ s o c k e t rescrita p ara u tilizar sockets TCP/IP


V w ire 'ie ; p ro g ra as en I n te r n e t: n atco n n .o >
LO /

conectar tcoip.c direccin IP'

Ca.nctarid a un socket TCP/IP, Sintaxis: ccnactar tcpip

*7
* in clu d a < s v iM c c k o t.n > n in clu d e < .o etln e t/in .n >
i n c l u a e < 3 r p a ,'i n e t .h > u i c l u a e < $ t < Jlib .lv >

incLu -35 < td io .ti> f in d u d d n lp e r.n *

>

>

>

>

) 397

Captulo 18: Programacin de TC P /IP y Sockets

_ aair-Cint irse , car *argv[l) ( ifl* 30cr;:t3f_scc<9';


; t - . c * so c te sc * . r
s

:.~ jc c l i e - t e ;

- E s t r u c t u r a a s so c k et : e pro ceso c l i e n t e

'I
s 3 s r c _ a t r c c io n : / ta a a o d e l n e< io rc sockaddr s s e s tr u c tu r a

st^ :_ c ll9 n te *
Se agu area co re E r y a s n t c

l a l i n a s de C3oar<Jo3 l a d ir e c c i n I ? ' {

I f l K QC 1= 2) (
pats'MOCO D :*?'_=C : c 3 r i c t 3 r _ t c ? i 3 d ir a c c ic a !P > ) ;

)
C*r 1 <nt */
i f ? i e i c - 1 3 t : r _ j s c k * t K C k t ( f e_:N ET , SOCXJTREAU, 0 )1 < 9)

n t c u i i w i staoVic* la stru c tu ra c l clto n t / J 5 *t:l*truc_vlint*. i . J i:* c lC n ._ lio n t ) );


t t r u C _ C l i r t . i l n _ f i l y - A fJK S T ';

itryc_itnt*.?in_ocrt v.ontijw oe;: / no olvidar *1 rd*r o los 5yt M !* '3 */ l< l ( lntt_lton|r^l 1 ] , ljtruC_cLin?. J n j i d d r ) ) ) / Esto n a r j terninar
C ^ ' i n i 11 1

el

d ireccin

ip

1 invalida /
*> ;

ft*r r_ u it f

C o n e c ta ra a l s o e k tt i tia a r .3 _ 3 ir e c c io -' * t o f ( * t * u c _ c l W i r t l ; l f < c r r t * : ; t 5 i c r i c t c r _ s c c i i t , ( s t r * jc t sacfcatdr * )& itru c _ c li< sn ta , t SJU>; _ ; i r c c on) J

rr^w ltC cor-fC'l;


>u t < C l l n t a c o a c t a d o
j

jo c h e r ;

xit'.Exrr_accSS): > Adems del cdigo requerido p a ra ad m in istra r sockeu TCP/IP, c o n e c t a r _ t c p i p . c tam bin incluya u n a nueva funcin, n e r r _ q u i t , defini da en n e l p e r . c. que llam a a u n a fmcin de manejo de errores especifica de TCP/IP, n e g r o r . ta se comporta exactam ente igual que la funcin p e r r o r . P ara ejecu tar c c n e c t a r _ t c p i p , se debe tra n sfe rir al program a en su linea de comandos la direccin IP, en form a decim al con puntos, del servidor al

>

>

;>

398

Programacin en Linux

cual uno desea conectarse, como se ilu stra en el salid a de c o n e c t a r _ t c p i p que viene a continuacin (correr c o n e c t a r _ t c p i p en una v e n tan a y c r e a r _ t c p i p en otra):
f ' T y f. --------salida * ./cr a r_ tcp lp 3 c c m rc p /ip d isp o n ib le Puerto 5Z<io O ireccion IP .9.8.3

w nu#v4 cooxon na sido naoiiitaaa $ ./conoctar_rcpto o Client conectado a socxet U na vez ms. tran sferirle 0 a c 0 n e c t a r _ t c p i p en su lnea de comandos le indica al kernel que utilice pora ol socket u n a direccin de su eleccin En lugar do 0. uno puede tam bin tran sferirle 0.0.0.0 o la direccin P de su sis tem a, si ste tiene una. La figura 18-6 m u estra que c o n e c t a r t c p i p puede ser capaz do com unicarse con cualquier servidor de In te rn et Deudo otro sis tem a. yo efectu un te l .n e t a mi sistem a, donde corra c r e a r t c p i p , u tili zando la sintaxis de t e l n e t quo lo perm ite a uno especificar un puerto a l ternativo (el puerto predeterm inado do t e l n e t es ol 23).

F ig u r a 8.6. Conectndose a un puerto creado por c r e a r _ t c p i p desde otro sistema.


L e c tu ra y e s c r itu r a d e s o c k e t s T C P / I P

Leer y escribir sockets TCP/IP es exactamente lo mismo que leer y escribir sockets ce entorno UNIX. Una vez ms, la concepcin de Linux de tra ta r a todo dis positivo como un archivo resulta se r una bendicin- Un p ar de sencillas modifi caciones a w rsock y ra s o c k "programas presentes en el sitio Internet de este libro), listadas en el siguiente ejemplo, m uestran lo sencillo que es realizar esto.
E je m p lo
/ Noicra sol prograna en In te n u t:

rOr.Bt.c /

r
, J CMo, 0 la?__tcp p.c - Crear y lija rs e a r> socket TCP/I?. y luego leer dei isno

*/

Captulo 18: Programacin de TC P /IP y Sockots

399

tn elw d <$ys /s o c k e t. t r c l a S < r .t\ir tx fln .v>

t i K i j c t < ir ^ ii r a t.n
i r c i j * <*t(U16.R>

ifKljC* <410. f* -
nclutf* r'lptr.p*

jn : ftj.i|voxai

<
tnt w c ' i p f . o r t , :5crt:toi*Ar<niva04:o8; lo s / ~ it r u c H m d o r ,
o c !

/ c c r i a t c re a pp.Hivo i* jtru c tu ra t f" TjnaOo d*

< S*1 r v ic r v

oc*l*n..t tM<,'o_air*cclOft; *tn*c.rvtdor /

; C r t ir 3#i socm: V
i?(<e**c/-:otcr_icht ic*t{?f_rxrr, scck_staii. ij < t r r jQ u lt(*M C fc t*);
I n t c u liii'
*)

t i I tr jc tu r a a l *rviflor ')

j m m ! 4at<\ic_*rvisc'. I , s u o f ( s t r u c _ i # r v i d O P J ) ;

tr v c _ t r# i a r.s if l_ 'i lly A5JKET; *trvc_r/j.acr.*if:_port - ntoflStSIOOfl); / Csflaf 1 o c *: i - *j d ire c e ic o ae rod V

:iao_3ir#ccion n aecf(ltrjc_ fv iaar);


: { t b : n a 'a M C . - i 5 t o r _ t o o m t , ( s t r u c t s e c x a e o r ) S i n i e _ s e r v i 2 a r ,

: m c _ c ir * c c io r j) < 9)err_Q uitCO ina*l; ^ K a r a la aspen a* con*ioi*. filtrantes / ifH iis ? 4 n (icfio :o < * _to c< (t. S ) ) < aj p jts fS o c < * t T & il ? s u p c r i s t f } ;
: : r % 8 \.v , 'ir ;>j ( s t r u c j$ r v i d o r .* i n _ p o r t ) ) ;

d r)); o r t a c r r v t O l r e c c io n ! * V sm * . L.T*T_rr:oa( 5 t n j c _ i e r v l a a r . jln_a< 2

' Aceptar la s r ir e - s c&'-exoi*. sue a r r ib e / ifU se sc -ip tc rA .-c .'in o C U tss = accptldscri.otor_socKet, atraer sccKacar *)
3t.v C . i 'v i 3 C f .

& '. s s a 's . a ir a c ie r i , > = 0;


O its e n e c o r ^ e c t i " j r a r - e t j ;

>

J .> )

Programacin en Linux

l e e r .39 : s o c k e : y e s c r i b i r a s ta c u * */ x f r_ < S a -2 (c e 3 c ri5 ;o rA rc h iv c O a w s , ^ ile r .o ^ s w c u t ) ) ; exit(=X IT_3U CC ES3);

Rn de programa leer_tcpip y comienzo de programa escribir_tcpip


/* iNorcr? d e l p ro grana en t i't g r n e t : r n e t .c */

/*
B s c r i b i r _ t c p ij} .c - S s c r W ir a un s a c x e t TCP-IP a o ie r t o . S in t a x is ; e s c r i 3 i r _ : c p i p h r o c c o r . i?

/
*U id u C 8 < sy 3/so ck a t.h > in d u c e , - n o tin 9 t/in .n > in c ljd e * a rp a / ln o t.n > * ir tljd e < jt li0 .n > U lncluila e s tillo .h > I ;n c lw 4 ! T l 0 r.h * ir>t r a i n f i - i t .ir^ c , cna.- *a rg v| |)

<
iftt dorlpcor_iockoc;
t n j e t jc k a a a r en s tr u c c l iu n t o ; r E s t r u c t u r a 00 tockot 3 1

V
jcoflun_t tartaftojliroscion;
r

/ Tanate d tn :c _c !in to

'I

3# aguarda cano arguim.ico ao la linea Co cwmnaoj la uireccion IP /

if(arge l 2 ) {
p u is r u o o o DE UPLECr s c r i b i r j i c p i p < tiro c cio n P > ') ; w l?(E X IT _F A :'.U ftE |

>
/ C re a r un s c c x e t /

l f ! {d#scripror_joc>tot = sockt(PF_IMEri 50CKJ1REAW, 0|| < 8) e rrjs u iti's u c K e t* );


r E s t a b la c e r <1 c lie n t e "I

n a s 3 e t ( A 4 t r u c _ c iiw M , <1. s i i e o f ( d t r u c _ c li e n ) > ; 9 t r u c _ c l e n t e .$ i f l _ f a j a iy AF_IX?;


s t r u C j C U f l n t f l . s i i j J o r t = icons150002j ;

l f (! ( i.* s :_ a t c n U r g v { ' J , A s t o ic c liB .it e .3 i.n 35dr)>) /* E 3to hara t a ^ i r a r a i p ro s r a ra 31 ia d i.-e :c io n I? t r a n s f e r id a a s in v a l i d a */


r.= n -_ iju it(' in et_ ato n * 1 ;

>

Caotulo 1S: Programacin de TC P /IP y Sockets

401

* Coftir$ t i MC '
t3aa5c_l.-cciGfl = sirtof!3truc_cl 9fiT 9!; llccrw ctw tscfU Jto r^ ao ciM t, ( s t.- j c t so<<jc<:r *)4$ruc_cient, irja o itc e e tH M e t* ); C - 'i 'COT-eCtiOO 5 SOC<9t TCP !?>; p r i f i t f r .tP aerto rtons(struc_cii*fl?*.*ifl_p 0 r t ) );
s r i - r r ' .tO i.-s-:cicr Hs\n*. int_rtoa{stnic_ciieflte.sin_a(< lr)> ;

/ Cosas- tir. ai w u t / i?er_c*ta(fUe>c(5tair.). dMCriStor^focket);


**it>xrr_sxcs3s): > Fueron muy pocos ios cambios realizados a los program as originales. E n am bos program as. las familias de protocolos y direcciones fueron cam biadas a PF_INET y AF_INET. respectivam ente, y la s t r n c p y dol archivo especial de socket fue reem plazada por una im ple asignacin dei nmero d puerto. A # r n e z . c le agreg cdigo a d id o a a i que copia la direodn IP especificada en la linea de comandos del program a a i miembro s t r u c _ c l i a n t e . s i n _ a d d r de la estru ctu ra s t r u c _ c l i e n t e . Los programas se comportan do idntica m anera, enviando la entrada s t d i n de e s c r L b ir _ t c p ip a la salida S td o u t de l e e r _ t c p i p . mi como se ilu stra en la figura 18-7.

F ig u r a 18.7. Copiado d< la stdin d e e s c r i b i r _ t c p i p a la std o u t de l e e r _ t c p i p em pleando sockets T C P IIP.


E m p le o d e h o s t n a m e s

H asta ahora, toda la exposidn se h a concentrado en la utilizacin de direc ciones IP. E sto h a sido correcto porque la s com putadoras operan ta n eficien tem ente con los valores num ricos como lo hacen con la informacin de te x to. No ocurre lo nnsm o con los eres hum anos, que prefieren las cad en as de

>

402

P ro g ra m a c i n e n U nux

texto a las secuencias d dgitos. A fortunadam ente, la fam ilia de protocolos 7CP/TP incluye el DNS (S istem a de N om bres de Deminios), u n a base de da tos de dominios de red que, en tre o tras cosos, m apea nombres tales como WWW. n e t s c a p e . com a direcciones IP, en este caso 205.188.247.73. Aunque DNS brinda num erosas prestaciones, la que se cubre aqu es cmo convertir un hostnam c - nom bre de servidor) a un direccin de red y viceversa. P ara ello se debe u tilizar una estru ctu ra, S t r u c t h o s t e n t ; , y dos funciones, g e tn o s tb y n a ir e y g e th o s tb y a d d i '. Todas ellas e st n declaradas en < n e td b .h > de la siguiente m anera: struct *03tunt {
m ar *n_rtama char " p a lia s e s ; :n ; iw ddrtype; in : iMflngth; cnar n_a<ldr_Ust; /* NonOro canonico *L servidor / / Lista do illas */ r A f jN e r v

i* sizeof(struct ln_addr) / ! Lista Jo dlrccoionoB IP

>;
s tr u c t ho* t#n t *Q0 tilda tnym m o{co fl# t c ia r *nan) i t r u c : n c a ;* n t jnthosW yadd.-const c h n r *.nd(Jr, ln t l* n , u i : t y o c );

g o th o stD y n a m e acepta un hostmime am e, u como por ejemplo f tp .n e ts c a p e .c o m , y reto m a un puntero a u n a e stru c tu ra h o s t e n t que contiono la informacin relevante que corroaponda al respectivo DNS. De m anera anloga, g e th O S tb y a d d r acepta una estru ctu ra de patrn s t r u c t n . a d d r correspondiente u una direccin d<- red, (la cual ya s? ha visto), alm acenada en a d d r, su tam ao, alm acenado en l e n , y su tipo, que se r siem pre AF INET, y reto m a un p u ntero a una estru ctu ra h O S te n t. El puntero que reto m an am bas llam adas a p u n ta hacia un buffur asignado estticam ente quo resu lta sobrescrito cada vez quo se llam a u cualquiera de las dos fundones. De modo que, si uno necesita g u a rd a r cualquier inform a cin presente en la e stru c tu ra h o s t e n t , alm acnala en variables locales. Con respecto a la propia estru c tu ra h o s t e n t : n_name es el nombre cannico, u oficial" del servidor. h _ a d d r ty p e es siem pre AF_INE7. h _ le n g th es el tam ao do la estru ctu ra que corresponde a !a direccin, que por ahora e s s i z e o f ( s t r u c t in _ a d d r ) . h _ a i i a $ e s y h _ a d d r _ l i s t , respectivam ente, son punteros a cadenas que contienen todos I03 nombres y direcciones LP que puedan corresponder a e-se
3 r v id o r .

";L"n momento!' , lo escucho pensar. Qu m e quiere decir con esu de -todos los nom bres y direcciones IP que un servidor pueda tener? Dicho de m ane ra sim ple, el DNS no es un mapeo biunivoco e n tre nom bres de servidores y direcciones IP. E xisten m uchas razones por las cuales un servidor puede te ner m ltiples direcciones IP o m ltiples nom bres de servidor. E n el caso dem ltiples direcciones F?. consideremos un ru tead o r o encam inador (router), -m sistem a que incluye v arias tarjetas de red. C ada ta rje ta de red tiene una
i

Capitulo 13: Programacin de TCP/IP y Sockets

403

direccin I ? diferente con la cual en cam in ar I03 paquetes entrantes de datos a su correspondiente destino, ta l como por ejemplo distintas redes o siste m as diferentes. _ A su vez. u n sistem a que tiene mltiple nom bres 'estrictam ente hablando, tie ne un slo nombre cannico y uno o m s alias) so utiliza tpicamente p ara permita- que u n a sola computadora sica 3c a capa do proveer mltiples sen-i dos, tai es como comportarse al mismo tiem po como servidor de Web y servidor de FTP. Dicha computadora tiene una sola direcdn IP poro dos nombres. Independientem ente de la razn quo p ueda ten er un sistem a para contar con m ltiples hostnam es o direcciones IP. g e th o s tb y n a in e y g e th o s tb y a d tr reto m an la lista completa de nombres y direcciones, respectivamente, en los miembros p a l i a s e s y r t _ a d d r _ l i s t d e la estructura de patrn h o s t e n t. Si U direcdn IP o el h o s tn a r m t que ae le transfirieron a dichas funciones re su ltan ser invlidos o s: ocurre algn otro tipo de error, ambos funcionen re tom an NUIL.
E je m p lo

El iguiente program a de demontrucin, h o s t _ : n f O. ucopt.i un orinante como argum ento en su lnea de comandos y exhibo ol contenido do lu corres pondiente estru ctu ra de patrn n o s t e n t .
/ n o ce? C*1 a r o $ r * 3 i n XfttTA*t: ft c it l r t f o .c /

/ * *5$t.info.c - vuestra #i centtoiao 3 .* itructur* 4* pitron hoottnt par ir v t s o - provista par *: usw rie S i r t m s : ro s tjn ro noocr* <j servidor */ tm c lv u <sys;soc:.n rtcioe* <A*ti/*t/&r.n>
in c lu * arp a /ln t.n

i.'sclucs <nC8 h> UrtCluCi <3113.ft inclu* <s:aio.h> nneluoe Tio e r v iu t M infint ir-gc. c~tr 'a r^ rd : { srrjc t ^asrsot 'z/ststruct la jo a r -*ccntrc8*cOr#eciOrta-srP; snor '>jnttroHaciaAlias. in t cantsoar - i S 2C-.3.'*; cese arsu tu ato :e 14 i ir 4 s* eent63 la airscoi& n IP I
I f r - c : 2) { FJT s: M OOO :z a P L rO : r.cst_ iafe <nonc*4 ce :=rv;cor*>; = x i: E X IT/A IU R E :

P ro g ra m a c i n on Linux

/ Recopilar ios datas

if[tju - -* gotKostbynanoargvH])) = NULL) hsrr_ou i{ gsftostoyna-W) ;

/* 1 roatjre 3 2 ! servidor

< t$ valido, asi oue proseguir /


/ N o w e S3nor:co ael

p r i r t f * tn/oroacion 2 fl servidor para is'.n . a r g v [ 1 I | prnf(*.Voflbre cannico: %s\n', ouf->>i nane|; sarvtflor '!

OPittff A l i a s : * ) ;

r Tcdos loa

a l i a s dol 39rvi<jr /

p u n te rs w a c ia A lU s = bu f - p a l i a s e s ; n i U { #p un< roH aciaAlU$) (

3rintf(*\n\t*is', ' puntroHac;UAlia5>; contador * MnteroHaciaAss

)
t c o la d o r 3uts( Ninguno*) printf(*\n*)
/ * Tipo y Muaflo do la s d im e c io n o a d e : jo r v id o r '/ tf{o u r-> h .iddrtyoo AFJSfft)

h_addrtyno d c t e r ;a v a le r A f_tN T /

C u t J I" Tioo do t ir e c c io n r AT_1N ET*> la

W (* rip o lili diroccifiitu: iinsconocldo* >; prs.r.:f(*Longitud Ce diroccionos. . bi.f >h_lor.gtn|;

/* r&das la j diraccians

IP almacorufliis <in ol servidor /

putsjDiroccionet D r s a n t :'); ounteroHaciaQl'ccior.tti p - (stru ct *r._addr )buf-ft_addr_li3t; niia|*(XintroWac:aDl'-ac:lon.sI? ) ( p rin tf ( >:%s\n , int_ntoa( SuntersMaciaOi.-accion&sI?)); punteraMaciaDireccionesII'

>
e m < E X ir_ S C C C E S S );

Ei siguiente Hatada m uestra la salid a de- este programa:


Info.'tiacicn da servidor aara 'tp.redhat.cait Viobre cannico: 'tp.rdh at.con
S A L ID A

A lia s : Nuiguro

) ' y > y ) .1 ) ) ) r ) j ) ) y j ; ; > ; ; /


Caoftulc 1 3 : P ro g ra m a c i n d e T C P /IP y S o c k o ts 405
ip c 3 r a irs c c ia tts : A.c _ l > T

LCcit'j3 Ce J i r e c c i c n s : <

Otr^cciz-~ss :*;i0rtti5:
S 9.133.2*.22=

203.T3.t*5.2S
a 6 . 3 2 .1 .2 2

Luego de recopilar los datos requeridos, el program a exhibe cada miembro de la e stru c tu ra de patr n hostent. b u f. El cdigo de aspecto algo in tim id an te que im prim e tas direcciones IP e s necesario porque b u f > h _ a d d r _ l i s t es un mero puntero, pero i n e t _ n t o a e sp era un argum ento de tipo s t r u c t n a d d r.

Lo que viene
Esto capitulo le brind ol lector u a breve recorrido por la programacin de soc kets y de TCP/IP Completa asim ism o la cobertura que efecta este libro de las comunicaciones inu-rprocosos. L a prxima 3eccin, U tilid ad e s de Programac . 'jn en Linux". le presentar v a n a s h erram ientas y utilidado que facili tar. algunas de las tareas de u n programador. La miatna comienza Con l capi tulo 19. "Seguimiento de cambios en cdigo*) fuente: el sistem a de control de revisiones*, que !* . ensenara cmo u tilizar RCS. el Sistom a de control de revi siones. RCS es una h erram ienta que autom atiza la mayora do las tareas aso ciadas con ei seguimiento do las modificaciones realizadas a los cdigos fuente de los program as. 0Para qu '-o debe* efectuar el seguimiento do Ins modifica ciones do los cdigos fuente de los program as? Continu leyendo y lo vorl

.i

>

Parte V

Utilidades de programacin en Linux


[ S e g u im ie n to s de c a m b io s e n el c d ig o f u e n te : el R C S o S is te m a d e C o n tr o l de R e v is io n e s

2 0 . U n to o lk t d e d e p u r a c i n 2 1 . D is trib u c i n d e s o f tw a r e 2 2 . P r o y e c t o d e p ro g r a m a c i n : u n a b a s e de d a t o s d e C D d e m s ic a

>

'

>

>

Seguimientos de cambios en e cdigo fuente: El RCS o Sisteiru de Control de Revisiones


El control de versin es u n proceso que p erm ite m an ten er el seguim iento de los archivos do cdigo fento y llevar en un registro adecuado las modifica ciones que se les van haciendo P ara qu m olestarse on hacer eso1 !* Porque algn da uno realizar esa edicin fata l a un archivo de cdigo fuente, eli m in ar au anseceaor y o lv id ar cualas fuoron exactam onte las lneas do di go que pretendi modificar. Porque ten e r que efectuar m anualm ente ol aeguim icnto do la versin c o m e n te de u n program a, de la prxim a versin y le los ocho errores que fueron corregidos puede llegar a convertirso on alijo dem asiado tedioso y proclive a errores. Porque ten e r que buscar frentica m ente la copia de seguridad e n cu ita despus de quo alguno de su s cologas sobrescribi por q u in ta voz un archivo do cdigo fuente puede hacerlo come te r u n disp arate. Porquo. a lg n da. m ien tras tom a ol caf de la tnaanu, so en co n trar dicindose a s mismo: Control do versiones, e sa es la Cosa Co rrecta que Hay que H acer- . E ste captulo analiza el m todo RCS, jI Revisin Control System , u n a solu cin h ab itu al al problema del control de versiones. RCS es u n a solucin co m n porque se halla disponible en casi todos loa sistem as UNIX, no sola m ente en Linux. RCS e st m anten id o por el proyecto GNU. Dos alLurnativaj a RCS la constituyen CVS. o Concurrent Versin System , tam bin m antenidi por el proyecto GNU. y SCCS, S o urce Code Control System , quo os un pro ducto patentado. E ste capitulo cubre los sig u ien tes tem as: Terminologa relativa al control de versiones Creacin de un depsito de reposicin de cdigo fuente Verificacin de archivos q u e e n tra n y salen de ese repositorio P alab ras reserv ad as de RCS y el comando ident Modificacin de los reg istro s de RCS Comandos y utilidades adicionales de RCS Tbdos los program as de este capitulo pueden se r encontrados en el sitio Web n t t p : ,'w*rt*.mcp.com/info bajo ol nm ero de ISBN 0789722151.

Programacin on Linux

Por qu razn utilizar RCS?


Los program adores m s experim entados, y especialm ente aquellos progra m adores fam iliarizados con otras versiones de UNIX o de clone3 de UNIX, podran preguntar: P ara qu an alizar RCS cuando CVS es m s popular, tiene m ayor cantidad de prestaciones y se h alla m ejor adaptado para ser empleado con proyectos grandes de programacin?" Prim ero, considera que RCS es la introduccin m s sencilla a los conceptos sobre el control de ver siones. Pocos program adores principiantes han odo h ab lar aigunu vez de control de versiones, y muchos m eaos han utilizado softw are p ara control de versiones El RCS e3 sencillo de aprender, requiere de poca configuracin inicial y dispone de un conjunto de com andos pequeo. Esto lo convierte en el vehculo ideal p ara introducir al recin llegado a la program acin a los conceptos sobre control de versiones. No obstante, dado que ol CVS se en cu en tra basado en el RCS y es compatible con el m ism o, la transicin de RCS a CVS ?e puede efectuar de num era sencilla. Adems. ai bien CVS tiene evidentem ente u n cor\junto de prestaciones m u cho m s elaborado quo el du RCS. estas prestaciones aportan escasos benefi cio n loa program adores quo sean nefitos con Linux. Pocos aprendices do h acker necesitarn, por ejemplo, contar con la posibilidad de navegar su propio cdigo fuente utilizando para olio un navegador de Web o de lograr acceso jnnim o do lectura/escritura al depsito de reposicin de software. Finalmente, la mayora du -os programadores principiantes no trabajarn en am bientes en loa cuales se estn desarrollando varios proyectos al mismo tiempo o que dispongan de un nico repositorio de cdigo fuente que almacene el cdigo de varios proyectos simultneos, ambientes para los cuales fue diseado CVS.

Terminologa del control de versiones


A ntes de seguir adelante, sin embargo, la tab la 19.1 lista unos pocos trm i nos que sern utilizados reiterad am en te en este capitulo. Como los miamos son empleados con frecuencia, resu lta im portante que el lector ios com pren da dentro del contexto del RCS y el control de versiones. Tabla 19.1. Trminos am peseos en el control de versiones._________________
T rm ino_________ D escripcin___________________________________________________

Cualquier arcnivo uoicaco on un directorio RCS, controlado cor RCS y accedido por medio de comandos de RCS. Un archivo RCS contiene tedas :as versiones de uri archivo especfico. Normalmente, un archi vo RCS tiene una extensin .v (coma. v}. Arcnivo as trabajo Uno o mas archivos recuoeracos tosco e repositorio ce cdigo fuen te RCS (el directorio RCSl al directorio corriente de tra&ajo y dispon ales para ser editados. Archivo bloqueado :Jn archivo recuperado que est siendo editado, para cue nadie ms pueda editarlo simultneamente. Un archivo en uso es aloqueaoo por ei primer usuario contra posible ediciones cue puedan llevar a cabo otros usuarios. Revisin Ura versin especifica y numerada ae un archivo fuente. Las reviro nes comienzan con 1.1 y se van ncrerr.eotar-do a par:ir es all, a me nos que sean obligadas a utilizar un nmero de revisin especfico.

Archivo RCS

Captulo 19: Seguimientos de cambios en e c<Jigo fuente

411

Ei R easian C ontrol Sysism o Sistema de Control de Revisin adm inistra mlti ples versiones de archivos, generalmente, aunque no necesariamente, archivos de cdigo fuente. El RCS automatiza el almacenamiento y recuperacin de los archi vos correspondientes a versiones anteriores, la modificacin del contenido do los mismos, el control de su acceso, la administracin de versiones y la identificacin y fusin de revisiones. Como beneficio adicional. RCS minimiza los requerimien tos de espacio en disco porque slo lleva el registro de loe cambios realizados, NOTA
Los s t o c s e RCS 5. ?ara

so n i? Z90* jc ares-ocreo que * cay v encuentre npJearKJo qu .ratn ae RCS se est -flitzando. 5pee re s -V.

El RCS puede ser utilizado con ms archivos que ios de cdigo fuente, sin em bargo El mismo e* capas de efectuar seguim ientos de cambios on cuolquier ti po de archivo de texto, como por ejemplo e n informes, captulos do libros o c digo de hipertexto HTML. No puede ad m inistrar, sin embargo, archivos bin n ro e CVS. el C oncunrnte Venum Sy*fem. puede operar tambin con a r chivos binarios, razn por la qu mucha gente em plea CVS en lugnr do RCS.

Utilizacin del mtodo RCS


Uno de los atracti%*os dol RCS lo constituye su simplicidad. Con unn m nim a configuracin y slo unos pocos comandoa, uno puede obtener mucho. Esta seccin analiza ios comandos e l , c o e l d e n t , lo mismo que las palabras re serv ad as del RCS
V e rific a c i n d e a r c h iv o s d e R C S q u e e n tra n y sa le n

Uno puede lograr mucho con RCS em pleando slo dos comandos, C i y co . y un directorio denom inado RCS. c i %'iene de ch tck in, que significa ingresar un archivo norm al al directorio utilizado por RCS. donde pasa a se r un a r chivo RCS; co significa check ou y se re e re a recuperar un archivo RCS desde el directono utilizado por RCS. P a ra comenzar, uno debe crea r un d irectono RCS. Como opcin predeterm i nada. todas los comandos de RCS presuponen que existe un su b d irecto r^ denom inado RCS en el directono c o m e n te de trabajo. De modo que el prim er paso consiste en cre ar dicho directono Supongam os que el lector tuviera va rios archivos fuente guardados en h O ir> 0 /ju a n /e d ito r Haga dicho direc torio s u directono co m e n te y cree en el m ism o el subdirectoriu RCS, ta l como se indica a continuacin: S :s -o* ; -jar editor
S I t i-

=cs

Todos los comandos de RCS ejecutados e n /n o ^ e / j 'Jan / e d i t o r utilizarn el subdirectono RCS. El mismo se denom ina tam bin el repositorio. C O N S E JO
c c - - :c " - 3 se 1*30^0. ri'.c U . 2 '- 5 z~ o ro s Srectorics
->30 oe RCS es u f j . iar 'eD G S * .cr.o en caca tfrectorto n>su*:a s._-c:e.r.3 sara proyectos sccuciwm. Lo araarior - v - ' : ;= RCS: no fafriHB e :niC^O con ac..setos que tienen in tracto. E'~- otra rezar- aor a -rucha gente prefiera CVS.

preGete#-

D espus de que h ay a sido creado e repositorio RCS, el paso siguiente es in g resar al mismo todos los archivos existentes de cdigo fuente. La p rim era ve 2 que el lector ingresa ur. archivo determ inado, RCS solicita u n a descrip cin del archivo, io copia a] directorio RCS y elim ina el archivo original. "Elim ina el original? Giup!, d ir el lector. No se preocupe, uno puede recu perarlo con e; comando de recuperacin, c o . Pero vayamos p.-.so a paso. El ejemplo siguiente crea un repositorio, u n archivo de cdigo fuente p ara g u a r dar en l, y luego em plea c p ara inscribir dicho archivo,
E je m p lo

Prim ero, creamos u n directorio RCS, tal como se indica a continuacin


_________
EJEMPLO

S akdir RCS

Despus, creamos el archivo de cdigo fuente, n i f u e n t e . C . en el m i m o di rectorio n ol cual ge cre ol directorio RCS. /
* StdS / ver *.3laar3s reservadas de SCS*. en ust capitulo V ^oifusnto.c - Arcnivc a rb itra rio do codiijo Cuento pura d W tr a r e l eoaleo Jo

R C S t

Unclude <si(Jio.h>

int awin(void)

<
p rin tfC E t. 1 unu ju iu U c io n do drcnivo de eodlgo fuente'), rcurn XITJU0CSS;

>

OttSCfiption. te m K v n a d wltn i n g l e V
i A lio a

or ana o f i l a :

HOTS: T h w ia NOT tfte lag nessaga! Prograan sencillo da denostraeicn para ilu s tra r ol eupleo de RCS

i n i t i a i ravision: t .1

done
S co l aituente.c ->
i

RC3/nifuente.c,v
'e v m o n t.1

afian?e.c

( I o c Km

done

Capituio 19: Seguimientos de cambios en el cdigo fuente

413

Obsrvese que si r.o se utiliza La opcin 1 de co, el archivo RCS que se recupera ea forma de archivo norm al es de slo lectura; si se lo desea editar, se lo debe blo q u ear P ara hacer e r x ltimo, utilice con CO la opeen 1 (co - I m if a s t e . c), -1 significa bloquear ilock). El concepto de bloqueo de archivo se halla definido en la tabla 19.1. Finalmente, as dos lneas de La salida precedidas de son l neas que uno debe tipear
R e a liz a c i n d e c a m b io s a a r c h iv o s d e re p o s ic i n

P a ra v er el control de versiones en accin, efecte u n a modificacin al a rc h i vo funcional. Si a n no lo h a hecho, ex traiga el archivo RCS del repositorio y bloquelo (CO -1 ^ i ^ j e n t 9 . C). Modifique todo lo que desee, aunque yo re comiendo p ara ello agregar \n al final do la cad en a que constituye el a rg u m ento de prntf, porque tan to L inux como UNIX, a diferencia de DOS y Windows, no aaden autom ticam ente u n carcter de nueva lnea al final de la salid a de consola. Luego, vuelva a in g resar ei archivo modificado al repositorio. C uando lo h a ga. RCS llevar a cabo las siguientes acciones: 1 In crem en tar el nm ero de la revisin. Uov&ndolo a 1.2 2. P edir u n a descripcin de los cam bios que se h an efectuado 3 Incorporar loa cambio* que se h an efectuado al archivo RCS

4 (De m anera m olesta) e lim in ar el original P ara vitar la eliminacin de sus archivos funcionales d u ran te las odoracio nes de ingreso al repositorio, utilice ju n ta m en te con c i las opciomis - l o -u.
E je m p lo

E ste ejemplo Ueva a cabo la modificacin sugerida en el prrafo a n terio r y luego actualiza el archivo de repositorio, s : i - 1 a ifu ta tt.c ttS la if tunta. e,v < r.tm ' M i i o a .
1 .2 ;

a tfu w tt.c
1 1

p r e v lO u * r a v lS iC O :

w tr loa aessage. te'-Binatec witn single AAttidO carcter ae mi\u linea . ene

. or end of *iia:

C uando se las utiliza con c i , tan to ia opcin 1 como la u generan u n a ex traccin im plcita del archivo RCS luego de haberse completado el procedi miento de ingreso del mismo al directorio RCS. -1 bloquea el archivo de mo do que uno pueda seg u ir editndolo, m ien tras que - u ex trae u n archivo norm al sin bloquear y de slo lectu ra.

414

Programacin en Linux

O p c io n e s a d ic io n a le s d e ln e a d e c o m a n d o s

Adem s de -1 y u. c i y co aceptan o tras dos opciones m uy tiles: - f (por amisin) y f (por fnrce [obligar]). La opcin - r ge u tiliza p ara indicarle a RCS cul es la revisin del archivo que se desea m anipular. RCS presupone quo uno desea tra b a ja r con la revisin m s reciente: - r deja s:n efecto esa opcin predeterm inada. La opcion f obliga a RCS a sobrescribir el archivo norm a: corriente. De m anera predeterm inada. RCS aborta una operacin de ingreso de archivo a su directorio si ya existe un archivo norm al del mismo nombre en el correspondiente directorio de trabajo. Do modo que, r,i real m ente desea liquidar 3U archivo norm al, utilico con Co la opcin f p a ra po der com enzar de nuevo desdo el principio. Las opciones de lnea do comandos do RCS son acum ulativas, tal como era dnblc de esperar, y el program a se comporta muy eficientem ente en desh ab i tu a r ias opciones quo soan incompatibles. P a ra e x traer y bloquear u n a revi sin determ inado de m if u e n te .C , se u tilizara un comando sim ilar a co L - r 2 ." r a i f u e n t e . c . A nlogam ente, c i -u -r3 m i f u e n t e . c in gresa m if u e n te C. lo asigna ol nmero da revisin 3 .1 y deposita er. el di rectorio corriente de trabajo una rovistn 3.1 do slo lectura del archivo p re viam ente ingresado al repositorio RCS.
i< E je m p lo s

Sj 3iS y
e k m ih o

l Ente ejemplo crea la revisin 2.1 de m i f u d n t a . c Afwgreao, a n te s de eje c a ta r este comando, de h ab er extrado previam ente m if u e n t e . c del repositorio y de haberlo modificado de alguna m anera i ci -r2 nif-jenttt.e
<rtfuanta.e

(g v i ' ^ sau d a

r*" 'avuio.'i 2.1; prevloi9 revlJiOfl: t.2 eoter iog m sag#, ttntirac#a vrith single y> 59 aootfico algo
dora

or ena of rile:

m p ; o

ms alto.
S co - r i . 2 n ir u e n ta .c

Z ' T ^
salida

R C S/M .rxjen te.c.v

>

Jifu a n t o

ryi$iofi !.2
dor,c

S. SMP'.O

Caotc 19: Seguimientos de cambios on el cdigo fuente

415

: :o

-f nt't^te.c
> utfaente.c

RCSaifaeBe.c,*
iO A

rev isi n 2.1 ( lcck*31

< 9*2 C u aca o lo em plea j un tam en te con c i . - f obliga a RCS a ingresar un a r chivo al repositorio au n cuando ste no h ubiese sido modificado.

Palabras reservadas de RCS


Las palabras .-rr-.-vedas de RCS 5cn .-mbolos similares a macros utilizados pa ra insertar y m antener informacin jdentiEcatonn en archivos do cdigo fuente, de cdigo objeto y bnanos. Estoa imboios tienen ol aspecto $PALA8RA_RESER VACAS. Cuar.dc w tr a e del repositorio u n archivo que contiene palabras clavo de RCS. el programa procedo a expandir cada SPAIA8RA_RE5ERVA0A$ a su co rrespondiente valar SPALASA_RSERVADA: VALORS.
S ld S

E sa peculiar cadena ubicada al comienzo del listado de s iic a d e n a . c . $ d $ , es una palabra clave de RCS. La p rim era vez que uno extraiga m ic a d e n a . c del repositono. RCS la expandir a algo sim ilar a lo siguiente.
Sis: a :c * s u .:,v i9OT.'r/2 |;56.W h u r t jm ll G*p <urt_all $

El form ato de la cadena $Id$ es o! siguiente:


J>AL*SaA_5SaVikO*:NO.AfiCHIVO NUWJISV c EO*A M09A AUTCfl ESTACO 3UMUEAD0R $

En 1 sistem a del lector, la m ayora de e-stas campos tendrn valores diferen tes. S: el lector extrajera el archivo con u n bloqueo, vera tam bin au nombre de ingreso al sistem a luego del valor Exd.
S L o g : m e n s a je s

RCS reem piass la Linea que contiene la palabra clave SLog: m e n s a je ? con el m ensaje de registro que sum inistr el u su a n o cuando ingres su archivo ai repositorio. RCS no reem plaza el m en saje do registro anterior con el nue vo. sin embargo, no va insertando nuevo m ensaje por encima del anterior, siguiendo u n a secuencia inversa.
E je m p lo

__ El siguiente listado m uestra como resui :a expandida ia palabra clave SLogS = L despus de van o s ingreses del archivo a l repositorio. PIO

fe p

* s i :; a iftrt-tt.c . i t999.'*t Si S:M :SS ta irtjw ll x tctrtjrail S * eifvci'.ie.c - =-:cri=3 ssncillc OMCS^rscion para ilustrar el ecoleo de KS

....... .............................. R s v i s i s - i
Szq : aifueflts.c * i

History

........................
s ia l a c r a c l a v e Lag

Revisin

z-

$$$,i? 2a 35:N:$s <Lrt_#all

- t Z z * :- r M r t C s r ie s - = 3 : ? c "

)
416

> )

Programacin en Linux

flvision 1.3 1S99/07.-20 04:59:17 *urt_wali 3e cnois *retum cor exit* aeviawn 1.2 5939/07/20 24:58:25 Xur*j*aLl
Aadido ca ra cte r ce nueva lin e a

/
in c lu o e < $ :d :o .ti> includ* < 3 t d ilD .n >

it M in (v o ld )

{
? r u i 'f ( * E s t a *>3 una s n u la c io n d9 a rc n iv o ds codqo Cuento \n*> *lt(EX l7_3U C C E SS);

} La palabra clavo SLog : m en saj 8$ perm ite ver las modificacin*.*.*: in tro d u cidas a un archivo dado cada voz que so edit dicho archivo. El historial vie ne dado on orden inverso. e3 decir liar.ii prim ero ia rnodiiicacin m s reciento y contina hacia abajo h asta llegar a la m.1s antigua.
O t ra s p a la b ra s re s e rv a d a s d e R C S

La tab la 19.2 Unta otrn/i p alab ras reservadas do RCS y la m anera en que* es te loa expande.
Tabla 1 9 . 2 . Palabras :esor/adn<; do R C S ____ ______ ____________ _ _

Palabra clave__________ Descripcin_____________________________________

SAutnorS SDate$ SHeaaerS


S L o c k e rs

Nombro de ingreso al sistema dol usuario que ngres la rev.siOn si re ser/orlo Focha y hora en ouo ae .ngras la revisin, en formato UTC .Ruta completa de acceso al archivo RCS. el nmero ae rov.s>on. la fe cha. hora, autor, estaco y responsable del bloqueo (si esra stooueado Nombro de ingreso al sistema dei usuario cu msntiene bloqueado e! archivo ce revisin <sl ste rio estuviese bloqueado, el campo respecti vo queda vaco) Siembra de smbolo, si o hay. empleado para extraer la revisin Nombro cel archivo RCS Sin incluir su ruta 00 acceso Nmero de revisin asignado ai archivo RCS Slo 'uta completa de acceso al arch:vo RCS Estaco de a revisin: Exp (experimental) es ei p'ecetermir'aco: Stao (estable): e.1(emitido ireieasec]}

SNameS
Sf l CSf t i eS

SftevisionS SSourceS SSxateS

+)

>

)
4 17

C a z l o 1 9 : S e g u i m i e n t o s d e c a m b i o s e n e l c d i g o fu e n t o

valor S D ateS aparece en form ato UTC u H ora U niversal C oordinada U niversal Co<y:r.cUd T i e), conocido anteriorm ente como H ora Media de Greenwich. El nombre simblico q u e re p resen ta SNameS es u n alias que uno puede u tilizar p ara referirse a una revisin en particular. P a ra asociar un nom bre simblico con un nm ero especfico de revisin, cuando ingrese un archivo al repositorio utilice el su:itch n < n o n b re > . El campo S S ta te S tienen experim ental Exp) como opcin p redeterm inada porque RCS presupone que todos los ingresos al reservorio corresponden a program as en desarrollo h a sta que =e los designe tax ativ am en te como estables (Stab) o emitidos (R al) utilizando p a ra ello el 3witch - s < s t a t e > .
El c o m a n d o i d e n t

E'. comando i d e n t localiza p a lab ras clave de RCS ?n archivos de todo tipo y las exhibe S t d o u t . en. E sta prestacin de RCS le perm ite a uno dotorminar qu revisiones de cules m dulos e st n .hiendo u sad as e n u n a versin determ inada del program a- i d e n t opera extrayendo cadenas de la forma SPALA8RA_RESERVADA: VALOR S d esde archivos fuente, objeto y binarios. Funciona aun con archivos de d a to s binarios sin procesar y volcados de m e m oria. De hecho, y dado que i d e n t busca en un archivo cada in stancia que responda al patr n $PALA8RA_RESERVA0A:VALOR $, se pueden em plear tam bin p alab ras que no sean p alab ras reservadas do RCS. Esto lo perm ite al loctor incluir en su s program as informacin adicional tal co mo, por ejemplo, el nombre do una em presa Esta informacin ns incluida pue de resu ltar una herram ienta valiosa para circunscribir problemas a un mdulo pacfico do cdigo. 1 aspecto atractivo do e sta prest RCS actuali za lus cadenas de identificacin autom ticam ente, lo cual constituye un real beneeo tanto para programadores como para gerentes de proyecto.
,3 E je m p lo

V* -r'F Z ^l
cjc m piq

P ara ilu stra r el empleo de i d e n t d-eoeremos cre ar prim ero el siguiente archivo de cdigo fuente, ingresarlo a l repositorio (utilizando p ara ello la opcin -u). compilarlo y hnkeario. h ac e r caso omiso de la advertencia que se puede llegar a recibir por p a rte del com pilador aobre que el arreglo rcs_i<3 se e n cu en tra definido pero no utilizado, y luego correr el comando i d e n t so bre el archivo resultante.
/ * e a o ' I t r c a i v o in t e r n e t : p m c flv .e /

/
SI3S
x a p r i a i r _ a o T x n o . c - S x h i& ir io s a lo r e s 3a l a s v a r i a s l a s da a n ta-n o .

ta e ltid * < s :e to .n > tn c lu fl < s t a lio .n >

iv.chjct yfuta.h*
a t s t i c e r a r r c s _ i a ( l * SX cStn*; in t m a in ( 3 i3 1

<
c rta m z t ir n o m o ;

'I

418

P ro g ra m a c i n e n Linux

c-nar al_entorno enterro; H iI r n i_ r t o r n c |

o rin tf{ 'H s\n * ,


-turn EXIT_3LCC3S;

.entorno-*),

)
i gee .'JorwLr^ertorno.e -o in p rin ir_ e n to rro i idnt :n p riflir_ e ito rro i*prla:f^ *irtorno: 5Id: u tp -u itrjin to rn D .e .v l . t 1999 7/29 05:57:39 K u r t jn U l txp S

La expresin s t a t i c c h a r r e s i d l 3 S ldS X n" saca parlado do la expansin por parto do RCS de las p a lab ras re n e g a d a s p ara crcar u n huffer esttico do texto quo alm acena el valor de la palabra reservada S Id S on 1 program a compilado que L d en t puedo luego oxtraer, Qu hu ocum do? La palabra clavo $ Id S previam ente expandida describa el texto expandido, y gee compil dicho texto expandido en ol urchivo binario P ara confirm ar eato ltim o, recorra el archivo de cdigo fuonto y com pare la cadena expandida por S IdS en el cdigo fuente con la salida du i d e n t . Las dos cadenas so corresponden exactam ente.

Empleo de resdiff
S el lector necesita ver las diferoncius entro au archivo modificado y su contra parte virginul ubicada en el repositorio RCS. deber em plear el comando r e s ( J i f f . Esto comando compara diversas revisiones de u n mismo archivo. En su forma m s simple, r c s d l f f n o m b re _ d e _ a rc m v o , r c s d l f f compara la l tim a revisin de n o m o re_ d 8 _ arch iv o presente en el repositorio con lu copia en uso de dicho archivo. Utilizando adem as la opcin - r tino puede comparar versiones especficas. El formato general p ara la comparacin entre i de revi siones especficas de un archivo por medio do r c s d l f f es el siguiente:
rc s d lff | ra rc h iv o i[ - r a r c n i v o ] | n o * firB _de_arctu v o

CONSEJO
1 cojanco d i ' f ( J ) as mueno ms potente y gcnoraliz^do que r c s a if r . Esto ltirro est concebido aoo oara ser utilizado con RCS. SI el lector necesita corparar oes o tra s arcflluoa ce texto entre si. utilice i comanoo d i f f .

E je m p lo s

_______
c u m p l o

1. P ara analizar el empleo bsico de r c s d l f f , considrenlo el program a de dem ostracin recin comentado im p r i m i r _ e n to r n o . c. E xtraiga del repositorio RCS u n a versin bloqueada del m ism o y elim ine del listado el buffer esttico r c s _ i a . E l resultado debera ser m uy sim ilar al siguiente listado: !
' S Io : ix fl< -M r_ e n to rn o .c ,v 1 . 1 ' i9 9 $ /0 ? /2 2 95 :22 :'-2 K u r t j M l i Exa k a r t j w a l l S i o o r i ir _ 6 " t o r r .o .c - E x m a ir lo s v a lo r e s do i a s v a n a o l e s co antorn c.

Caotuto 19: Seguimientos do cambios

on el

cdigo

fu e n te

4 19

*:.->c 1S

#irtclud sMlib.a inciuO <v$td.ft> mt *am voidi <


t * * r - fia r n o m o ;

cn r "Bi_ctorno

c rm tffs n p * , r t a r r e x jr .s m s s : > * CtCi** uc-uu-_*ntorro.c acs U: ACS/ lao<ULr_tntorflO.Clv


r * :r:* v iflg !*vme<> M

a i f . f l . l tpfjB iP_*ntcroo.c

M tt it ie V *r rc_i3[l '$13: l*prx*i.-_*ntomo.C, t.t \ 1999/7/2 *5:57-59 k u r tja ll Uo kur:_rtii Hft*; E sta salid a significa que ia lnea 9 de la reviain l . l hubiera aparecido en la linea de l f l p r i f i i r _ 8 n t o r n o . c si no h u b iera sido suprim ida. 2. P a ra com parar entre s versiones especficas por medio de la opcin - r , ingrese i a p r i r i r _ e n t o r n o . C al repositorio RCS, extrigalo inmediata m ente con un bloqueo, aada una sen ten cia s le e p (5 ) inmediatamente an tes de r e t u r n y, fin alm ente, vuelva a in g re sa r al repositorio esta tercera re visin. e sta vez incluyendo la opcin - u. A hora debera ten e r en el repositorio tres revisiones de K ip r u n ir_ * 3 n to r n o . c. Primero, compare la revisin 1.1 con el archivo en uso: S CStfif ..-l.l iacriir_aatorno. C 2c2
< * s : c: i*C^Br_rr,t - ',.0 . : t .t 1999,-7 .'23 35:57 59 K u r:_ll ?P S

CiCMPLO

> * 51:: iB?rtii.'_ert"O.C,v ' .2 tM9/7/2fl 06:20:47 <ur*t_*3U 5x0 $

1 , 1 /
420

.1

P ro g ra m a c i n e n L in u x

5d3 < 3T3*IC C a - "C 3 ; i [ | = 'S I C : i n p n s i r a n t c r - .o .c .v

1 . 1 l9 5 5 .' 7 / 2 2 0 5 : 5 7 : 5 3 k u -

_<*3il

xp

S .n ;

:7air <
> 3 l9 s p ( 5 l ;

Luego, com pare !a revisin 1.2 con la revisin 1.3:


s rcsdiff -p
i

.2

--:.a

:n o r i n i r _ e n t ! > n o .c

SCS f U W

F.CS/ i* o i'in ir _ e n t o r n o . c , v
*- 2

r s t r t e v in g r e v is i n r ? t r l8 v ; r g r e v is i n d i* ? <:2
<

1.3

< r l.2

n .3

il< 3:

in p rin r

w :o r r > 3 .c ,v

1 .2

1 9 9 9 /0 7 /5

0 6 :9 0 :0 4

c u rtjw li

xc

* Sfi: l W i n i r _ ? n i o r n o . 5 . v 1 .3 1 & M / S 7 / 2 0 0 f l: M : 4 7 1 n jr t _ w a li Exs S

fla i7

>

U*p(51

r c s d i f f es u n a utilidad que re su lta prctica p a ra visualizar loa cambios realizados a lo:i archivos RCS o p a ra aprontarse ii combinar v arias rovisio n e s er. ur.a nica versin.

Otros comandos RCS


Adornas do c i , co, i d e n t y r e s d i f i , el conjunto de comandos de RCS in cluye r l o g , r e s e l e a n y, por supuesto, r e s . Eaton comandos adicinale:: ex tienden l control <lel program ador sobre u cdigo fuente perm itindolo combinar o su p rim ir archivos RCS, revisar asientos del registro de cambios y llevar a cabo o tras funciones adm in istrativas.
E m p le o d e r e s e l e a n

El comando reselean hace exactam ente lo que sugiere su nom bre: prolija loa archivos adm inistrado por RCS. S u .sintaxis bsica es r e s c i e a n ( o p c io n e s ! [archivo . . . ]. U n comando reselean al que no le siga ningn argum ento elim inar todos los archivos de uso corriente que no h a yan sido modificados desde que fueron extrados. La opcin -u le indica a reselean que desbloquee todos los archivos que se encuentren bloqueados y elim ine todos ios archivos de uso c o m e n te que no h ayan sido modificados. Uno puede disponer la elim inacin de u n a revisin especifica em pleando el formato - rM.N, dor.de M es el nm ero m ayor y N el nmero m enor de la revisin. Por ejemplo, ei siguiente comando elim ina !a revisin 2.3 de foobar. c:
3 r c s c is a .T

ro.3

f o o & a r .c

C a s':- O 19: Seguimientos do cambios en el cdigo fuente

421

\: /

E je m p lo

I.It l) ;-=l

El com ande sig u ien te elim ina u n a revisin no bloqueada y no m odificada de i E p r i B i r _ e n t o r n o . c:


5 CO -u - r l . t ^ = r r i3 i- _ r : o " c .c SCS iafria:r_*fttrt*c.c fl0 " a ir_ e r:c m 0 .c

i'isiC!* : _~.:c<ec)
OSOS
S A L IO *

S rcseican - r r . t icp-t*tr_entorno.C rs ? l* C tilf_ W tO M O .C

Ei prim er comando extrajo 'ana versin 3in bloquear de im p rim ir_ t? n c o r n o . c a fin de te n e r -ana versin con ia cual trabajar. El segundo comando procedi a prolijar el directorio <es decir. ia elimin).
E m p le o d e r l o g

r i c g im prim e los m ensajes registrados y o tra can tid ad de informacin sobre los archivos alm acenados en el repositorio RCS La opcin R le indica a r l o g quo exhiba solam ente nom bres e archivos P a ra v er una lista do to dos les archivos presentes en el repositorio. por ejemplo, el comando ad ecu a do ser r l o g -R RCS/* (por aupue3to, uno puedo tam bin tip e a r 13 -1 RCS'. Si el lector desea v er u n a lista que contenga nicam ente los archivos que se en cu en tran bloqueados, d eb er u tiiira r ia opcin -L. P ara ver la in formacin de registro de todos los archivos bloqueados por el usuario deno m inado Pedro, utilice la o p a n 1.
E je m p lo

1' J
c u m p lo

Este ejem plo exhibe toda la inform acin registrada para toda* las revisiones de im D r u ii r _ e n to r n o .c :
s r lo g jj0 .- L s L r_ # n t c r n o .e

C3 t i t : *C S /U * riair_ # f!to O .C ,v * e rk iro lia : ii> crixir_ rta m o .e


1.3
3 rir< n :

iodts: i t n c : a e sm I t it : s > t o l ic -anas:


sy u cra _ s i? i:u tx c rt: kv

: c t l i ' v i s i c r s : 3 ; je t e e r t v l s i a n a : 3

iscrio ^ iiT

*tviSlOfl 1-3
i9 S S -a r 22 2 c :3 0 :x 7 ; ju w o r : j r t j r t i l ; s t a t s

xp;

l i r .e s : ~2 -i

Program acin en Linux

amea sleep r*vi5e .2 cat9: '999/7/28 86:0:4; author: K urtjw ll; State: Exo; linos: * Z diftot Ouffr
(visin t.t

date: 1099/17/20 5:57:59; author: kurtjM ll; State- xp; Io itial revisin

E m p le o d e r e s

El comando r e s en. priricipulmonto, un comando de tipo adm inistrativo. En la prctica, sin embargo, resu lta til do dos m aneras. Si uno extrajo un a r chivo del repositorio RCS como dn slo locturn, y luego le efectu cambio cu ya prdida no puedo afrontar, r e s 1 n o m b rc _ d o _ a rc h iv o e x trae r el a r c h i v o bloqueado sin sobrescribir al mismo tiem po el archivo editado. Si ve neceoita elim in ar un bloqueo de un archivo extrado por un tercero. ie utilizar r e s -u n o m b ro _ de_ arcJU v o . El archivo quedar desbloqueado y v* lo enviar un m ensaje a quien lo bloque originalm ente, el cual contendr una explicacin do parto suya acerca de las razones por las quo debi elim i n a r el bloqueo del mismo. Recuerde que cada vez que se ingresa un archivo al repositorio RCS, puede O pear un m ensaje donde explique qu es lo que ha sido cambiado o qu es lo que hizo usted con el mismo, Si comete un e rro r do tipeo o de cualquier otro tipo en dicho mensaje, o sim plem ente desea a ad irle al mismo informacin adicional, puede utilizar para ello el sijuiento comando re s :
& res -,tfav:onsa|o

n r s v es el nm ero principal de la revisin cuyo m ensaje se desea corregir o modificar y m ensaje es la informacin corregida o la informacin que contie ne el agregado que se desea efectuar.
E je m p lo

E ste ejemplo utiliza res par3 modificar el m ensaje colocado en im p rim r _ e n t o r n o . C cuando se ingres al repositorio RCS su revisin 1.2:
i M P o f5 res - n . 2 :*iini^ado ouf^er asttico 'rc $ _ W H '* ricriair^entorno.-:

*CS f ile - RCS/mprl*ir.sntorno.eIv core $ rlog -P1 . 2 iflprifflic_entorno.c RCS f i le ; 303/ in o ria irjjrtc rn o .C .v orxing ' l i e : inorifli.-_antorno.c

Caoftuto 1 9 : S eguim ientos de ca m b io s en el cdigo fuente

4 2 3

nes: 1-3

brancn:

ocks: W ic t
acssi L i s t :

syaboe fcfyvor* wcjtitutlan: o total revisin. 3. stltc ttd 'rlSions. i Mtcriflttoo;

r*Uion t.2 cata: 1999/IT/2# W :H :fat - autAor: k u rtjra ll; ita ta: xp; ELiairaco fru tar tita tico Unas: i 2

El prim er comando llev a cabo la modificacin. El comando r l o g exhibi h informacin registrada con el fin de confirm nr quo In modificacin efectiva m ente tuvo lugar. Al final de la salida do r l o g , so puede observar el mensa je de regia tro actualizado.

man: rcs(l), ci{1 ), co(i), rcsintro(tj, rcsdiff(i), reaclean(1 ), rcsaerge(l), rlog{1), rcsfle{1) y ident{l) .
Lo que viene
En este captulo ei lector aprendi sobre RCS, el Sistem a de Control de Revi siones. E l prximo capitulo, Un toolkit de d ep u raa a", contina con el tr a tam iento de algunas h erram ien tas esenciales que usted necesitar cuando program p ara Linux. Lo errores constituyen una lam entable realidad, asi que el capitulo siguiente le en se ar a d esa rro lla r tcnicas de depuracin. D espus da h a b er depurado su software, aplicado parches al mismo, corregi do otros errores, y luego guardado todos esos cambios ul 2 ando RCS, nece s ita r d istrib u ir dicho sonw are a su s u suario s, tem a que es cubierto en el capitulo 21, "D istribucin de softw are.

P a ra o btener m s informacin sobre RCS, v er las siguientes pgina de

Un toolkit de depuracin
A unque odiemos ten e r que adm itirlo, n uestro softw are siem pre contendr errores. E ste capitulo le ay u d ar al lector a d e p u ra r su s program as u tilizan do g d b , el D eBugger de G NU . y tam b in o tra s tcnicas y h erram ien tas m s especializadas. Este captulo cubre los siguientes tam as

Empleo del gOD Tipoa de errores de memoria


D epuracin con E lectnc Fence

Utilizacin de npr y mcheck


Todos lo* program as de este capitulo puedon xer encontradas en el it:o Web n tto : * c p .c o n i n f o bajo al nm ero de SBN 0789722151.

4 2 6

P ro g ra m a c i n e n U n u x

Empleo del gdb


Para u tilizar el gdb de m anera efectiva, el lector deber conocer slo unos pocos comandos. Le seri de sum a ayuda el com pilar la versin a dep u rar con la tabla de smbolos especiales destinados a facilitar la depuracin, gdb tam bin acepta varias opciones y argum entos de linea de comandos que p e r m iten personalizar su com portam iento. El tiem po invertido en ap ren d er el g ab 5e compensa am pliam ente con la obtencin p o sten o r de sesiones de de puracin m s rpidas y efectivas. iPero espere' 6Qu es una versin p ara depuracin? Quu os una tabla de smbolo? Comencemos por esto ltimo: una t.obla de smbolos es una lista do funciones, variable# e informacin alm acenada en un archivo binario u objeto que tan to el entorno on tiempo de ejecucin de C. el lin k cr y el carg a dor de program as emplean p ara cargar y ejecutor adecuudam onto el progra ma. U na tabla m ejorada de smbolos de depuracin aade informacin ad i cional. tal como los nm eros do lnea y m s referencia cruzadas e n tre las tunaor.es y las variables, quo los depuradores utilizan p ara l o g T a r que la de puracin sea m s sencilla La seccin de esto capitulo relativa a l gdb le m os tra r de qis m anera utilizar ust tipo du prestaciones

Compilacin con apoyo de depurador


Tal como se aprendi en ei captulo 1, Compilacin de program as", p ara crear una tabla m ejorada do smbolos se necesita com pilar con el sw itch - g . De modo quo ol siguiente comando:
i ffee -o ir c n iv o i. c arcluvo2.c -o p ro g ru n

hace que program a ie a creado con smbolos do depuracin en su tab la de smbolos. Se puede utilizar tam bin la opcin ggd b de g e e p ara generar a n m s informacin p ara depuracin, esta ltim a especifica p a ra el g d b . Sin embargo, p ara trab ajar de m anera m s efectiva, esta opcin requiere que uno tenga acceso al cdigo fuente p a ra cada biblioteca quo sea linkeada d u ran te la compilacin. Aunque esto puede re s u lta r muy til en ciertas si tuaciones. puede se r tam bin oneroso en trm inos de espacio en disco. En la m ayora de los casos, uno debera tr a ta r de arreg lrselas con n ad a m s que la opcin g 3in aditam entos. Como tam bin se recalc en el capitulo 1. es posible u tilizar al mismo tiempo las opciones -g -O (optimizacin). Sin embargo, la optimizacin transform a el cdigo objeto de forma ta l que u m enudo impide apreciar ia relacin e n tre lo que figura en el cdigo fuente y lo que es visible en el depurador. Puede ser que algunas variables o lineas de cdigo fuente parezcan h ab er d esap a recido o que puedan ten e r lugar asignaciones de valorea a v ariables en mo m entos en que uno no las espera. Mi recom endacin e3 que uno aguarde p a ra comenzar la optimizacin de su cdigo h a sta que lo haya depurado de la m an era m s completa posible. En el largo plazo, esto h a r quo su vida, en p articu lar la p arte de ella que dedica a d e p u ra r su cdigo, resu lte mucho m s sim ple y menos estresante.

Cao;tulo 20: Un toolkit de depuracin

4 2 7

PRECAUCIN
V> f8T W v3 Ge s u s 3rr>.vos a ;rr0 '~ 3 5 r Ce ceouracific a r ta s d e d i s t r i t o s ** forma t*r.y:3- 3e trata d cuestin de c m ala con k.-s usuarios y hasta lo O ,-* 3>v-y = u sted Si rec&e un r tv -m ; $obr ia pres-inde oe ur. arror on p| programo X f s o n c e u r u sv a ro c w re c ro s**> ef artwvo ejecutarte final, c.cno usufirio ns estar3 e n cc^-co-'C S a e oto * q < ' irftym^dflo C s> u s : fim'n <Jc y j programa : 0 3 '05 -3 C M 35 r>*cesar.cs a IV a e hao w s cc*responcr'.e arcWva b inara rrts C0ir<aca>.

E je m p lo

E ste captulo u tilira en varioa de su s ejemplos el siguiente programa:


/ oter* : f l rro jrjiu n n t m i t : sa rj_8prar.c V

/
p j r i j a ts - jr tr .c * r^ g rjsj TJ. frertto a ra u t l i i u r cono j*tolo U dDurucior

f
InclwM <*:aia.i

inclact < itc l;5 .r>


C m o % U U A O j0U N Q 5 0 W

o d l^ n _ r_ a i tir:3 (tn t * u r |) ;

int Min(votQ) <


in t LunJf_lit#rlo( r r i b i l );
* i( X I T _ S X C S S | ;

>
013 lu ft*_y_aisteri8(m t yr{ j )

{ int i; fo r(t * ; i < W jL90_3ftAA C; 1|


s * r(x l i;

i Yo compil este program a y crat de correrlo, tal como se m uestra a conti nuacin:
S gee -5 ^ 4r i _ 3e s u r jr .c -o para_dprar
S J sr=_5ic^*ir

Segoeitarirc *.!: ,ccr* ijeM L a salid a puede v ariar ligeram ente en el sistem a del lector.
C o m a n d o s b s ic o s

L a m ayora lo que se desea obtener con gdb puede ser efectuado cor. un conjunto de comandos sorprandentem ence pequeo.

-2 8

) ) ) } } f-.ogrdmacion en Linux

>

in ic i o d e

gdb

P ara iniciar u n a sesin de depuracin, sim plem ente *ipee gdb r,onbre_de_prcgra,i?a ( a r c h iv o _ d e _ v u e ic o _ d e _ ? e n o r a l, reem plazando n c b r e _ d e _ p ro g ra ffa por el nombre dei program a que desea depurar. La utilizacin de u n archivo de vuelco de m em oria es opcional pero reforzar la capacidad de depuracin de gdb. El prim er paso entonces es iniciar g d b , em pleando como argum entos p a r a j j e p u r a r y el archivo de memoria, vuelcom en. P ara te r m inar gdb, doee q u i t en su linea de comandos, que es (gdb). 3 -o saraj}#purar vuelcos** La p a n talla deber parecerse, u n a vez iniciado g d b , a la de la figura 20-1

:\r

rr^m 1sViW f.1...9WM, ***** - u f, 'T'O X * , - v * V i


-^ 1

F ig u r a 2 0 .I. Isi pantalla de inicio de gdb. La opcin -q suprim i los molestos mcnaajoa .iobre licencian. O tra opcin til do lnea de comandos es -d n o m b r e ^ d ir e c to r i o , donde n o m b re _ d i r e c t o r i o os ol nombre dol directorio donde gdb debo buscar ol cdigoTuen te del program a (como opcin pred eterm in ad a gdb busca un ol directorio co m e n to do trabr\jo). Como ae puede ver on la figura 20-1, gdb exhibe el archivo jecutable que cre el archivo de vuelco de mem oria y por qu rozn term in ol program a. En esto caso, el program a ocasion una serta! 11, que corresponde a u n a falla de segm entacin, Tambin exhibo, de m an era til, la funcin que se estab a ejecutando y la lnea de program a que gdb conside ra que gener la falla.
EJECUCIN OE UN PROGRAMA EN EL DEPURADOR

Lo prim ero q u e ae debe hacer es correr ol program a con problem as en ei de purador. El comando p a ra hacer eso es r u n . Uno le puede p a sa r a ru n su program a con todos los argum entos que el mismo aceptara norm alm ente. Adems, el program a recibir u n entorno adecuadam ente configurado, tal como el mismo esto determ inado por el valor de la variable de entorno SSHELL. Si uno quiere, sin embargo, puede u tiliz ar comandos de g d b para asignar y elim in ar argum entos y variables de entorno despus de haberse iniciado una sesin de depuracin. P a ra hacer eso, tipee s e t a r g s a r g 1 a rg 2 ( . . . | para establecer los argum entos de la lnea de comandos.

>

n t j
f429;

Captulo 20: Un toolklt de depuracin

CONSEJO
S se " ? . o-visco creo 3= sscr.K sfgi remarco Ce y<3 o -o s e srcuentra s e g u ro ae 3j 3 - x i : ; colecta. accuenta cctf una axcsif.ts ayude- Un sim escomandohelp *jocos t? 3 neo ce comarcca da gdb 5 brindara una brevo sta Ce as cistneas cte l a s as comandos crsoecbies. mientras Que n e ip (tema) imprimir ayuda jii sobre ese :c~a. ce cost-.-ofe. gac c-enta con un comc-'eto sistema -ce ayuda, a dccu-<*.o5- TeXirfo. y etcs erte manual. Detnjgging mlh >08. aue so encuentra disponte en .'rea y x r co-rco sotcitSroola a r3P.

E je m p lo

C uando uno tr a ta de currer este p ro g ram a on el depurador, el miamo se detiene tra s recibir la seal SIGSEGV:
E iC M P tO

(J3I njn
S ta rtln g p r e g r . jsr/lcc*l.,(W CroJ*ets/3/2/rc/para_iJeoi;rBr

> ' 05 '} **c#u*d t t ? u l SIOSGV. Sgoennuon f a u lt. r luA *jf_U teri3 3 u r* Jx cfaca) a t 5Jr3_aourir.c:24
s a u o a

24

s u r jt l i;

igcoi
INSPECTINQ CODE

La cuestin, pues, es qu ha estad o ocurriendo con la fundn L una_y_m is t e r j . 0 . Uno puede ejecutar el com ando b a c k t r a c c (rastrear hacia atrs) a fin de g en e ra r el Arbol de la funcin que condujo u la falla do segm entacin. Tam bin re su lta prctico ten er a lg u n a idea del contexto en el cual existen las iineas de cdigo que causaron -ol problema. A esto propsito utilice el co m ando l i S t . que ciee la forma general l i s t [in, n J . Los valorea B >y n re presen tan los nm eros de linea inicial y final que se desea aean exhibidos. Un comando l i s t sin ningn a d itam en to exhibir las 10 ln eas de cdigo circundante.
E je m p lo

La
ejemplo

sucesxva de los comandos to a c k tra c e y l i s t dene el .siguiente aspecto;


iic n n z a i im a r n i . - j _ / _ o : 5 t r i o (su.-*-#xo?fff8c$) n () a r p a r a j * t p i r r . c M 6 cara_dpurar.i;:24

(ffw > s i ' t ' . r a *


ifl w t n

** **" 77 {l

JgcKil t u :

JAUOA

T9 24 vdC tunajr_ B is :rL a i m i sur[JI 2t { 22 nt ;


ti

f s r.i - ;

i <Jt*flO_GflA.HO; i )

.)

>

4 30

Programacin on Linux

2* 23

jy r f il * l;

C O N S E JO
Cuarto se tmctoa el gdt> . * >resulta necesario lioea* los nombres complotos ce :os co mandos Ci-alq\j-r afcroviatJjra quo r#sute inequvoco bastara. Por ojomplo. Back < ? s suficiente *n lugar de OacVc tra c e ,

Tal como se puede ap reciar a p a rtir de la salida, el problem a estab a en Lu n a _ y .m i s t e r i o , llam ada por la funcin m ain. Se puode observar tam bin que el problema ocurri en el archivo p a r a _ d e p u r a r . c on su linca 24 in m ediatam ente an tea de la misma Too iGilo u n a im agen clara de qu ; lo que U sucediendo con e! cdigo y dnde tiim e lugar, uno puede luego determ in ar que es lo que anduvo mnl y corregirlo.
E x a m in in g O ata

Una de las prestaciones ma titiles do g d b es su capacidad de exhibir tunto ol tipo como ol valor do caoi cualquier expresin, variable o arreglo prosen te en el program a que e st siendo depurado. El comando respectivo im prim ir el valor de cualquier expresin quo sea legal on el lengino en el cual ost escrito su program a. El nom bre del comando os, ta l como era de suponer, p rin t p r i n t n o irb re _ d e _ v a r l a b l e im prim o ol valor do dicha variable. Uno no est limitado a utilizar valores diacre tos, tampoco, porque gdo puede exhibir loa valores presentes en una regin arbitraria de memoria. Para imprimir los valores de una cantidad determ inada de elementos do un arreglo comenzando a partir dol m ido del mismo en memoria, utilice el siguiente tipo de sintaxis:
(8 aa) p r u it r<m ore_arm alod n jn ero

donde n o m b r e _ a rre g lo es ol nom bre del arreglo o regin de m em oria de in ters y num ero es el nm ero do valores presentes en ubicaciones consecuti vas quu se desea que sean impresos. Digamos que uno quisiera im prim ir los cinco valores alm acenados consecutivam ente en un arreglo denominado n u _ a r r e g lo y quo comiencen con el elem ento nm ero 71. El comando p ara lograr esto es el siguiente:
igan ) p r i.it n i_ a '-r e g io (7 i jes

La notacin e n tre corchetes indica que uno quiere com enzar a im prim ir des de ese elem ento especfico y no desde el comienzo del arreglo. S i s e u t i l i z a e l comando .v h a tis (qu es), gGO puede tam bin indi car los tipos de variables presentes. U na de la s -imitaciones del comando c h a t i s es que slo brinda el ripo de una variable o funcin. Si uno desea en cambio la definicin de u n a e stru ctu ra, debe u tilizar el comando o ty p e .
E je m p lo

= J V (>V0

E l ejemplo siguiente m uestra una serie de comandos p r i n t consecutivos y sus resultados:

CaOfluO 20: Un todWt d depuracin

431

:? ) ei-int i J!

igtf&l ;rirt jrriJ


v.f>s: K t t u o -/ i t
500; p r i n t t^ * [ 5|

n : N ?N

12 *S
C f l ) P ' i n t S ' -1

53 *53
S o r if lt in r i'. 9 w {n t r r t r e c * . io . # x t. p r f l t v . r j 7 ? l < 15 ( 7 1 , ? 2 . 7 3 . 7 4 , 75J 0<S) s r t n t ur # !#
l . . 2. 3. * . S. . *. 8 ,

1 *2 .

.3 . **, n a . *5. *r . **8

(gao: M t ii i i
ty o * m t (0 0 0 ) n t t u r

tyo# v n (gire) tu iu l<j3_y_3iterio


t y f o ra ( )z >

A unque an este ejemplo el program a se dduvo en i*464, en qu lugnr espe cifico se detenga en su sistem a depender de la estructura de la memoria respectiva. 1 segundo comando, p r i n t s u r [ i l - deja bien en claro que el program a no tiene acceso a la ubicacin de memoria especificada, aunque tiene acceso formal a ia ubicacin precedente. L a linean que comienzan con ST. S2 y asi siguiendo se refieren a entradas en el historial de valores de gdb. Si se d eseara acceder a dichos valores en un futuro, b astar con utilizar estos alias en lu g ar de ten e r que retipear todo el comando. Por qu el prim er comando p r i n t S u r exhibi valores hexadecimales y el segundo exhibi en cambio valores decimales? Primero, recuerde que los va lores de los ndices en C- comienzan en cero. Recuerde cambien que el propio nom bre del arreglo es un puntero que se3a el comienzo del mismo. Por lo tanto, gdb examin s u r . vio que era La direccin en memoria dei comienzo dei arreglo, y en consecuencia exhibi la misma y los siguientes nueve valo res como direcciones de memoria. f,-v= direcciones de memoria son h ab itu al m ente exhibidas en formato hexadedmal. Si uno quiere exhibir en cambio ios valores alm acenados en S u r. unlice el operador ce indexucia. [ ]. tal co mo se indica en el segundo comando p r i n t su r.

4 32

Programacin en Linux

CONSEJO HaoituaJnerte es ccmotladq ser compatfbilidad cc.- a biblioteca res-me ce GNU le que significa que acepta la edicin desde lnea ce comandos y las prestaciones ce .listona! ce a interfaz Dash. ^or c;emolc. para invocar un nuevo comarco, utilice la te da cursor arrifca cara acorrer todo el histc.,;al de comandos de 'a sesin. Oe manera sirrillar a ;o que ftace el comarco cos>.sy ce DOS. Ctrt+A deso'a c> cursor hasta el comienzo de a linea comente. Ctrt+D elimina el carcter situado sotiro ei cursor Ctn+t desc<a:a el cursor hasta el final de la Jnea cmeme. -Ctrl-*-K elimina todo lo que se encuentre aove la un-sacin corriente ae: cursor > el flna Ce a linea. Para obtener ms detalles sobre la ecicn desoe la linea do comandos, ver a pgina reaine del manya/. S e t t in g B r e a k p o in t s

C uando se d epura un program a que p resen ta problemas, a menudo resu lta til d e te n e r la ejecucin del mismo en algn momento, gdb le perm ite i uno establecer p a ra d a s o puntos de detencin (breakpointx) en diversos tipos de construcciones de cdigo, incluyendo nm eros de lnea y nom bres de funcio ne.-}. Uno puede tam bin establecer p arados condicionales, donde el progra ma se dettune sio cuando 8e cumplo d eterm in ad a condicin. P ara lijar ur; punto dn detencin fin un nm ero de lnea, utilice la siguiente sintaxis:
Igdbl oreak nunoro_Uno

P ara estnblocer u n a parada en u n u funcin, em plee esto otra:


(gdb) orjak ic<iibro_a#J,ur.cton

gdb d eten d r la ejecucin del program a de forma inm ediata an tes de ejecu ta r la lnea especificada o in g resar a la funcin requerida. Uno puede e n to n ces u tilizar print para exhibir, por ejemplo, lo valores de las variables, o em plear L is t para exam inar ol cdigo que est por aer ejecutado. Si el lee to r tiene entro manos un proyecto m ultiarchivo y desea detener la ejecucin en una lnea determ inada del program a o en una funcin que no se encuen tra en e! cdigo fuente que se e n cu en tra corrientem ente abierto, utilice una de las siguientes formas:
($36) break rcnnrejo ^rcnv/o rnu nu ro jleJinea |gdb| orak 'iooDro_de_.irchtvo:i .onbro_le_fiiiicion

Las p arad as condicionales son a m enudo m s tiles. Le perm iten a uno de ten e r tem porariam ente la ejecucin dei program a cuando se encuentra determ inada condicin. La sntesis correcta p ara el establecim iento de p u n tes de interrupcin condicionales es la siguiente:
(gj brtak nu<ie."0_je_linea ar nc<iro_Ja_funcion i f p re si n

e x p r e s i n puede ser cualquier expresin que evale a VERDADERO co cero) P ara proseguir la ejecucin despus de a rrib a r a u n punco de detencin, pee c o n tin u . Si h a establecido varios puntos de detencin y ha perdido la pista de lo que fue establecido y cules puntos de detencin ya fueron alcanzados, puede re frescar su m em oria utilizando el comando i n f o b r e a k p o i n ts .

Captulo 20: Un toolkit de depuracin

433

1 comando delete le perm ite e lim in ar puntos de detencin, o puede m era m ente d eshabilitarlos urliiando ju sta m e n te el comando d i s a b i e (deshabi litar i y volverlos a h a b ilita r con el com ando e n a o le {volver a habilitar).
E je m p lo

E.'EM PLO

La saiid a de u n a sesin de depuracin que se m u estra a continuacin ilu stra el empleo de ios puntos de detencin; ! 3C5) ;r93y 2* L . . -.5
1 i'. t a 3 * * $ 4 H :

s r i _ 1 p u r a r .c t i i M

24.

I**
.S C r x. 7n* cre a ra n
o is v j

dttss#< i-.s 3een s t a r t a - J a lr e a d y .

s a li *

S ta rt i t f ro t M M g inn ln g ? (y o r nj y s t a r t c r c . ; r a a - / u s r fic c a i'n t p r a fe c ts / lp / 2*/src/parajJeD<jrar


5 r* k o a ln t 1 . i u r a _ y i u r ^ J x O f f f f a W ) 24 s w r [ i| * t ; a : p a ra_ d 9 p u r3.-.c:2S

CCO ) sa'in: i
$7 15
:&C5 m< o rtw p o ir.ti fea
i

Typ*

O l :

Effc
*M p

Accr?
y

tnat
3834 8 a i # m lun4_y_n*.3torio t

Dr*kpoint StOC n ly i*

o a ra _ (5 tp u ra r.c :2 4

** *s

9 r# a * p o w t ii-*a < sy n t i# r i e s
'QCO)

cci:* t

fl<CI

Como es dable apreciar, gdb *e detuvo en la linea 24 del program a. U n bravo comando p r i n t nos confirm a que ae detuvo en el valor solicitado do i , os de cir *5. Si cuando uno ingresa <1 com ando ru n el program a a d ep u rar ya es tuviese corriendo, gdb 1c av isar qu; el program a yn ha comenzado y lo p re g u n ta r si desea volver a correrlo desde el comienzo. Tipee y e s y oprima Intro. E stos ltim os dos comandos e n c u e n tra n informacin sobre los puntos de detencin en vigencia y los e lim in an por nmero.
MODIFICACION DEL CODIGO QUE SE E S f EJECUTANDO

Si uno u tiliza los comandos p r i n t y w f ta tis a 6 n de exhibir el valor de u n a expresin, y la expresin modifica v ariab les que el program a utiliza, uno es t de hecho modificando valores en o n program a que se est ejecutando. E s to no es necesariam ente algo malo d e hacer, pero se necesita com prender que lo que se e st llevando a cabo tien e efectos colaterales. Si uno desea m odificar el valor de u n a v ariable (teniendo en m ente que este cambio afectar ei desarrollo del pro g ram a en ejecucin), ei respectivo co m ando de gdb es < gdb) s e t v a r i a b l e n o m b r e ^ d e ^ v a r ia b le = v a l o r , donde n o rb r e _ d e _ _ v a r ia b le es obviam ente el nom bre de la v ariable que uno desea modificar y v a l o r es el nuevo valor que so le desea asignar.

Programacin on Unux

E je m p lo

Elim ine todos ios p un 03 de detencin y puntos de superv-.sin que pudiera haber establecido y luego establezca el punto de detencin b r e a k 25 i f l == 1 5. Luego, ejecute el program a. E ste d etendr tem porariam ente su eje cucin cuando la variable i se a igual a 15. D espus de que el program a se detenga, em ita ol comando s e t v a r i a b l e i = 10 para volver i a !0. Eje cuto u n comando p r i n t i a fui do confirm ar que ol valor de v a r i a b l e ha sido restablecido, y luego om ita el comando s t e p (algo as como ir de a uno pnr vez), que ejecuta una solo sen ten cia por voz. por tros voces, seguido por otro p r i n t i Se v er que el valor do i increm entado en uno luego do cada iteracin del lazo f o r C O N S E JO
\o reauHa naoMfi<> iludir atop ir"', voces, gdb recuerdo I i:iro con'a-nlo <?)<cutido, do -ricdo quo so cuo<o sancillnnwnto oprimir ln tecla Iniro y v o iw i ccui-vlo. uno gran contribucid" j la comcfdud. 6slo funciono nem ia nvayorto ile loo comando'; do gdb Para obuinor mftrt douillon vor lo documoninctn rospociiva ALCANCE DE LAS VARIABLES Y CONTEXTO

En cuulqu:*r momunto dado, u n a varioblo puede !Htar visible o no a la r lo , lo cual determ ina las vnrinbles a la quo uno fcieno acceso, puedo exam im ir y m uiupulur Uno no pueda acceder a variable que no so encuentren visibles. H ay algunas regias que controlan (vistas deadv {a ptica del depurador) el al cance (la visibilidad) de una variable, ya sea quo sta est activa o inactiva Las variables locales a cualquier funcin ostilr. activas si esa funcin se est ejecutando o si ae lo ha transferido el cont rol a otra funcin llam a da por la p n m era. Digamos que la funcin f oo llam a a la funcin b a r. oa tan to quo d a r se est ejecutando, to d as las variables locales a f oc y a D a r se encontrarn activas. D espus que b a r hayo retom ado, slo se guirn activas las variables de f oo. Las v ariables globales estn siem pre activas, independientem ente de que el program a est corriendo o no. Las variables no globales estn inactivas a menos que el program a es t corriendo. Lo an terio r ae refiera al alcance de ias variables de un program a de C. Cul es la idea de g d b sobre ci contexto de las variables? La complicacin surge del empleo de ias variables estticas, que son locales al archivo; es decir, uno puede ten er variables estticas de idntico nom bre en varios archivos, y las m ism as no ocasionarn conflictos porque no se en cuentran visibles fuera dei archivo en el cual estn definidas. A fortunadam ente, gdb tien e u n a m anera de identificar a qu variable se refiere uno. La m ism a se parece al operador de resolucin de alcance de C++. La sin tax is es la siguiente:

arctirso_a_nG S}br3_G e_fvncion;:no Srg_4e_variable


donde n o m b r e _ d e _ v a r ia b le es el nombro de ia variable a la cual uno se quiere referir y a r c h iv o _ o ^ n o n o r e _ d e _ f u n c i n es el nombre del archivo o !a funcin en la cual aparece la variable. A si que, por ejemplo, supongam os

Cacituio 20: Un toolkit de depuracin

435

te n e r dos archivos de cdigo fuente, f e o . c y b a r . c . cad a uno de I03 cuales contiene u n a variable denom inada b a r q u e est d eclarada como esttica. Pa r a referirse a dicha variable en f 0 0 . C. u n o p o d ra escribir lo siguiente:
( c i ) prin t *00. c ':

Las comillas sim ples en tom o del nom bre del archivo se requieren p ara que gdb sepa que el lector se e3t refiriendo a un nombre de archivo. Sim ilarm enw , d ad as dos funciones, b l a y s p i a t , cad a una de ellas incluyendo u n a variable de tipo i n t denom inada ld x , los siguientes comandos im p ri men las direcciones de id x en cada funcin'
?r5) print
(gao) o r in t U o i s t : : i d x >

Deteccin y reparacin de problemas de memoria


El tem n de este capitulo lo constituye la c a a de errores. Luego do los erro re s lgico* y los de tipeo, el tipo m s com n de erro r lo constituyen los que e stn vinculados con ia memoria. En e s ta seccin, ol lector aprender qu ti pos de e rro res de m e m o ra ocurren h ab itu alm en te y conocer algunas h erra m ientas que lo ayudarn u rastrearlos.
T ip o s d e fa lla s d e m e m o ria

Los errores de m e m o ra caon dentro de tre s categoras generales: filtracio nes. corrupcin y acceso ilegales. Las filtraciones de mem oria tienen lu g a r cuando un program a asi un a mem o ria del re s e r/o r o <htap) de m em o ra libre y omite retornarla al kernel, ya sea llam ando a f r e e o empleando la s ru tin a s que definen las APls. como por ejemplo, la llam ada a erO w in de la A P I de ncurses, o st lo hacen no tie nen xito en su intento
L : >anvx3i a se rvai.^ comertaca en Terminactfn ocursos", pgina 228.

La corrupcin de m em oria ocurre cuando uno traca de utilizar mem oria no inirializada o no asig n ad a i o tal ves incorrectam ente asignada), ta l como se m u estra en el siguiente fragm ento de cdigo: ciur eae**a; cnar -nersaje; strcpy(catr.a, 'algiau z tn tiu a 2 e m t o * ; , * vieoorta para 'cadena no 5Si5*aca
e r.ia ie ); / pensis' i\o esta

inicialUaflo * .*

Este fragm ento de cdigo ocasiona u n a falla de segm entacin porque, en la prim era iinea. no se ha asignado m em oria adecuadam ente p ara c a d e n a por medio de la uncin l a l l o c p ara que ata pueda contener algo, y porque, en ia cu a rta linea. i e n s a ] e no se e n cu en tra inic3izado cuando se lo em plea en la sentencia de p r i n t f . Los erro res de acceso ilegal de m em oria suceden cua n do un program a tr a ta de acceder m em oria que no le corresponde. Esto sucede h abitualm ente como determ inada v a rian te de un error de tipo 'e rra r le por uno, cuando u n pro gram a accede si proponrselo a la m em oria ubicada inm ediatam ente an tes o despus de u n arreglo.

)
436

.)

>

->

>

'

Programacin en Unux

E je m p lo

El siguiente ejemplo es u n program a plagado de errores de m em oria, inclu yendo los siguientes:
EJEMPLO

Tiene u n a filtracin de m em oria. Se p a sa del final de u n a regin de m em oria asignada dinm icam ente desde el heap. Se q u ed a corto con un bufier de memoria. L ibera el mismo buffer dos veces. Accede m em oria ya liberada. Sobrescribe una pilu (stack) asignada estticam ente y tam bin sobres cribe m em oria global.
/ N o n b ra d el ro g ra n a en In te rn e :; b a tf ti9 ir .c

/
M l_ j5 0 _ j n o r ia .o O e n u e a tra ol o n p ia o d h e rra lo n ta a p ira d e p u ra r n e n o rla

/
ln c lu t* < 5 fi3 li!j.h >
* ln c lu d n e lu d e < s * .d o .h > < itr u g .n

e.tar buffor_global[51; *tn> /


in t a a s r iv o i c i

f E f l en una va ria d o global Esta c la ra d a anto d

(
cftar buf;
cnar * U tr a c io n citar 3 u f^ < i* _ :c c a i( 5 | ;

I*

E s ta

n w ftra

q ti M

a s ig n a d a

p a ro

nunca

> a rs

l la c ra d *

filrra c ic o

* n a llo c fl );

/ Pasa do largo tor coco lo Ic n g u M da buf /


b uf a a l l a c { 5 j
s trc p y (C u f, aocce );

cnntfCPOR_.OCO

: s a ^ n ", b u t);

freeiufl;
/ Q uf is ta vez so casa d* la rg o ;o r n t.c n o l f ir a l do : j */

= n illo c (3 );

"

)
437

C apitulo 20: U n to olkit de depuracin

: . r , aoccefg-r:':;
: r i n t PORJWCHO : V s \ n \ buf); S? o -i a : c r t s : e s c r ib ir 3 3 u f -

{hif - 2) = *\ ;
-rir^ fS _ O .W _ O W T O : *3 n \ bu-1);

/* U3 r* Ctjf
frtt(o a rj; f m ite f];

003

< 0C 53 '

A:c*<3 1 W C C i 3 r v ia .-! rt9 l i M r j d 0 0 f f r g l ) /

s tr t c y 'O v . 3u? ya no U C ? * ); p r ie r ^ U B S U C * ; V>.r* Q ufl;

/ O tM Slado 5W*tf# para aio acarar ar ta v a rla b lo g lo o a l V tr c y < fjf? r _ 5i s i a l . 'E s t a llid o g lob al*): S fU itfC S to e A t : * \ n \ Duffor_ 3 ioo a);

SALIO*

> a iiU C C j r i r c t a r i aU acanar n ia varlabl# lo c a l / ?rcpy(Duf?r_10cal, -E s t a llid o lo c a l* ) ; p riitf Ct-OCA. ; *\n*, t>ufMrJlocaU

} n z n o t i a g e l o puede o no correr e n el sistom a del lector y, on caso do correr, puede te rm in a r en un momento diferente. La salid a de m e m o fla g e lo en mi sistem a fue ia siguiente: i ;ail_ jso _ w ria PPJCGO : &:
>OS.1*JOC : io c : t : jn S_0uW_CCa7O- accars- S*yici'iXL3n fa u L t ( r t Ju tc M )

M e m o r ia D e b u g g e rs

Dado que los errores de m em oria a o n ta c comunes, los program adores h a n desarrollado diversas h e rra m ien ta s que es perm itan encontrarlos. Em pleuz snjuncion con un d ep u rad o r del tipo de g d b , estas h erram ien tas h a n salvado, sm u d a, rr--ichcs program adores que les saliesen can as verde? Las des h erram ien tas que se com entan aq u san E lectric Fence y o en e e* .

Programacin en Linux

Using Electric F ence


La prim era h erram ien ta que considerarem os se r Electric Fence (lite ra l m ente valiado elctrico", program a escrito por Bruce Perens. E l mismo no detecta las fugas de memoria, pero realiz a un excelente trab ajo detectando rebosam ientos do buffar. Electric Fence se puede d escargar desde f t p : / / m e t a l a b . u n c . e d u /p u b / L i n u x / d e v e l / l a n g / c . a u n q u e muchas distribuciones de Linux lo incluyen d en tro de su paquete de sofiwore. Electric Fence em plea el hardw are de m em oria v irtu al del CPU p ara detec ta r accesos Ilcitos de memoria, y ab o rta ol program a cuando encuentra la p rim era instruccin que cometo una violacin de lm ites de memoria. E! pro gram a logra osto reem plazando lo funcin m al lo e nornml con su propiii (na l i o c y asignando un pequeo tram o de mem oria situado inm ediatam ente despus du la asignacin norm al efectuada, y ol cual no se le perm ito el ac ceso al procMO que Hum a m a llo c . Como resultado de ello, los rebosam ien tos do buffr.r ocasionan una violacin do accos do m em ona, la em aborta vi program a m ediante unu seal SIGSEGV. Si ol sntoma del lector e st confi gurado de m anera do porm itir archivos on mem oria (a ese efecto ejecute u 1 im i t C tan to p ara obtener ol tam a a de los archivos perm itidos en me moria como p a ra establecer el mismo), 1 mismo podr luego u tilizar u n de p urador p ara a isla r la ubicacin del rebajam iento. P ara em plear Electric Fence uno debe linkeur ui cdigo objeto do su progra ma u n a bibotoca especial denom inada l i b e f e n c e . a , y luego sim plem ente, proceder a correr el urogruma. A a prim era violacin de m em ona que en cuentre, Electric Fence efectuar un volcado de memoria.
E je m p lo

V /jS y f X
ejem plo

Este ejemplo m uestra cmo u tilizar Electric Fence. J gc } uljjjcjien cn a.c -o >-il_uso_renfia lvfence s .1 itai_uao_*eioria

-*

g * e r r t a t io n r a u i 1: t e c r e cu iip e a i S gflb -q n a l u so a M s r i a c a r e

---------

A LI0A

(gac) ryn

Starzing crograc

/usr/lacaij le w p ro jo c is /l p e /1 <w r c , nal_usoj n e n o r i s

E l e c t r i c Fonce 2 . 0 . 5 C o p y righ t (C 19 8 7-19 9 8 Bruce e re n s. PCfl_?OCO : aocc SeQ Bm rtatien f a u l : (co^a tfunpBO) $ gee q n al_u sQ _n e3fa {gb} r-un

S tartm o -rocr=n: niectric

i$ryiocal/newp!'o;ects/lo8/20/src7*al_iuso_ne3ari.'.

Finca ,o.S Copyright CO : aocie

(C ! 1987-996 3rjce

^orens.

Caoftulo 20: Un tooWt de depuracin

439

rcl*e< i i y i i SI3SGY. S*5*niation fault. trcpjf (aw t**a:affa , it>cdfg(*\ srcta$*9Sfc *3tc<Jergh )
t - . *rsd*c' g e r c /strcpy. c : 38 ..*yW OS/fit!9ric/JtPcpy.c;3e: so so c-*-. f i U ar dirtctory

i?2Si n e -t *a strcpy (Cs:0>**1ia?8 *octffgn\ jrc*80-i95fc accdeisf!'! 7At ../syM3s.-;e*p;e; itrc o y .c :3 S * e$?i5M < i r * a in (| i - M l_j*o_o* crla.c:27

2 u a jc U in _Ubc_SM rt_ttln (oai**<<M439 4r^--t. irfr* 4 ,o ttt+ m t I r . l f X W M * fini-*W49S4C


^ ld _ ftn i- t< W i3 5 0 < _dl_fiA i> , itack.*0*tifD ffff9ac} i t . ./ y e o * / 9 n * flc /ilD c -it rt.c :7 3

(?35J

El comando de compilacin utiliz la opcin - g para generar jimboloe de depu racin adicionales La pentllfcma lista del listado anterior (gdbj es slo el uxnbolo de p etia n d e comandos/ deja muy e n claro que date un problema en !u lnea 27 do la fundn m am del cdigo fuenUt dol programa o a ijjs o jr a m o r i a. Despus do que haya corregido eno problema, recompile y vuelva a correr el programa, linkeando nuevam ente ol m ism o la biblioteca lib e fe n c e y, si ol programa volviese a abortar, repita nuevam ente la sccuencu depu racin/correccitv'recompilado U na vez que el program a est totalmente depurado, rccompilelo esta vez sin hnkearie la biblioteca de Electric Fence. y el mismo esta r listo p ara ser utilizado.
P E R S O N A L IZ A C IO N O E E L E C T R I C F E N C E

Esper* dir el lector Electric Fonce detect el rebosamiento grande de la lnea 27. pero no logr detectar el desbordamiento m s pequero. Cmo pudo ser? Este comportam iento peculiar 5e origina a p a rtir de la manera en que ei CPU alinea la memoria asignada. La mayora de los CPUs modernos requieren que los blo ques de mem oria esten ahneados con respecto a su tamao natural de palabra Los CPUs Intel x36, por ejemplo, req uieren que las regiones de memoria co miencen en direcciones que sean ex actam en te divisibles par cuatro, de modo que las llam adas a n a l i o c obtienen h abitualm ente trames de memoria ali neados de m an era acorde. Electric Fence hace lo mismo. De modo que un re querim iento de cinco bytes en realidad obtiene una asignacin de ocho bytes a n de satisfacer los requerim ientos de alineam iento de memoria. Como re sultado, el rebasam iento m s pequeo del buiTer se desliz por entre el va llado" A fortunadam ente. Electric Fence te perm ite a uno controlar 1 com portam iento de la alineacin de la m em oria obtenida empleando para ello la variable de enrom o SEF_ALIGNMENT. E l valor predeterminado de la misma e= s u e o f ( i n t ), pero si uno le asigna e l valor cero, Electric Fence podr d etectar rebaja m ientos m enores a ocho bytes. Electric Fence reconoce tam bin otras tre s variables e entorno que perm i ten controlar s u comportamiento: EF_PR0TECT_BEL0W*1 para detectar es c ritu ra s a posiciones de m em orias a n terio res a donde comienza el buffer undsrrunsi, Er_?-0TECT_FRSS*1 p a ra detectar accesos a memoria que ha

)
440

>

>

>

P rogram acin en Linux

sido p re s a m e n te liberada, y F_ALL0\V_MAL LOC_0= 1 , que perm ite que los procesos puedan req u erir de m a ilo c cero bytes de memoria.
E je m p lo

D espus de asig n ar a SF_ALt(3NMENT el valor 0, recom pilar y volver a co rre r el program a, Electric Fence detecta e sta vez el pequeo rebasaaiien to de buffp.r presento en el program a.
S X30rt =f_ALlGMUSTQ

S jec -g iMl_JS0_nit0ria.-3 -o n a ljis o jio n o ria le-*?nce

.'nal_jso_x9noria

c la ctric Fence 2 ..5 C o o yrig n t (C| t997.1393 Brjcs Per?ns


S e g r t n u t io n r a u l t {c o ra duw o dl * gcb i_ u 3 0 _ T ii^ o ria
SALIO

(gcl run
Starting orojrair: /u3r/i,cca:/ro"prci8Cs.'lpe/2Ksrc1 ,na ijjscjjen::ri3
E le c t r ic Fonco 2 . 4 . S CapyrlQ ht \C.) 19 B 7 -19 9 8 3>-jc Fe.-ons. Progra* rec< lv*0 gn#l 3QR0'/, S g n u n ta tjo n ' j u l t . a trc o y a*. |d# s: 'x4 eio.iff3 , a c c d \ srcxlKW95ee *abcdO*> ./ s y ii3 e o s / o o n # ric / tfc p y .c :3 8

. / iy 5 d p s / g o n u r ic m r c p y .c :3 8 : No auc* r i l e o r < r ctcry .

(Q flO ) furo
#1 *2 itrepy (<jat-0x40'.0afft> 'aocCo*. 6rc-x3-t95aS 'acedo') ./ysa*ps/3enertc,'>trcpy.c:38 Jxe**85<2 m r.ain(| 4t nal_i/SO_nr>noria.c:2l x-K)<J3fcb3 Ln _tioc_5tart_iTain (mnln0x848ew <nd:n>. #rgc*1, .KQV'-axaff'f334, Ifllfx048660 < _ in u > , ftnlx6ft495ac < _fLnt>. rtld_nm*ax40a356 <_dl_r:ni>, 3tacK_ondexDffff92C> t ./iys<!ps.'3eneri,'litc.star.c:78

<*> Como se puedu ap reciar ea a idida anterior, Electric Fence ahora delecta el pequeo rebajam iento de buffer. Siem pre recomiendo asignar a la variable de entorno EF ALIGNMENT el valor 0 y utilizar los dem s variables com enta das de m anera de detectar la mayor cantidad de errores que resu lte posible.
C O N S E JO Ourante la e:saa Je desarrollo oe un programa, resulta ana buena prctica nortear siem pre al cdigo cbje:o del -ismo a biblioteca 1 loofonce para as poder detectar ios e--o e s as rraioria que de ocra rr< cC Otal vez no ouo.'esen ser d&iectaoos. OebOO TOcisamente 3 tas cuastior.es referentes a la alineacin de memora oue se^oamos ce comen:

} Cactolo 20: Un toolkit de depuracin 3B|

Empleo de mpr y mcheck


La o tra h e rra m ie n ta de depuracin de m em oria que considerarem os se r el paquete de softw are mor de Taj K hactra. que se puede descargar desde cual q uier sitio de- im agen M etalab ( f t p : / / m e t a l a b . u n e . e d u /p u D /L in u x d e v e l la n g :c -r.or- 1 .3 . t a - . gz/. E ste program a puede se r utilizado pa r a localizar fugas de m em ona, pero ao localiza errores de corrupcin. A dem as, m pr genera tam bin e stad sticas y patrones de asignacin, aunque e stas lu m as prestaciones no e s t n cu b iertas en esta seccin. E l mtodo que u tiliza " ? r p a ra llevar a cabo su ta r e a ao recurre a dem asiadas sutilezas: el program a reg istra todos los pedidos do asignacin y de liberacin de memo ria en u n archivo apropiado que luego procesa utilizando program as, u tilita rios que torm an p arte del paqueas. EMPLEO DE mpr P a ra u tiliza r ~ or. sim plem ente descrguclo y complelo. E ste p aq u ete de softw are incluye varios p ro g ram as u tilitario s y u n a biblioteca esttica, I b ~ D r. a. que debe 3er v in cu lad a al cdigo objeto de su program a. A segre se de u tilizar el ufcA -g con el n de g enerar smbolos de depuracin, por que algunos de los program as q u e in teg ran m pr as lo requieren. Recuerde del capitulo 1. que In ip r lin k ea al cdigo objeto de m aI_uso_m e l o r i a la biblioteca li b f n p r . a . y que -LSHOME/ L ib adona al comienzo do In ru ta do bsqueda de bibliotecas la expresin $H 0M E/iib. Luego de que el program a e a compilado y linkeado. asigna a la variable do entorno 3MPRPC el v a l o r -r e rp e -7 a l_ u s o _ a e m o ria y a S.MPRFI el valor " c a t > m a l_ u S 0 _ i:e n o ria . icg * Cuando a e s t ejecutando, mor utilizn SMPRPC pura re correr y exhibir la cadena do am ad as pora cada pedido de asignacin y de liberacin, m ien tras que SMPRFI define u n pipolme (secuencia de pipes) do comandos pora re g istrar y, opcionaim ente. filtrar la saiida de mpr Term inados estes pasos prelim inares, proceda a ejecutar el program a. Si to do funciona de acuerdo con lo planeado, se debera term in ar con uu archivo denom inado m a i_ u s O ja e n o r i.a - la q ubicado en el directorio co m en to . El mismo p resen ta r un aspecto sim ilar al siguiente:
t : U < 2 2 4 e : i 3 4 5 t W : 1 3 4 5 U 8 U : 1 0 : 3*S6t792 n : I U S 2 7 5 4 6 9729 : 1 3451 < 8 2 6 :5 : 1 3436S8B8 ' : 3 *5226 t * : 13 4 5 2 M 6 3 : ' 3 * 5 1 * S : ! 34 565383 i : : > 4 5 2 2 5 0 5 :13 4 5 6 2 2 5 . 345 : 5 : T34565568 t : 1 3 4 5 2 2 6 1 4 :i 3 4 5 2 5 6 J : 3 4 5 1* 9 7 5 :1 34 565833 f : J 3 4 5 2 2 6 14 : 3452A 36S:13 4 5 1 4 9 8 7 :1 34.565338

E sta informacin de registro no es de mucha utilidad tai cual est (In docu mentacin de! program a m pr explica el formato, si es que llegase a e sta r intere sa d : ei i mismo'r. la mism a sim plem ente provee la m ateria prim a p a ra que i os program as de utilidad de mpr. que procesan el registro obtenido con el fin ce crear informacin que resulte m as inteligible. P a n visualizar las ftigs de - - *al como se ilustra en ei siguiente ejemplo. n e v e r a em pleando mpr a fin de ubicar
cjc m pio

u n a tu g a de mem oria.

442

P ro g ra m a c i n e n Linux

S ge*

i l_u sa_a eno ria.c -o iiaI_usojie<Taria -Iro r l / js r/ lo c s l/ lib

5 j x c o r t UPn?c= ta ^ o c M l_ u s o _ n e o r ia S w p o r t M K fl= i--c a ? > r a i j i s a j w w r i a . l o g

S ..'nal_u6o_!tetroria
Cfl_POCO : abcae ac.nck; t*nory ciocard aas: and o aliocatad blocK * c o .tj (cor* dunped)
S a or n a l_ JS O j i M o r : a < -nal_uso_nijJK>ria ira rlk

n *atn (a l _u#o_nwor lo . c , 1 9 ): 10 : 13456992

La opcin f inform a el nombro dul urchivo y ol nm ero de linea donde mpr detect la fuga de memoria, La salida iudica que la linea 18 de la funcin m am do m al_ u so _ m em o rla .c requiero do m al lo e 10 bytes m em ona que n unca vuelve a liberar con una llam ada a f r e e (mpr y su s utilidadea empluon nm eros decimales largos para m an to n er el registro de cada pedido de asignacin y liberacin de memoria). Observando ol listado de cdigo fuentu, uno puede verificar que efectivanw nte os as.
Usando m ch eck

Tal como se mencion recin, m pr, por s solo, no puede detectar lon error** de corrupcin de m em nnn, Si bien t>sto os as, mpr incluye la funcin ticneck de la biblioteca m a llo c do GNU, que lo perm ite a uno detectar re bosam ientos de bufier, rebmmmientos negativos (escrituran n to n as do m e m o r a anteriores a la ubicucin del comienzo del buffer) y liberaciones repe titivas del mismo bioquo lievudas a cabo por llam adas superluaa a f r e e . De- ru?cho, mpr compila mcheck on l i b m p r . a como opcin predeterm inada. Las buenas noticias son. entonces, que loa rabaam iantos de buffer, tan to po* sitivos como negativos, hacen que el program a aborte a menos que uno ins* iruya especficam ente a mpr de no u tilizar m ch eck . Las m alas noticias, a su voz, la constituyen que n c h e c k no es un program a dem asiado informativo: se Limita a se a lar un prohlem a y deja que sea el program ador el que d ete r mine dnde h a ocurrido el mismo. Compilado ju n to con m ciieck , el progra m a de dem ostracin aborta cada vez que uno castiga dem asiado la m em ona.
E je m p lo

EJE M P LO

E ste ejemplo m u e stra varias corridas de m a l_ u so _ m e n o ria . compilado con m check. con cada corrida habindose corregido el erro r encontrado en la co rrid a previa: s ./nai_u80_inoria
POS.POCO : accde n<ycx: so>y cloccersC ssst and

i f allocated biOCK

S . 3ai_iso_n8(T<ria
pos

POCO

: accda

Caoftulo 2 0 : Un toolkit de depuracin

443

?W_WJCH3

: aCC?3*

8gjausauRT 0 :

:c * :-

c*scry clsetf'K t ir f s r g lliOC 3 t<l OliKSt

l l
S .lu tjiv _ t v }r i3 PO_POCO : > :

PMJWCHS
cft*cX: biocx

cdftfreri t ;c

S_0B2A.CORTO:
La correccin del resto e los errores se d ja eomo ejercicio p ara o lector.

Lo que viene
El lector comenz en este capitulo a a d q u irir experiencia con ln depuracin de progr.imaa Er. .*1 capitulo sim ie n te, "D istribucin do softw are', aprendor un p ar de mtodo p ara d istrib u ir su softw are ya libro de errores. En el ltim o captulo, re u n ir todo lo aprendido a fin de en co rar el proyecto do program acin ya anticipado, u n a base do datos de CD do msica.

21
Distribucin de software
H asta oS mejor y m s rpido program a del mundo se volver inutilizablo si resu lta e x tra o rd in a ra m e n te difcil in stalarlo o hace que el sistem a no pueda volver a *er utilizado una vez que se lo instala. E ste tem a, h ab itu al m ente omitido en los textos sobre program acin, cubre el espinoso procero de la distribucin de software. E ste capitulo cubre los siguientes tem as: Empleo del comando t a r Utilizacin del comando g z ip Uso del comando i n s t a 11 Empleo dol adm inistrador de siste m a RPM do Etod H at La distribucin de ioftivarr consista *m la creacin, dintribucin, instalacin y actualizacin de softw are ta n to dl cdigo fuente como de toa archivo btn an o s. Este capitulo exam ina el proyecto t3 r de GNU, ias utilidades g zl.p ) : n s * a l l y el A dm inistrador de S iste m a de Red H at, RPM. Todos los p ro g ra m a s d e e ste c a p tu lo p u e d e n s e r e n c o n tra d o s en el jitio Web f i tT p ://* w * .B C p .C G f f l/in f o bajo ol n m e ro de ISBN 0789722151.

j
448

>

>

>

>

>

'

>

>

'

P ro g ram aci n en Linux

5:c.T3SoLv.conf etc/snc.conf sM.'sysics.cor.r Obsrvese que t a r no elim ina ninguno de los archivos originales, sino que sim plem ente crea ur. nuevo archivo t a r . w / 3. P ara croar un archivo comprimido, sim plem ente a ad a 2 a ia lista de opciones. Tradicionalm ente los archivos t a r comprimidos, o zipzados, se desig nan aadindoles . gz al finai de 3u nombre. Tam bin se les da a m enudo la extensin . tg z . C ualquiera do las dos opciones es aceptable. Por razones de coherencia este captulo a ad ir .g z al final de! nom bre del archivo.
S ta r C i v f P i_ t a r .t a r .g z . o t c r . c o n f

JEVPI.0 .. f
^1

atc/dosanu.conf itc/gprt'root-Conf
t c / n o s t .c D / if

TTToa

tc/lfl . a f
ts.'issano.conf

Otc/ld.JO.CCfl
te/IO.CMf

tc/logrotatcar: Cannot au<j f:L atc/guota.conf: Pontusioo tc-nod tar: Er'-or extt dl3y*d -ott grvl<ms orrora wo. con*
:c/yJlcsj,ccif

i opcin v hace quo t a r sea verboso, ca decir, que liste Ion archivos que va aadiendo al archivo de em paquetado. Aqu de nuevo, no hay problem as en p asar por alio loa errores quo ae generen debido a violaciones de acceso de loo archivos a ser empaquetado.
CONSEJO
La utilUttfi de ia obcio /. para comprimir jn arcftrvo t a r "ralenttta' de alguna mare ra la operacin de c a r , cero Ahorra tipeo joroue uno no tienen que ctniVt ur seg_nao :omando de ntar faz. g z lp . par.i comprimirlo. Por otro Indo, la llamada a g z lp ca co rno resultado una compresin trecho mejor, piro ae ceoe tipoar un comando adiciona, oara nacerlo. Como loa progrnmadoros son seres dmosos, 'as makerlles general mente incluyen un tar^et doncminaflo aist que crea an archivo ta r con-.p-iHao con g j i p . stc reduce la cantidad do tipeo que uno tiene que efecta/ y os conyament*. a.-Ticer^rte je aeco pear maxe d io t para que ur oaquote de sonware quede listo para ponerlo en ,a red de modo que toco el mundo pueda descargarlo.

A segrase e com prender !a diferencia e n tre g z ip . z i p y c o if p r e s s . g z p es la u tilidad e st n d a r de com presin en los sistem as Linux. Es ta m bin la utilidad e st n d a r de com presin em pleada cuando se em plea ia op cin z de t a r Los archivos com prim idos por medio de g z i p g en eralm en te tienen una extensin .g z . A.su vez, z ip crea archivos de tipo PKZIP, y constituye u n a a lte rn a tiv a g ra tu ita a las utilidades PKZIP. Los archivos

CaafaO 21: Distribucin de software

443

c o m p r a d o s em pleando z ip tie n e n u n a extensin . z ip . F inalm ente, el pro gram a compresa es u n a de las u tilid ad es originales de UNIX p ara comprim ir archivos. U n -archivo comprimido p o r medio de c o m p re ss g eneralm ente lle va u n a extensin . Z.
ACTUAL!ZA.CICN DE ARCHIVOS t S T

A esta a ltu ra uno cuenta con u n archiva c a r correctam ente em paquetado y comprimido Pero, sbitam ente, se da cu en ta que omiti incluir la corres* pendiente documentacin. Porque i a escribi, no es as? No se preocupe, se puede fcilm ente a ad ir nuevos archivos a s u archivo t a r lo actu a lizar las existentes) em pleando las opciones de t a r p a ra ag reg ar o actualizar P ara agregar su documentacin recin escrita al archivo t a r comprimido que se cre al cabo de la serie de ejem plos anteriores, puede em plear la op cin r o la opcin u. La opcin r (re/Jvs) le indica a t a r que a ad a I03 a r chivos que sean especificados al final del archivo t a r . t opcin u \update). z su vez. sim plem ente actualiza u n archivo p resente en el archivo t a r con una nueva versin del m3tno. N atu ralm en te, t el archivo original no so en cu en tra presente, la actualizacin p a sa r a constituir dicho original.
E je m p lo

Este comando ta r utiliza u p ara a c tu a liz ar los archivo.- presentes con copias nuevas.
s t* v r i t:_ :* r f ttc r .c o n f

L a >ahda es idntica a la generada cuando ne creo el archivo t a r , du modo que no -se la repetir aqu. O bsrvese quo osto comando no utiliz In opcin de compresin. Z. Esto 50 dobe a que el ta r de GNU, por lo menos h a sta la versin 1 12. no puede actualizar archivos ta r comprimidos. Como rcnultado de ello, fue necesario descom prim ir primoro ol archivo t:tr por medio del co m ando g u n z ip m i _ t a r . t a r .
ELIMINACIN DE ARCHIVOS PRESENTES EN ARCHIVOS t a f

P ara elim inar un archivo presente en un archivo t a r -je debe utilizar la opcin - - C e ie te (cor. loa dos guiones ad elante y ia palabra completa, cofla que nadie pueda alegar que se equivoc ai opearla) y especificar a continuacin el nombre de los archivos que se desea eliminar. Lo mismo que con la opcin u de actualiza cin. uno no puede eliminar archivos presentes en un archivo t a r comprimido.
E je m p lo

Este ejempio elim in a p n p . c o n f y n o s t . c o n f del archivo t a r creado er. ejemplos anteriores, i ti'- are.conf Observase que a operacin de eliminacin de arciuves, uu oJw 2 cgsspntiS -in teriorm ente, no posee una opcin de u n a sola letra; uno debe utilizar - - d e i z e.

Empleo del comando install


1 comando i n s t a l l es u n a especie de comando Cp potenciado. Adems do copiar archivos, i n s t a l l establece sus perm isos y, si re su lta posible, sus

Programacin en Linux

propietarios grupos. Puede tam bin crear directorios de destino si stos ya ao existieran, ta l como lo hace el comando xco p y do DOS.
In v o c a c i n d e i n s t a l l

i n s t a l l 3e utiliza norm alm ente en m akefiies como parte de una regla que ie establece p ara un ta rg e t denom inado (algo asi como) i n s t a l l . Puede ser empleado tam bin en ''scripis" de interfaz. La sin tax is del comando I n s t a l l es la siguiente: i install lo p co flj...|| fuentd(...! dostino donde f u e n t e consiste en uno o ms archivos a se r copiados y d e s t i n o es. ya sea el nombre de un archivo targot o, si en f u e n t e se especifican v an o s archivos, un directorio o p c o n puedo se r uno o m s de los valores listados en la tabla 21.2. Tabla 21.2. Opdonos d linea de comando de Install.________________________
Opcin
Q

Argumento
q ro u p

Descripcin____________________________________________

Asigna como grupo propietario do lo archivos al GID o nombre de /upo oapocificado en g ro u p . El GID p/odowmmnco or. o1 dc< pro ceso pndro que llamo a I n s t a l l . Asigna como U3unrto p/opa'tario do loa archivos o-1UID o nombre oe usuario especificado en ownor, El propouno potolorminado es rool. Establec- ol modo de los archivos (sua permisos oe acc* 80 | de acuerdo al valor octai o simblico especificado in n o d e . i modo de archivo predeterminado en 755. or. decir IcctuM/csaitura/cjocucin. para ol propietario y 'ecturo/ojocucln para al grupo y o rotto de los ufiuonos.

o m

owf.ftr mode

Para especificar o e s t i n o como directorio se dobc em plear la sintaxis siguiente:


* i n s t a l l -<l {a s c io n | . . . | ] d i r ( . . . ]

El sw itch -d te indica a i n s t a l l que cree ol directorio id. -ncluyendo cualquier directorio padru presente, y le asigne ai mismo alguno de los a tr i butos iistados e a la tabla 21.2 o en su defecto los atrib u to s predeterm inados
E je m p lo s

T e m p lo

! -U r |[7]l ^ rE \

1 Este ejemplo e st tomado del makoile de gdbm, ia biblioteca de base de H^too do G:TU. Luego de expandir algunas de las variables de m ake, el ta rgot i n s t a l l es:
in s ta ll. libscd.a 3 dt1n.i 1 gcfcn.inro

install -c * 3- licgdfo.i S(1m i ' / I ocoo.a in stsli c b e-i-t saan.n 5(inclueedri/gdl>i.n in stall -s -n 54* S{9rcair}/gdbn.info 5(infodir}>'g0Dn.inro Las vanab les de make l i b t i r , i n c l u d e d i r , s r c c i r y i n f o d i r son, res pectivam ente, / u s r / l i b , / u s r / i n c l u d e , / u s r / s r c / b u i l d / i n f o y / u s r / i n f o . De modo que lib g d b m .a y gdbm .h se r n de lectura/escritura p a ra el usuario root y de slo lectura p a ra todos los dem s usuarios. Ei archivo lib g d b rn . a es copiado a / u s r / l i o ; a su vez g d b n . h, el srchivo de encabe zado, term ina en / u s r / in c lu d e . El archivo eTexino, gdbm. in f o , es co piado desde / u s r / s r c / b u i l d / i n f o to / u s r / i n f o / g d b n i . i n f o . El conar.rio i n s t a l l sobrescribe los archivos existentes del mismo nombre que

Cptete 21: Distribucin de softW3ro

451

encuentre en su camino. La opeda -c se nicluye por razones de compatibili dad coa versiones ar.tenares de i n s t a l l e n otras versiones de UNIX. E lector debera incluir e s opcin en la inea de comandos pero, en la mayo ra de los casos, la misma ser ignorada. ^ % i_ ly \1 / /g j cjcm p '. c 2 E ste ejemplo crc-a un conjunto de directorios debajo de / tnrp y asigna algunos modos extraos a los archivos que copia i n s t a l l . A menos que ei leeto r tenga permisos no habituales sobre / tn?p. este programa debera ejecu* tarso sin m ayores problemas. El escrito utiliza algunos de los archivos do la distribucin de fuente ' i i e u t i l s presante en c! sitio Web perteneciente a este libro. Si asi lo prefiere, elimine todo el directorio / t a p / Lpe i n s t a l l despus de haberse completado el programa y se hayan inspeccionado los a r chivos que fueron almacenados ert al mismo.
/ ' c a t - f <J: a r c h i v o * l/ 6 1n /$ n

te InXiirmt:

lo l - w t a U . V t . V

lp f lm :a ll.t A

. J#ocn**.rit i3 # r-. r i I M t a l i UMC*

JKSTau.'Sl^uctt irn talli S*C./rc lor os in :e 3a do siw su u -e -o -o sus ./o


s : r c a tu o s e s w i s K r . z $ ih e / * : b

lf

l S V S & ro o t | ; t fit f

? o r OP? ifl StC- - f l

o: /tC/jroi*)
O 5USft 5 SGft? JL3 S 2 V

00
SWSTAU. -C -2 JIM T A U . -a M
3 VSIP * .p U'.-SGv

Wl
:ho i s t i s c m o a no funcionara s i quien i* rrc la v a rlo riMt!*

------ ------ _ ----------

s-

^ w r - 8 ro i usuario rcor

SALIO*

a n w r- x r-x : rrx r-x


P-X

2 '< u rt_ a il 5 <nrz # a l l

u s rs u rs

:0 2 J u l ae a 4 : u

3 2 * J i 20
15 7 2 3 - e l 20 >54:-4 3 n s 2 < n r .c '

** *
- X - I - X

1 a r'.ja lL
1 K a rt I I

usar*
s a rs
u se rs

!W *= J u l 2<J 0 4 :u

;p.^rp.c*

5522 J u i 20 0 4 :i* c h w j.c * : i 2 : J u l 20 0 4 :! * c b o n .c '

-x

- i

_x

; f c r t rail

>

>

>

nacin en nux

X X X -X - X X X -x -X -X -X X -X X X
3U -

l J c u r tjn U 1 fcurtjtail
1 <urt_*3il 1 xurt_wall
i

users users users users osees

2454$ J1 28

i* :'*

copy.c*

6354 Ju l 28 04:-4 co-f.asn.c* 2521 J u l 22 34; :i 38SS4 Ju l

k u r t jM ll

20 24::4 20.c* 29320 Ju l 2? face*

?3S5crd;
* :<3 y i ia n e / lK ir t w a U / p r o je s is / I w / 2 1 / s r c * ./ ic - in s t a ll.s .l

* 1$ -t /iTO/lpe-install
m i p i r -i
2 root

xfs

1024 J g l 28 0 4 :2 1 f*

* 1 l /tue/lpe iw a iW x f s to: i *.W 2


-

- -

-i

i root ra o t ! root
1 roo t 1 roo t 1 rsot 1 roo t

6 7 3 12 J u l 23 0 < :2 1 C.PO X f* XT5 Xf5


Xfs

75552 J u l 23 < :2 l (Je.SQ 7 4 1 1 7 J u l 23 3 4 :2 1 t i . 30 99148 J u l 23 0 4 :2 1 OJ-PO 77667 J u l 20 0 4 :2 1 r r .p o 6 5223 J u l 2 * 0 4 :2 1 KO.PO 78329 J u l 28 0 4 :2 1 n l.p o 0 7 10 3 o u l 28 0 4 :2 1 no.po 07227 J l 28 0 4 :2 1 p l.p o 78743 J u l 20 0 4 :2 i P t.p o 6BS34 j a l 20 0 < :2 l /u.po 60906 o u l 28 0 4 :2 l sk .p o 6 5 7 14 j u l 20 0 4 :2 1 s l.p o 66062 J u l 28 0 4 :2 1 s w . p o

- - - - - -

- - - -

x fs xfo xfu x fs X fi x fs
Xfs

1 rnot l rs o c 1 ro o t 1 ro o t

- - -

- -

1 rco t

l rsot 1 ro o t

x fs x fs

El inters aqu se halla un l com portam iento do i n s t a l l . de moco que no pierda au tiempo tra ta n d o de com prender la sin tax is de la interfaz, Observe, sin embargo, que el segundo bloque de cdigo fracasar si no es co m d o por el usuario root. El prim er bloque de cdigo crea tres directoras asentados er. /tra p : /tmp/lpe-install/13,/t.-np/Ipe-install/20 ,y c.^ p .'lo e i n s t a i l / 3 0 , y copia todos los archivos de cdigo fuente C desde el subdirectorio s r c {fuente) del directorio corriente de trabajo a cada uno de los tres subdirectonos. La opcin o asigna la propiedad de los usuarios sobre los archivos, que e n este caso son rep etitiv as porque el propietario pred eterm i nado es el usuario que ejecuta el escrito.

Caoitulo 21: Distribucin de software

453

El segundo bloque de ccdizo crea u n conjunto de directorios cuyos nombres co rresponden a cada uno ce los grupos definidos en su sistema. Cada directorio es propiedad del usuario predeterminado, pero las propiedades asignadas a ios grupos son Las mismas que el nombre del directorio. Todos los archivos que terminan -in . po son copiados desde s r c al directorio apropiado, establecien do nuevamente e't grupo propietario segn el nombre del directorio y haciendo que les archivas sean slo de lectura para el propietario/usuario Ningn otro propietario o grupo tienen algn tipo de privilegio sobre estos archivos. Este empleo de i n s t a l l es extrao, y los modos de archivo, tal como lo mues tra el listado, son inusuales, pero el ejemplo ilustra adecuadamente la razn por la cual i n s t a l l es un mejor comando que Cp y cmo se lo debe utilizar.

Empleo de RPM
El software administrador de Red Hat, RPM, en un sistema do empaque do software abierto, general y potenuj. utilizado por muchas distribuciones do Linux, incluyendo (entre otras) al OpenLinux de Caldera, el S.u.S.E. y, por supuesto, la distribucin de Linux de Red Hat. Se lo emplea con mayor trocuenaa para Lir.ux. Pero existen versiones disponibles dol sistema para va rios siatemaa operativos anea a tTNXX, incluyendo a Solaris, SunOS, HPUX. SCO. AIX y el Digital UNIX. El tratamiento que se brinda del RPM en este captulo se concentra en la crea cin do paquetes de cdigo fuente. Si el lector so encuentra interesado en cuestio nes ms triviales tales orno por ejemplo instalar, actualizar y eliminar paquetes de RPM. lea el excelente libro de Ed Bailey Mximum RPM. Puede tambin dingir nu navegador hacia ol aitio Web h t t p : / / www. rpm. o rg /, desde dondo podr descargar la ltima vencin de RPM. obtener documentacin completa, FAQs y KOWTOs. y hasta descargar una versin digital de dicho libro.
NOTA
Se recorroertta fifAtcamenTe aocuirir Munuffl RPM y reoxnpensar de esa manera tarto ai autor como citor por nacerlo disoomte o*n cargo El lector encontrara asiKtvno J'./ -iCoc<y oe '-ni coca ^ o rin a a< s< .Oto * j ma|or que tener que -eferirsc J una veruon e e cri'--.

R e q u e r im ie n to s m n im o s

Para crear una RPM el lector necesitar disponer antes que nada del propio RPM, luego del cdigo fuente que desea preparar para ser distribuido, un archi vo rpm r e en el cual establecer algunas opciones predeterminadas de RPM que controlan su comportamiento, y un archivo de especificaciones para controlar el proceso de constriccin del paquete de software. Deber tambin contar ya con un entorno de desarrollo plenamente funcional (compiladores, herramientas, edi terv- bocaditos y gaseosas, caf y tedo lo dems que necesita para sentirse cmo do). y adems su oiga fuente debe haber podido ser compilado sin problemas. Antes de continuar, sin embargo, resu lta .->^;.dal poder transm itir la filosofia a la que responde RPM ste siempre debe comenzar con ruentes p rsti nas. Pristinc, en este contexto, significa cdigo original, sin ningn parche, tal como provino e quien lo desarroll. RPM se halla diseado para permi-

P r o g r a m a c i n e n L in u x

trle al usuario aplicarlo parches al cdigo fuente original. E sta prestacin le perm ite a uno utilizar RPM p ara personalizar el softw are a ur sistem a espe cfico o corregir los errores cuya solucin conozca. El nfasis sobre fuentes stn modificar perm ite que usted o sus usuarios siem pre puedan comenzar una construccin desde una base conocida y personali zarla luego p ara hacerla ad ap ta r a determ inadas circunstancias. Como dcsarrolladorde software, esto lo brinda considerable flexibilidad con respec*.o a la creacin de software til y confiable y adem s u n valioso nivel de control sobro la m anera en que su softw are resu lta finalm ente compilado c instalado Todo esto puede condensar en do5 sim ples reglas: 1. Siem pre comience creando un RPM con archivos de cdigo fuente sin modificar. 2. Aplique parches donde sea necesario p ara ad ap tarlo al entorno on qui se em plear.
C re a c i n d e u n p a q u e te R P M

La prim era creacin quo se llevo a caho de un paquete RPM puede resu ltar algo desalentadora. A fortunadam ente, la m ayora del trabajo a realizar salta a ia vista. La parto ms im portante de la creacin do un paquete RPM. la ge neracin de un archivo de especificacin, deb* aer efectuada una ola vez. Despua que haya .sido creado el archivo de especificacin, uno pasa la mayor p arte del tiempo haciendo lu que quiere hacer, m an ten er el program a. Slo resultan necenanad pequeriao modificaciones al archivo de especificacin.
CONFIGURACIN DE UN RPM

1 ard u v o rp m rc controla cus todos los elem entos que determ inan el com portam iento de un paquete RPM. Su ad m in istrad o r de sistem as puedo d is poner de un archivo rpm rc global en / e t c . Si usted quisiera a lte ra r uno o m s de las configuraciones globales del archivo, cree un - / .rp m rc que con tenga sus configuraciones preferidas. A ntes de comenzar, sin emborno, tal vez desee ver la configuracin corriente del RPM. Esto se puede lograr em pleando el comando rpm show rc.
E je m p lo s

1. E sta es la configuracin predeterm inada do RPM versin 3.0.2 en Red Hat 6.05rpn shcwrc
fiCHITSCrwS AtO OS:

^
.- L jJ * ...* ^
sal

: 336 cM pariD L e O Liia a re n a : 1686 S36 w iig ir>86 -loaren o u iid o s : Linux rc a p a tiD le b u lld o s 's : lim ix
m s x c ll arcr. rs -a ll es
c :a ? a t i 0 I ai-ch
c s o a a t ic ic es 3

auiid ren

------------oa

: :
: i66
:

U36S -r.ux
1436 i3 3 6 n oar:fi
L in a *

^rVflC VALUES: ta c r o fiie i : /L -sr/iib /rp ft.'n acro s - / u s r r p s / 1686 - U nux / n a c ra a : / e t c / rpn/ raemos rp o /iS 8 S -Iirvx> 'raero s:-*/.rp iT O 3cro s

Capituio 21 Distribucin de software

4 55

o p tflsg 3

: -92

- 1 4 : & u e o r f ig u r ( l C :)

V_ii&xooii} -rosy -^o<-c9


S{__ac lo c a l)
V _ * u t r M * r)

S(_au:a*aV}

M_tvtown?}
M C:_jyxS!r- p * J ' X * u o M C*J;} cd V -C*> )

S u sistem a puede llegar a ten er configuraciones ligeram ente diferentes. Tal como * puede apreciar, la salida e st dividida en do5 seccioues urquitectura y configuradones de 3istema operati%-o, las cuales definen el entorno de construccin e instalacin, y valores de ^pm rc. que controlan ol com porta m iento de RPM. El archivo de configuracin global, / e t c / r p m r c , debera s e r empleado p ara establecer configuraciones a nivel de sistem a. El archivo local. SHOUE / . rp m rc, contiene valorea especficos al usuario que instruye un RPM. E n la m ayora de los casos, son pocon los valores dol archivo rpm rc que requieren cambios. C O N S E JO
2 .s'O' m is z&~.n cpst se camo>a en JmCVE/ . r-omrc es ol nomoro del empaquetador &r. e^osrao. coryj w*o 3u e um cin nace/ eso erectamente en el archivo de e&peocaor no fr^cno sentido ncelo aqu. 3 afole^ia de utillMr un arcnivo . rp e rc persona! raco es o^-e uro o^ece o je a rs e -je lo que contiene y propagar as-' iv formaoOn -nyrtc?8 soore ccnst'uec.-n oei iecut3c<e o ia gento ujo emplee su RPM. Resana mas a w . i i e ate^erw ~r / e tc / r p n rc a as e*orcaciones Rbales

LA E S T R U C T U R A O E UN A R C H IV O D E E S P E C IF IC A C I N

El archivo de especificacin, despus dei cdigo fuente en 31. constituye el elem ento m s im portante de un RPM porque el mismo define qu es lo que se va a construir, cmo construirlo, dnde in sta larlo y os archivos que con so n e el paquete El nom bre o cada archivo de especificacin que uno crea deb en a se r asignado de acuerdo con la convencin e st n d a r sobre nombres. p k g r a " e - v e r s i n - r e i e a s e .s p e c . donde pkgnam e es el nombre del pa quete, versin es el nm ero de versin, tp icam ente en formato x . y . i . y r e i e a s e es el nm ero de edicin de la versin corriente. Por ejemplo, ei nom bre n c u r s e s - 4 . 2 1 8 - s p e c se puede desglosar en ver sin 4.2. edicin nm ero 13. lo que indica que sta es la edicin o 'lan za miento" nm ero dieciocho de ;a versin 4.2 de ncurses. Los nm eros de edi cin son em pleados por los productores de softw are p ara indicar cuntas veces h a n construido u n paquete especifico. Los nm eros de versin, a su vez, son establecidos por el encargado del m antenim iento del paquete. Cada archivo de especificacin consta de ocho secciones:

>

456

Programacin en Linux

Encabezado: la seccin encabezado contiene informacin re to rn ad a por las interrogaciones del RPM. tales como su descripcin, versin, ubica cin del cdigo fuente, nom bres y ubicaciones da los parches y el nom bre de u n archivo con iconos. Preparacin: la seccin de preparacin consiste de todas la s prep aracio nes previas que tengan que ten e r lu g ar a n te s de que pueda com enzar el proceso efectivo de construccin del ejecutable G eneralm ente, esto e3t lim itado al desem paque del cdigo fuente y a la aplicacin de cual quier parche que pueda existir. Construccin: ta l como seria de esperar, la seccin 3obre construccin lista los comandos necesarios p a ra com pilar el softw are En la mayora de los casos, este es un solo comando raake r pero puede se r ta n comple jo como uno lo desee. Instalacin: otra vez, el nom bre de la seccin h abla por s m ism o La seccin de instalacin lista el nom bre del comando, ta l como por ejem plo make i n s t a l l , o el nombre del ' script" de interfaz que lleva a ca bo la instalacin del softw are luogo que aea com pletada exitosam ente la construccin. Escritos do m stalacin/dosuistalacin: estos escritos, quo son opciona les. son com do3 en e! sistum a del uauario cuando el paquete es uiatalado o eliminado. Escrito de verificacin: babitualm ento, las ru tin as de verificacin de RPM son suficientes, pero si n in g u n a de ellas satisface su s nccesida dos. e sta seccin lista todo Ion comandos o usen tos de interfaz quf* com pensan la limitaciones de RPM. Prolijamicnto: osta seccin ad m in istra todo p ro lijam en te post-construccin que deba sor realizado, puro raram en te resu lta necesaria porque RPM realiza un excelente trabajo do limpieza luogo de habor concluido. Lista do archivos: componente esencial do la instalacin (un RPM no se puede construir sin dicha lista), e sta seccin contiene una lista de los archivos que forman su paquete, establec* su s atributos de archivo e identifica 'os archivas de coniiruracin y de documentacin.
ANUSIS DE UN ARCHIVO DE ESPECIFICACION

El iguicntt archivo do especificacin est Lomado del paquete do d istribu cin de softw are x earth que viene con Red H at (5.0, / u s r / s r c / r e d h a t / S P S C S /x e a r th . s p e c . La p rim era p a rte del archivo de especificacin es el encabezado: Stmcary; A n x display o tn Ear .n fro pace. Vine; xaartn versin: i . 3 3laase: 12 Copyrififtt: HIT Group: TiSBnei'ts/Graorucs Seurca: f:p://cag.lcs.att.e<;i;/puW tuna/xeirtn-l .a.ta r.g i Pstcii: <eartn-t .o-r<ana:.patcn SuiiORcc:: /V3r/to.'xaarth-roct

) Casuio 21: Distribucin de software 457

.3 x ii'cc- l y j - j n ;an<3 gcspntc tnat ano* a glct* of *.ne 3 - ireluding na.-^.-s or najo.- c i z m i'4 3ec -at Sctwar.. Ta
c a rta 13 c o . - 't c t l y s t a d t f ?<r t n e c u * -? r .: ; c 3 : t i s n o f T fie S u n , and th e

cisoIiy#(l iaa;e is -M 3:ec i r y f*.ve irtvtes.

Este es el n al de la seccin de encabezado. Tal como se puede ap reciar se provee m uchsim a informacin, la cual puede ser obtenida desde la base de datos de RPM em pleando las potente? capacidades de interrogacin de RPM. Tanto la informacin sobre el nom bre como la de I0 3 nm eros do v er sin y edicin afectan de m anera d irecta el proceso de construccin. La siguiente seccin de un archivo d e especificacin es la de preparacin La m ism a define los pasos necesarios p3ra p re p ara r e! paquete a ser construido: SCffS *3**-0 3
c a tc h :fl

La soccin de preparacin es b a sta n te simple: la mism a aplica un parcho, en este caso / u s r /s r c /r e d h a t/ S O U R C E S /x e a r th 1. S ) r e d h a t . p a tc h . al cdigo fuente virginal. Eso es todo. Bueno, la situacin es realmente un poco ms compleja. La lnea % setup es un macro de RPM. El mismo lleva a cabo varias tareas, en esto ca^o. efectuar un cd al directorio BUILO. elim inar loe rem anentes de previos intentos de cons truccin (si es que loa hubo), descom prim ir y extraer el cdigo fuente, que ea un archivo t a r ap ead o , /u s r /s r c /j- e d h a ? /S O U R C E S /x e a r th - 1 .3 . t a r .g z, efectuar otro cd del directorio exim ido y modificar recuraivam ente las propie dades y !os permisos en el directorio extrado y sus correspondientes archivos. Esta es a m anera ms simple en que puede ser utilizado el macro %S0tup. El mismo acepta una diversidad de argum entos que modifican su comportamien to. aunque en la mayora de los casos al comportamiento predeterm inado es lo que se desea y todo lo que se necesita. Luego de la seccin sobre preparacin viene la seccin de construccin La m ism a d eta lla cmo construir el p aq u ete de software: %OulO UKT U>( La seccin de construccin es relativ am en te directa. E n efecto, los dos co m andes son un. escrito transferido desde / b i n / s h p ara construir el paquete. RPM verifica los cdigos retornados p a ra cada paso, abortando la construc cin con u n m ensaje inform ativo si ocurre a lg n error.

458

Programacin en Unux

Despues de h ab er construido el paquete, el lector probablem ente q u iera in s talarlo. La seccin sobre instalacin provee la informacin que se requiere p ara llevar a cabo la mism a. %instiU
m - r f SRFM_3UILO_RCOT Tk.dir -o SS=M_i5;lLD.PCOT<5 t c / x i l / c o n f i g r t t OeS'OI3-SR?.3UILO_RCOT i n s t a l l in s t a U nan cac > M ?_BUt'_0_fl00r/otc/X1t/vnC0nf iO /*o artn SOF e arth nane *xartH * < e *rth dsscPlO ttCfl *x 3 rtn ' x a rth gnjup Anusenants

oar:n u*ec *xtam fon* Wf Tal como sucedo con las secciones de preparacin y construccin, RPM tra n s fiere cada linea de la seccin Instalacin o / b i n / s h para que sen ejecutada como un escrito. El paquete x e a r t h do Red H at contieno targ ets tan to e s t n d a r como para makc. as como tam bin I n s t a l l , i n s t a l l . man, y cdi go personalizado de interfaz que tom a a su cargo los detalles que sean espe cficos do osa instalacin en particular. Despus que un paquete de software haya aido construido o instalado exito sam ente, RPM elim inar loo archivo tem porarios y dem s elem entos tr a n sitorios enerados por oa procuaoa do construccin e instalacin. De e sta t a rea se hnce cargo la teccin de prohjnm iento. >ci*n
rn r f JRWI aUIlOJXXJT

Dicho de m anera m s precisa, la seccin de prohijamiento so aseg u ra que el directona de construccin creado por x e a r t h sea totalm ente elim in ado, lo que subiere a presencia de un problem a con el archivo de especificacin (con sus comandos, en realidad 1en caso de que hayan surgido problemas. Habitualm ente no se requerir del empleo de e sta seccin si uno se atiene a los procederes predeterm inados de RPM. La siguiente seccin es la do archivos: vrilss
S a o 'a ttrj-.ro o t.ro o t} /usr/XtiflflBln/xeartlJ
/jar/Xi ta s / s a n / s a m / x e a r t n . ix V co flrig ,f9 tc/X !l/*m co n fig /x a rtH

Tal como se hizo a o ta r previam ente, la seccin de archivos consiste de ia lis ia de los archivos que constituyen el paquete. Si algn archivo no estu viera presente en esta lista, el mismo no se h alla incluido en el paquete. Sin em bargo, debe de todos modos crear la lista de archivos uno mismo. A p e sar dei poder de RPM, ste no puede leer su m ente y crear la lista de archivos. La m anera m s sencilla de crear la lista es utilizar los archivos que genera su w akef i l e y agregar a esa lista todo archivo de documentacin o configura cin que se a requerido.

Captulo 2 1 : Distribucin de software

*159

C o n s t r u c c i n e f e c tiv a del p a q u e te R P M

C uando queda creado el archivo de especificaciones, uno est en condiciones do construir ei paquete. Si el lector confia en que el contenido del archivo de especificaciones es correcto, sim plem ente cam bia al directorio que contenga el archivo de especificaciones y em ita yl com ando rpm -b a . algo as como 'co n stru y a todo lo que haya".
LL i E je m p lo

!=^
C J IM P I O
*FL9

El siguiente comando construye tan to el RPM binario como el RPM de cdigo fuente de x e a r t n
J 03 fu r /* r /r * n tf $ ? tC S

S *90 -M r t n -l. -! 2 IS K

sIlT oa

;i*cu:isq: lu i 4Ut!Ulld IU*r'*MW/liO/X!WCWftO


JCC -02
- O lln

0 _ l3 e _ _ C .?C JIX _ C _ S 0 U * C * 1993 *9 1 O J P S _ S O j S C ' 4 M !. O TJSCPflO rO -15 0.3SO_SOUfiC6

0 .9 0 S IX .3 0 U C

- C ^ S V lO .S O J ft C c

OMAMOWPPOTa

c i * t r f l .e .a t u r i n . o

P ro e m io Mita Finai.'tg araia**.. FirtiTQ rtsu re i...


UQUT33: l a - l l K u .S O .2 U 5 C S .W fi iio S M .s o .6 i i w n . s o . l i s x t i t . w . a n o * t $ 3 .6 i u x . u o . 6 - l i a s . o . 9 ; i :c .ia .6 [ Q i.:9 C _ 2 . i i d c - j o . 8 [ G . : k _ 2 . i )

-ia*.ic.5{a<.:BC_2.ii
to t:
ijs t

s r c / r M u t S ? iS ;* a r t n -: . a - l 2 . s r c . r p

r e t :
x s &j Z w

u * v s r c . 'M c n it : ' P ! iS i' i3 8 6 / * M r t n * l. - t 2

3 & 3 .!'p b

; : S c le 3 r

1 listado se encuentra abreviado debido a La -^tensin de la salid a generada. Si todo anda bien, uno term in ar con un. p aquete binario, / JS r j s r c / r e t a : 'flPUS i3 8 6 x e a r t h - i .8 - 1 2 . i3 8 6 -rp m , y u n nuevo RPM fuente. u s r / s r c . redhat/R P M S 1335 x e a r t n - 1 . 0 - 1 2 . s r c . r p s . A lleg ar aqu, copie ei paquete binario a o tra com putadora (que equivaldra 1 equipo del usuario,-, instlelo y comprubelo. Si el p aq u ete se in stala y corre ad ecu ad a m ente, cargue el p aq u ete RPM a su repositorio de softw are h abitual, y el mismo se enco n trara en condiciones de s e r descargado por los usuarios.

f
460

))
Programacin en Unux

) ) J .1 J ) ) J J .) 1

5i, por el contrario, se p resen ta algn problema, el comando b u il t de RPM acepta varias opciones que le perm iten a uno recorrer paso a paso el proceso de construccin a n de identificar y, en principio, solucionar los problemas. Ei siguiente listado contiene breves descripciones de las opciones disponibles: -&C: -bl. b e : -b i: *bb: Valida la seccin de preparacin del archivo de especificaciones. Valida la lista de archivos p resente en V f i i e s . Lleva a cabo u n a preparacin y u n a compilacin R ealiza una preparacin, u n a compilacin y u n a instalacin. Efecta u n a preparacin, u n a compilacin, una instalacin y construye slo u n paquete bm ano.

s h o r t c i r c u l t : A ada este argum ento a la lnea de com andos pa ra en cam in ar la ejecucin directam ento ai paso de construccin especificado (p, 1, c. i . b). - k e e p te m p s: t e s t : Proserva loa archivo? tem porarios y los scriptz creados d u ran te el proceso de construccin Realiza un sim ulacro do construccin a n do m o strar qu es lo quo so llevara a cabo (tam bin ejecuta - - k e e p - te m p s ) .

Despus de h a b er solucionado todos los errores, reconstruya el p aquete u tili zando la opcin D a, cargue su program a a l repositorio, y dispngase a es perar a que vayan apareciendo los errores.

Lo que viene
En este capitulo el lector aprendi dos m an eras diferentes do d istrib u ir soft ware: empleando t a r . g z ip e i n s t a l l , y utilizando el ad m in istrad o r de pa quetes de Red H a t Esto lo conduce h asta el capitulo final del libro. En el mismo el lector h a aprendido cmo com pilar program as, ha cubierto diversos temas referentes a programacin, conocido num erosas interfaces de p rogra macin de aplicaciones y cubierto brevem ente la inm ensa cuestin de la pro gramacin p a ra redea. Le han sido tam bin presentadas algunas utilidades de programacin esenciales, tales como RCS y gdb. Con el fin de re u n ir todo este m aterial en u n a sola aplicacin, el prximo captulo lo conducir a tr a vs de la construccin de u n a base de datos p ara CD de msica

-)

. )

Proyecto de programacin: una base de datos de CD de msica


El capitulo 3. 'A cerca del proyecto , le b n n d al lector un somero recorrido del proyecto do program acin que so com pletara al final de cato libro. Bue nos. ya hemos arribado al mismo. D u ra n te el transcurso de los veintin ca ptulos an terio res e l lector ha do ap ren d ien d o mucho obro la programacin en Linux, de modo que ya en tiem po de poner todo cae conocimiento a funcio n a r E ste capitulo lo conducir a trav s d e u n pequeo programa, una baso de autor, de CD musicales, que h a r tan g ib le (o por lo menos tan tangible co mo lo pueda ser algo representado n icam en te por unos y ceros) mucho do lo que se haya aprendido. E ste captulo cubre los siguientes tem as * 1 cdigo fuente completo do los p ro g ram as que sntegran a base de d a tos de CD musicales. L'na explicacin d etallad a de dichos program as, modulo por mdulo. S ug eren cias sobre cmo se p u e d e n m ejo rar y ex ten d e r estos pro g ram as. Tudas ios program as de te capiculo pueden ser encontrados en ol attio Web n t t p : / / vw* . r e p . c c n / i n f o bajo el n m ero de ISBN 0789722151.

J-

>

>

>

464

Programacin en Linux

Ei cdigo, mdulo por mdulo


Tal como se lo mencion en el captulo 3, los program as de nivel de usuario, c i i .e n te _ c d m .c e in t e r f a z _ u s u a r i o _ c d m .c , se basan fuertem ente en el mdulo de ayuda g e sto r_ d b _ c d m .c . P arecera razonable, entonces, dedi carle algn tiempo a exam inar el mdulo de ayuda, porque el mismo hace po sible la funcionalidad de ia mayora de los program as a nivel de usuario. Yo denomino al mismo adm inistrador de base de datos porque ad m in istra casi ia totalidad de la interaccin e n tre la base de datos y la API de baso de datos Berkeley. El archivo de encabezado y el cdigo fuente son los siguientes:
/ <301 prograna an t r t o r n e t : acCtfb.fi */

r
g t o r _ d b cdn .h - A rch ivo da orcabezad o 3 3 ra a l nodulo a * b ase oc 3 a to 3 00 CO i m s ic a l s

V
I fn a a f 3.jTOR_C0,CDV_H_ i'itf'.r.C ScSTCfiJ3B_CCW_H_

inclus <sc.n> r
A O rir la OflSfl n d a ts s p a c ific a d o en ru ta n cc*so db, o , t i s i a s c o n s id e ra r /juo
n u ll,

ic s m n o a b r i r c d jt u s ic a .d b uCicaiio un * 1 d ir e c t o r i o c o r r u n t * de t r a b a jo . R e to rn a r i s l lo gran o s a o r * r l a , o a rm o o -t na caoo c o n tr a r io .

/
: t Ju rtr_ d O (ch a r r * .a c c < i* < M lb );

/
S in c ro n iz a r y e s m r l a base da drttoti r o to m a r 0 . c o rrie n ta n o n te a b lo r tu S ;n p r

/
tn t c o r r a r _ c 3 'v o i o i ;

r
A ^.idir a . r u g is t r o cuya cLav sa a o u f j i l a v e y su v a lo r o u f_ v a lo r a 1 c a s e de d a to s c o rr io n te a e n ta a b ie r t a , fle to rn a r J a l lo lo gra b a s o l s i d ich a c la v e /a e d i t a . y e rrn o an todos lo a (jemas c a s o s .

/
Lnt iA a o ir_ re g (c h a r c u f^ c la v e , cn ar *D u f_ v a la r ) ;

/
c l m i n a r a l r e g i s t r o cuya c la v e so a ig u a l a nuf c la v e . S l lo io g r a n o i, s in c r o n iz a r la b a se de l a t o s con a l c is c o ( v o lc a r a d is c o lo s r e g i s t r a s p r o s s r :a 3 n la n a o c r ia j y re to rn a r v a lo r da a l fra c a s n o s, r a t o n a r I s i no s e encor.-ro un c la v e i g u a l a l

6 u f_ c la v d o srrn o an :o d os l o s dan as ca 3 0 5.

>

)
465

Cac^tulo 2 2 : P royecto de program acin

nx * li* in a r_ rtg (c a r V j'jU v * ;


sacor.-jr iterati#ai6n;e La

igual 3 i i=

zi-s :s S itos. ouscanco jna clavo cuyo valor

$3

clav*. S i t*e=o$ e tito . .-tta m a r 3 y alraacanar ios datos corresaoncismas i f Jiia ve i.* valor. S: '-c.saaaos, ra to n a r 08,>T?0UN0 or errno.

I ir t 5uRcsr_rag(cfc9r bir*_clav5. DST "va lo r); /


a tc u ja n - ;e txrfjrLave.

ix z a t d atos *1 r t g u t r cuya clav $<a igual a la

49

: ato**ar s i t d i m t t u w

/ almacenar l corrspandisnt* valar or la

varU&it
C8SC5

valor,

r ; o - n r : ?

J clave Ocscsca no se ercuer.tra, y arrno en todos la* d M U

/
i r : r*cupr*r_r#g(char 6f_clav*> O0 t v a lo r);

r
Cor.'sr el moceo de r*g i* troi o# La Oaso de ditos rucorrtendo la oisna co* un cursar Satorrar 1 nuaaro do registros Si tononcs axitos o 5 1 la oas* 2 * datos sta vacia o tu n e lugar gn error.

/
int contar_rt^s|void|;

fteccrrsr t y ii U &as* d datos, tu ta n d c cada registro co la nlsna cor.itcut iv&mo 1 4 1 il^wattcsjier.t* cor clave. 3i trenos *xito ratornar 1 nunaro d rogstroa iM e w rtoa 1 fivrf clava y Bc?_valOf. R etam ar i n f r u ijw i, retam ar errno. nc existan re g is tro s e is o o n io la s . S i

I
flt lis t a r _ r t 5 s(cflar claves, cnar --v a lo r e s );

tta tit

asT5-ca_ca_H_ *

Las directivas condicionales i f n d e f / # e n d i f proteger, ol archivo de enca:. contra inclusiones m ltip les e elem entos iguales, lo que ocasionara que g c c e m itiera au-Tic-scias o erro res obre variables o funciones que es t n siendo redenicas. El archivo d= l e l a s funcionas p a ra la a p e rtu ra y el cierre e una base d e datos y diversas funciones p a ra acceder y m an ip u lar les registros de la m ism a.

46

Programacin en Linux

U na lim itacin de esta interfaz, tal como se encuentra corrientem ente defi nida, es que presupone accesos a una base de datos Berkelev DB. Las fun d o n es b u s c a r _ r e g y r e c u p e r a r _ r e g esp eran un puntero hacia u n a es tru c tu ra de patrn DBT; esta dependencia puede se r resu elta haciendo que estos parm etros sean sim ples punteros a cadenas de caracteres. A continuadn. la im plem entncin del ad m in istrad o r de la base do datos: d crograma en Internot: ircdds.c '! r
<j05tor_db_:dn.c - AMnistrador de tuso do datos oa.-a ta Dase do datos de CO m leales

/
* ln o lu d * < 3 0 .n>

include <stdUb.n> include <jtd;o..l> irchide <5trwg.h> nncludo gojTorjJb^dn.n


/ Pun-.ero g io u a l do o iu e a < > d ato /

i t i t t c 00 ta;

m <3rir_dtj(c.iar ruta_CCMOjJb>

<
in t walor_r9tortiac;
e n ir * r u t i_ p o r jM fe c t o * , ./ c d _ o u Jic 8 .a o , :

/ Si ruta_:iccO_db as NUIL. considerar

quo

ai olrectorio es ol co m e nte .

*/ I *Llanar a ia case de datos aa CD nusieales cfljTusico.cn /


.f(Jruta_accesa_ao; {

if< i rjta.acseaojJb = .i3lac(striei'|ruta_pcr_deTeoto) - ?|) 1= NULL} {


itrcpy{ru:a_accosc._30, ruu_cor_defecto>;
> s is e {

return - 1 ;

>

NUU, ic5);

vaior_'5tornsco = ct_ocer.'ruta acceso fib, DB 3T35E,

"

ce C3EAE. S M ,

muu

i f (vaLor_ratonaM l

Z) {

rturn vaior_retoHja<Jo; / E or ra:ai

>
"tur-i 0 ;

Capitulo 22: Proyecto de programacin

467

ir.*,

o ir r a .- _ 3 3 f .- c i3 )

{
3 -> c o h 5*39r;s crcducir u C i n unj 3inc.-or.izacion, pero por las dudas
. . .

)
a . ;

2 3 - > s y r.c 0 3 ,

6-Cl5M(<33f 0 ).

r e f -m #;

>
y .: ii*.d;r_r*j{cM* *& j*_cljve, cnar D a v a la r )

i
Z8T cla v . . ic r; tnt Ior_r*tC M C 3;

I f t ic u liu r las

08 ?j

***:iicijv*. a. iiw rioaTu;


ai*<4v*icr. . sU O '(08T)};
to t l K i un J3 C K W p arvarM , pro funciona */

c ln .4 n i oyr_civ*;
Cl v .s u * r r U n ( t y f _ c liv a :
* a lo r.3 a :a t e if j t t lo r ;

a l3 P .* i' * itrl* fi(tu f_v* la r)

AlMMAAT i i rs^ litra


y a 5 "_ -ro r-K C * 33->ttti35, MULi., ic ia va , iv iic p , OajvCOVEWUTE; i?(*Ior_r*To.-nado =* i_<Ff5x:5T} revjpfl 1; J I ;'(v*l3r_.*:c-r-4C^ ! 8) r r .-f l al;-_r**3ri*4c; 33->s>-;(32. ; . retUH ; * ita . S in c r s n iif ia 32S 2= catas / * Ccurno .HQun otro tiao ae srror

! Clava ya axist* '! I

J:

>

468

Programacin en Linux

w t lii-E r_ r* g | c ria r buf_clave>

{
iflt v3lor_rtorn3do; C6T Cliva; aeas9t(ScUVB, O, slzeof |C8TJ | ; clavo.data * ouf_cIavfi; clav e.aizt 1 strleri(buf_clavfl);
v a lo r_ rijto rn 3 tc CO ->i?lin inar_rg(rtb, U U , A c ia v e , O}; if { v a io r _ r # t o r n a o ! 21 (

;f(v3ior_retor!)ado == D3_HOTF(X;.VC)

{ / Clav? no encontrada /

rtturn t;
> *159 { returr vaLor_rtornatc;

)
da->syn<:(Sb, 5); / Sincronizar la baso de datoo /

r*turn f ? ;

int Uusc4r_r*5(cn.ir *&uf_Clave. OBI v a lo r |

i
in t vaior_retornadflj 08r clava; 08C *cursor_ilo * NUIL; / Copiar aqu: b jjrla v o / / Cursor (puntero) do la basa oe dato V

r Craar ul cursor /
valor_retornado - db'>curnar(ct>, NULL, AeursorjJb) j if(valor_rdtcrn.iao I 0) { r#turn v*ior_rotorr.3do; Algo anduvo naL /

>
In ic ia liz a r 09T clave; considerar quo 'v a lo r- ya 3e encuentra L iic ia llja c

V
(Tnset{4clave, a, sizeof(D aT)}; clave.data =
2uf_ciava;

clava.size strlanbur_ciave)

. * P.ecorrer la basa de datos buscan-jo jna coincidencia / niie!(valor_retcrnM o - curso." db->c recuperar reg(cursor 3b, clave, valor D3J1EXT)) 1= !>3_>TF0vN0' {

Capitulo 22: Proyecto de programacin

469

f
Este t i eiicao. 25 no alnaesna ;3?-33 teramatfas en n u il 0 9 o rnara),
c a ooco

o cero

m i l l o s s t m c c s o s r a I m i t a r ;o s O ytes a con p a r a r con la

loncitofl : = la cacen jjscsca =3"! asegurarse que la coincicencia sea la g itlfl*. ccopar* la ior^irad es la cacara 0uscad3 coo clava.sise. 3 i son ic u a iw , considere que la coincidencia as correcta.

I
;*(s c - n c a o [ c la v e c a t a , b u f _ c la r , s t r l 9 n { B u _ c la v e i ) ) {

if c U v t.s ite = crea*;

str;*nie<jf_cla/9)| {

/* Coincidencia encentrada */

) ) I ' C5*'ji*;t e lar^c o encantrmca una coincidencia"? )


itv a ia r ^ .-e to m a d o C6_**0'*0U*C) {

retum 1;

>
return : / LO lo grj*oi /

}
tat rfc a o va rjffltc fc a r ^r_cla ve. 08T valor)

{
int alor_retorrj5o; 0*T U v e ; / I n i c ia lu a ' la c ljv e 03T: considerar que valor ya V
f a n o o m U U U e M O s o r q u ie n e fe c tu la i.a a a a a V e e e t ( 4 c la v e , I , tu e o f( O S T ) ) ,

clave.data o<jf.:laeclave ; : : e trlen(6uf_cU ve>; i*r ai podeacs seterer e l " jistro

'I

<aior_ etorad3 e6->recuprarj*0fl(a&. N uil, 4clave, valer, d ); j it e a ( valer j ,etc,,'tsfi3i { case : retum ;
c a s a ajuOTrOW O; *eturn 1 ; / C la v e r s en contrada /

I ' Ojala /

csfault:

/* E r ro r no re vis to /

rrtu m ilor_retcrr.ado; )

l m trj riltc ft /

Programacin en Linux

Ln: con:3r_i-*Q3fvoid) { in t valor_retoma0o, canrasor = 3; 06T clave, valor; CSC c trs c rjjo SUtl;

/ C raar i c u rs o r /

valorj^ttarrado * ob->curjor(co. v a l . X curaorjm ); xffvalor_rtorrado l - 0 j return valor_rotornaoo;

( I n t C U llo r l a s 08Ta /

< M M m c lV fl, I). *i#a#(8T)); M R M t(4 v iia r, a, Si:B 0 r(R 8 T ) ) ;

Oa.NCrFOW tO) (

M l# (< C U rW rjJD >C_rCM#rr r w f w r i o r dO, i c l l V f l , J v a lo r , 00 VFXTi

*con;tf;r;

raturn cantador;

\
u u lis ra r_ rg a c n jr clavas, ohar valoreal

<
in t vaior_n*tornado, contador
08r c la v a , v a la r ;

D8C Cunor_<jb * n u il ;

/ Cursor de la aase de datos /

/ ' Craar el cursor / v:or_-atoriadc = cb->cur5or(ca, Si.1 , 4cursor_ab) ; iflvalor^retornado I j )

'? rln :f (s tc a rr, gestar_dt cea c: ;b-cursor: w n * . $tr#rrd< (valor_retarada)j; recurn

i;

}
'* In ic ia liz a r las cera /
- t a a t t i c i a v e , 3 , s i o f DBH i ; n e s $ * t( 4 v a lo r , 0 , 3 iz a ? (D 3 T ));

Capitulo 22: Proyecto de programacin

471

*
o b jio t p u w i

30-* la t a t J5 aat:s / db->s recuperar re g ic u rs a r 3G, Sclava, iv a lo r , ZB ScXT)) :*


{

3a-*Cuii-jr_i--j{;s, vuu.. tlave Avalar, C8 06TJMU0C); w a cp y(cU ves(co ru 0o r] , clave.d a ta, c L a v e .u z a );


e e s c c y iv jlc ^ s ic e n ta a c rl. v a lo r Ja ts , v a lo r . u e l;

*c0*t*ccr; > rtttfffl 50ta0r; i E ste cdigo define la interfaz de base de datos declarada en g e s to r _ d b _ c d .h E n genera], todas la3 fundones retornan 0 si tienen xito, un valor entero positivo s tuvo lu g ar alg n tipo de error, o u>i valor entero negativo fhabitualm ente > n o cu m algn otro tipo do error ajeno ni siatem a. Las excepciones a esta regla s e r i a informadas. a b r i r _ a b abre U base do datos especificada -*n ru ta _ a c c e so _ d b . Si ru ? a _ a c c e s o _ d b es NULL. se abre uno baao de datos predeterm inada denom i nada C d_nu3iC a .d b n ?1directorio c o m e n te do trabajo. El indicador 0B_CRATE hace que s cree la buso do dato s st te ta ya no existiera. Ade ms. la base de datos no se configura p a ra adm inistrar claves duplicadas. c a r r a r _ d b d e r r a la base de datos. Como lo informa el correspondiente co m entario. la funcin db -> C lo se debera obligar t la base de dato* a d escar g a r cualquier dato que m antuviese en mem oria h a c a el archivo de disco, pe ro para que esteraoe seguros de ello c o r r a r _ d b llama explcitamente a db -> sy n c por La dudas. De hecho, como medida de precaucin, las doo fun d o n es que verdaderam ente modifican los datos de la base de datos, a a d r _ r e g y e l i s i n a r ^ r e g , tam bin llam an a db->sync. La funcin a a d ir _ r e g emplea el indicador DB_NOOVEflWRITE para prevenir que se sobrescriba un p ar clave/valor existente. Comu resultado de ello, para modificar u n registro existente de la base de datos, uno tendra primero que elim inar dicha registro, y luego volverlo a agregar despus de efectuarle las mcdificadones que fuesen necesarias U n a fundn que actualizara un registro existente sera una excelente adicin a e sta interfaz de base de datos. A pesar de su ap aren te sim ilitud. bU S C ar_ reg y r e c u p e r a r ^ e g son s u m am ente diferentes. recuperar_reg busca un registro que tenga una clave especifica D u s c a r_ re g , a su vez, es u n a fu n a n de interrogacin. Recorre toda la base de datos p ara constatar que una clave determ inada exista. Es decir, m ientras que r e c u p e r a r _ r e g da p o r sentado que la clave existe y sim plem ente recupera el valor correspondiente, o u s c a r ^ e g averigua si e:c5:e la clave y re to m a e correspondiente valor o u s c a r ^ re g debe realizar trabajo adicional luego de que se encuentre un3 posible coincidencia. La fondor, s t r c a p opera solam ente sobre ca en 83 term inadas en un cero binario .8 , pero les valores alm acenados en la base de datos no e st n term inados n un cero binarlo. Debido a ello, b u s c a r _ re g utiliza s trn c m p a fin de lim ita r ios caracteres que se com paran. Despus de que se encuentra una posible coincidencia. e! paso siguience consiste en comparar la longitud e la cadena de bsqueda ron ia longitud; de los datos presentes en la base

)
4 72

')

Programacin en Linux

de datos, que se encuentra alm acenada en el miembro s i z e de la e stru c tu ra de patrn DBT. Si estos dos valores 30 a iguales, b u s c a r _ r e g considera que la clave constituye u n a coincidencia vlida. c o n ta r _ .r'e g s sim plem ente recorre la base de datos e increm enta un conta dor por cada registro que va encontrando. E s u n a de la3 funciones que reto r na un entero positivo y discinto de cero cuando tiene xito. La API de la 3erkeley 08 no m antiene u n registro de cuntos registros existen en u n a base de datos de rbol binario (B-tree ). c o n t a r _ r e g s hace mucho m3 sencillo im plem entar la funcin l i s t a r _ r e g s . porque le perm ite a uno cre a r una tab la que contiene el nm ero correcto de punteros a p ares clave/valor. Des pus que h a n sido creados los p unteros de e sta tabla, resu lta m uy sencillo Lnicializar cada p ar clave/valor adecuadam ente. Debe m encionarse tam bin el tndicador 08_D8TJAALL0C que se le tran sfie re a db->recuperar_reg. Norm alm ente, cuando uno llam a a d b - > r e c u perar_reg, la m em ona a la cual ap u n ta n f ic la v e y S v a lo r es vlid a h asta la siguiente llam ada a cualquier funcin do Berkcley 0B que em plee el h an d le db. 08_DBT_\WLL0C, sin embargo, modifica este com portam iento. C uando 50 le tran sfiere esto indicador a db->recuperar_reg y c u r s o r _ d b > c _ g e t (la funcin p ara el cursor), Berkcley db asigna mem oria p ara clave y valor de m anera que el alm acenam iento de las m ism as sea perm anente. Por lo tanto, liberar eata mem oria m ediante una llam ada a la funcin freo pasa a 3 e r responsabilidad del program ador de la aplicacin. U s t a r _ r e g s necesita de esta funcionalidad porque, sin DB_DBT MALLOC, el alm acenam iento asociado con clavo y valor desaparecera despus de que term inase la funcin porque am bas son variables autom ticas que dejan do 'e r visibles {quedan fuera de alcance) cuando term ina la funcin, l i s t a r _ r e g s , lo misino quo c o n t a r r*ogs, retorna cuando tiene xito un valor entero positivo y distinto de cero.
/ Nonero co 1 orearan nn in t e r n e t : n c flu t ll.h */

r 'jtKisadMjJO cdw.n I
U t ilt t y fvnociona ror miste CO dotabas oragran. Ifnt## urtLtOAOS_OB_COM M_ ,* Proteccin contra r .u itic l inclusin de el*ior.;o6 igualo / e 'i n e UTIl.:aACSJ_COMH,

/*

0 Dt*n*r ana cadena para asignar a una clave1 a a un valo r1

/ int db_cau_ijtstr(cnar du|], Lnt ionQitud); enaf / ut:li^ii6s_O0_CCM_M_ 'I Este segm ento de program a declara u n a sencilla fundn para o b ten er una cadena de caracteres ingresada por ei usuario. La defm idn de la m ism a se encuentra en u tili d a d e s _ d b _ c d m .c :
.Menor del p.-oijrans n Internet: n ca utii.c /

if
utilid2<3es_cb_cdo..; - funciones u tilita r ia s del prograna ce ose de catss de CO 3e nusica /

)
473

Captulo 22: Proyecto de programacin

Jir-clud?
*If!Cl'J <St'C.^> #irtcU*Je < j?ai;3.r firalufie *at;i:3i2e3_:;_caa.ft

a ii- y ? TM 0_3U? 102*


iit J_cd*_gttnr [citar sjfn. n t longitud)

w t c , i * *:
n i l e ( (c - ;9 t c - " .a r u '= n 1 S i : < lo n g it u d ) {

b u fjij c;

i;
ewfui * ve;

rtfjm t; En ste ruffmonta do cdigo no sucede nada extraordinario. Yo pretiero re d acta r mis propias funcionas do le ctu ra do caracteres desde el teclado por que el hacerlo me brinda mucho m ayor control sobro la m anera de procesar la en tra d a de dato'.. Por ejemplo, funcionen personalizadas do ingreso do da tos tale como d b _ c d m _ g e ts tr pueden acr sencillam ente modificada pura hacerlas rechazar datos invlidos o tran sfo rm ar Ion dato vlidos un for m ato que pueda procesar su aplicacin. A continuacin el program a cliente. c ii e n te _ c d m .c .
CONSEJO
Las funoonea sersoceiracas ce rgr*so < datoa son candlaotas perfectas para sor lo d-.-niM en oic-ictecas oe programacin oara que puetfao se/ reutliteadas en diversos croy&ctcs.

_ cresoJo de fcoiicacas ae Dogramac-'n se trata < ?n detsuie en ei capitulo 14. 'Creactn


1 uttiraoftri ce ojotottcft* ce programacin/
i p r s g ra a a n I n t e r n e t : c d c l i . c */

/
:L ia : ' t # _ : c . c - COrttTOUOOr c i r a 33S de a r t a s aa CD n u s ic a le s e je c u t a b le

;>sCi l;.-r ae m u m o s

Adecuado ;-ira j t i l i a r n icrtp ts de interfaz.

I ncludd <stdlib.a> safe <anistd.ft>


n rc la tfe <;toot.1

/ ? a n * t
/ Para getcpt

/
/

474

Programacin en Linux

lnclude <s-i-trrg.h> trclude , ge3*<l^_dt_cdl^.h

r Para 'iicpy' en glibc 2 . 1 . t


/* Administracin ae aasa <J datos

'/

itfqfi^e

'MVQJUF 1024

voia noco_a*_mr5:eo(vao);

i r : t h Lt { nt jrg c , char argv)

<
int v a lo rj^to m a d o , opcion, contatfcir, .;

t * ? - n c ia r - c o ta r Q ;
axtcm tnt optlnd; CST valor;

/ oe < g m o o t.h > /


/ Oo <gotfrpT.n> /

Char clavos, "v a lo r# ;

l(a rg c < 2 argc > 4) ( Wd0jld_n pla 0 { ) ;

>
opcin * g*topt(arjc, argv. * :# : 0 : r : l ) ; ifa&rir_db{MJLL} I) { /* A b rir la oaso a aatos .' .outif'error a i aor-.c la base de da tos');

>
3iccfi{opclon) ( ca$e a : / Artauir un regiatro /

/* ?ero no artadir jn registro vacio u ana clave ce longiruc if(argc = loptarg * 44 MJLL) 44

cera /

(strlen{opta."g> = l| si <argv(opund| 1= MjtL)| {


valor_retonado * aradirj-egfcptarg, argv(optnfl|); if(valor_ratornado == t| { p rifltf('C la ve

s' ex iste\r, optargj 5XIt(EXIT_rAIl.URJ;


> eisa f (vaicr_.-e:ornatlo < i ) {

perror( c lie n te jjc n .c : aadirj - e g ') ; **it(EXIT_FAIUJfiE|;

>

Caotuio 22: Proyecto de programacin

475

orx: * (

> c*m 9":


if[ * r $ c 3 (

un rgtscrg /

iffO O t tf< t * NUUl <


v ic r_ rc t5 rrjC c * fL i* :n 4 r_ r g (C 0 ta rg j;

lf( ll3 < -_rttv'-r *<io

i)

p rW tfrC U v a

SJ

"W >tridi\i\ opTi'fl;

n it ia t T .W U K ) ;
) I M if(ylar_rorp.<Jo < M

M (e x t T .F A :u j;

> OTM fc; > I; J


C i* 3 -! / 3u*car un r e g is t r o * if ( t r g e 31 <

if(o p ta rg l - h w . i t
* # a je t ( lv iio r . J .
1 UOM 0 8 T M ;

v a 5 r _ r E 3 fn a c o 0 u ic a r_ * a 5 ( s o t r g , i v a l c r ) ; if ( v a i a .- j* e s o t t d o * * 1 {

p r l / t f H 3

M eocofltraoa\fl*. aotargi;

u tto in j A nuK t eisa :f{v a l0 r_ -c r* * 3 c < 8| {


terror (*c iia n t * _ c d i: c us c a *_*a' 1; exit{xr_FA :LUR );

)
a ri/ t? ;* % .* s ;v s \ . (L'tt. S T r lc M a c t a r g ) , o p ta rg . l i r t j v * i a r .s i z e .
c--.iT *!* a lo ^ .o a ta);

^ w ;
t

Programacin en Linux

) }

a la s { n o C c jJ e jjn p le o {);

case r ' : t f ia r g c * 31

/ Recuperar un rg g is t.-o

'

: f( o p ta rg i - NULO { a e .T se c (iv a io r, , s iz o o fO B T t); y a lo r_ re to rn 3 a o = recu D er3 r_ reg{op ta rg, & v a Io r); if( v a lo r _ r e to r r .a d o -= = 1J {

p rn tff'C la ve '^ s ' no encontr3 da\r.\ optarq);

exlt(EXl7_FA:LHE);
} s is e tf(valor_rfltor-iaoO < 0) (
3 e r r n r ( C lie n t9 _ c c (t.c : ra c u p e ra rj-a g * ) ; e x lt( E x iT _ fA I L W E ) ;

*
p r ln t/ ( * V * % .* * \ n ', ( in t } 5 t r lo n ( o p t a r g ) , o p ta rg , < in t) v a lo r s i e , (Cftar A v a la r . c o t a ) ; braak;

\ } Is a {
*oio_dajmpla|);

caso I : / Listar todos lo ragistros / tf(* rg c 2 )

if((cotaoor contar/agsO > 0 ) (


putsCMo u s t n rogistros on esta Oase ta datos*); *xit{Xir_FA!luflE>;

> r
I n i c t a l i i a r lo a punteros d e l c u rs o r /

lf((c la v e s * rslloc'size ofC 6T ) contador)) = N U IL ) {


puc3(*cleite_c<!n.c: n a llo c c la v e s * );

<Xlt(eXIT_rA!LURE);

> lf((valores 1 tallec sizsoflMT ) contador)) N U LLI ' piit5(*cliente.In.c: tIoc valores*);
exi:iEXlT_FAlLUREl;

>

Captulo 22: Proyecto de programacin

? a c a c s s caca a le p a n to / ? c r [ i = ; i < c c r -ta s c r ; i ) {

:T( ( c U v a if I - aaUcc(TAW O_ajF)) * NUUJ { c u ta ( c -ia n te jc c * : n a llc c c la v o s : ] '} ; xitfEXIT.FAIUJRE);

}
i' I v a lo r e a r* n tIo e < T A M tajU F )| NUU.) ( p u t s C c l ie n t a _ c d s .e e n a l l c c v a l o r a s ! i l ' ) ; x :e x :t _ fa :l r s ) ;

> i
<alr_r*t3rrt3i}3 = IiJtar_r45S(CUv5. v la rfS ); ;f(r*lor_rWPaao 9) { C-.o r ( , c l i 8 P : ? _ c c a . c :
* it ( S T / A lL U A ) ; l i s t a r j " e g a *);

\
o r (t < 1 ; L < ccotador; - i ) (
p rtn t< { * s. s:> .M \n , ( : m ) s t r l n ( c l a v [ i n , ( in t) * t r l* o ( v a lo r a ( t | ) , v*icr* i 2 ); c la v a * ( i] ,

> &rik; #1M {


o c o a _ c .* o U o ( j;

i
3 f* u it: / Opcin v a li d a , r a s t r a r * 1 n u l

nodcjJ*_ic! { '.; tru k ;

> / m te n /
c e r r a r _ a O ( ) ; / Ca r n r l a ca se de s a c o s /

t*it(E x rr_ sx cg ssi;

>
v a ia a o d o ^ e jH p lM (v o id )

{
PutfUCOO OS at?'-0: cliar.t_c3n \
\ m t ( - a tc la v e v a lo r (AAaal<r r s s i s t r o ] f r \ n \ z ( - t c la v e } lE H n t a r r e g i s c r o f H

Programacin en Linux

\ n \ t { 0 <C lve> {B u sca r ' -g is tr o l)^ \ n \ t {*0 < c ia v e > ( o a te r e r r e s is t r o ) > \

\ 0 \ t { -1 |L is t a r tOtfOS lOS r g g is t r o s j* | ;

9ilt{0fr_FAtuq5| > El program a que em plea el usuario, c l i e n t e _ c d m . c , e3 adecuado p ara su empleo un xcn p ts de interfaz. El mismo espera una de a n co opciones on la lnea de comandos: -a p ara a a d ir un registro, -e p ara elim inar un registro, C p a ra buscar un registro, r p ara recu p erar un registro, y 1 p a ra listar todua Ion registros. La opcin a requiere dos argum entos, una clave y ur. valor p ara a a d ir a la baso de datos. A su voz - e. b y r requieren un aolo argum ento: u n a clavo. Finalm ente, la opcin -1 no requiere ningn argu mento porque sim plem ente lista todos los registros de la base de dato# Uno mejoru ti: n este progrumn podra s e r elim inar el lm ite establecido para ul tam ao del buffer osttico un *! caso de la apuracin de listado di> re gistros. Tal como est escrito ol program a, cada puntero de la tab la de claves y registros e st limitado a 1024 bytea. Por conveniencia, el cdigo en cues tin so vuelvo a reproducir aqu:
/ rinai*-o <3* C4d lM M t o /

to ra *; t < contjocr; *i) ( ifl MUoClTAWAriOJUfH WJU) (


p u ! rc llO n tM _ c e .C : n llQ C Cl JV il t | ' i ;

x ic ( e x iT ,m iL U M );

}
lf(|v a lc r ( . nallcc|TAUAO_BUF)| NULLl { p u t s l c ll.fln :e _ c d n ,c ; e a llo c v a lo r e !l | | * X lt|ttIT .S A (U JR E ):

Tal como encuentra redactado, e sta porcin de cdigo es aceptable porque resulta difcil im aginar el nombro de un in trp re te o el titulo de un CD que pueda exceder el tam ao corriente de T A M A 0 _ 8 U F bytes (que est definido por # d e f in e en 1024 bytes). N'o obstante, la cuestin de fondo es ev itar es tablecer lim ites a rb tra n o s tales como ol anterior, sin que im porte lo razo n a ble que puedan parecer os mismos p ara u n a aplicacin determ inada. P ara analizar la linea de comandos, el program a utiliza la funcin definida en POSIX g e c o p t. declarada in < g e tO p t. h> {tambin se debe incluir en el Cdigo fuente < u r u s td . 1 >), ta l como sigue: i r : ^5tM r(in: arpe, citar cons: ar^vf], coost eflar *aostrng); E n esta declaracin, a rg e y a r g v son los parm etros a r g e y a rg v que se transfieren a m am . igual que como se lo hizo en captulos anteriores, ge t o p t espera que cada opcin sea precedida por un guin i, o p t s t r i n g contiene una lista de caracteres de opcin vlidos. Si un carcter p resente en a p t s t r t r g se h alla seguido de un signo de dos puntos <:), el mismo debe r se r seguido en la linea de comandos por u n argum ento.

Cap'ttaio 22 Proyecto de programacin

Por 'o tar.to. ol parm etro uptatring en c i ie n te _ c d m . c. ' a :e : o : r : I ' signi fica que la s opciones - a . e . -b y - r deben e star seguidas de un argumento, pero no as - i , que no va seguida de nada, g e to p t recorre cada opcin pre s e n ea la lnea de comandos y retorca el carcter correspondiente (a. e, fc. r o i 1 o EOF si no existen ms opciones. Si una opcin requiere un argumento, el puntero retornado por o p ta r g ap u n ta hacia ese argumento. De modo que c lie n te _ c c 3 r:. c primero valida el nmero de argumentos do l nea de comandos que recibe y luego utiliza g e to p t para determinar la oporac n a llevar i cabo y los argumentos correspondientes, si fuesen necesarios, p a ra dicha operacin Cuando termina de realizar la validacin de argum en tos c li e n t e _ c d ~ abre la base de datos y entra luego u un largo bloque de s w itc h que es el que en la prctica lleva a cabo la operacin requerida C ada operacin posee su propio cdigo utilizado pora validar el r.men) y el valor do los argum entos sobre los que tiene que operar Si w est adiando un registro, por ejemplo, ae necesitan dos argumento, unu clave no nula ni vaca y el valor aaociado con dicha clavo e li m i n a r reg , ti su vez, necesita slo unu clave que no sea nula. Esto ltimo requerimiento tambin se aplica a b u s c a r_ re g y re c u o e ra r_ re g . Obsrvese que tres de las sentencias c a s e - b. r y 1 - utilizan una varinnte inusual de la sentencia p n n t f : srHUfC'-*, (int) v*ioe_%arioo. {ciar iacna); O tra vez. esto resu lta necesario porque, cuando se imprimen cadenas, p n n t f habitualm ente espera cadenas term inada* en un cero binario (\0 ) pero ocurre que la base de datos Berkelay 08 no almacena cadenas term ina das e a cero binario. Adems, resultan necesarios los cambios provisorios (caats.i de a p o de objeto porque el miembro s a o de una estructura de patrn DBT est en realidad demudo como u ie n 3 2 _ t, no como :nn, m ientras qui* el po del miembro d ata de la misma estructura est definido como v o id ' E l eapecificador de form ato %. *s significa que: cada cadena a se r im presa lleva otro argum ento adicional delante suyo, que m dica la cantidad de caracteres de la mism a que sern impresos; b) este especicador de tama fio de campo, a su vez. debe ser una constante nu mrica e n tera o una expresin que evale a un valor numrico de tipo i n t . Si el especiacador es una constante numrica entera X. el ancho del campo im preso ser de X caracteres, como en la siguiente expresin: ar3T-{*% * s t \ ca<r,i); SL =r, cambio, el especicador es una expresin que evala a un valor num* rico de tipo i n t , p r i n t " im prim ir en cada caso particular la cantidad de caracteres especificada per el valor que arrojo la expresin num rica corres pondiente. P o r ejemplo. La linea:
i*, ir?

im prim ir en este cas la cadena completa, o cualquier otra cantidad de ca racteres s; :a expresin numrica arrojase un valor distinto. Finaim ente, en esta variante de printf cada grupo N. S se encuentra separado del siguiente, si io hubiera, no por o o m s espacios sino por ei carcter

J 480

] ; y l ) Programacin en Linux

>

>

'

c l i e n t e _ c d m .c realiza u n a cantidad considerable de operaciones p a ra m e dir la longitud de los arreglos de cadenas em pleados p a ra alm acen ar y luego im prim ir la totalidad de los registros de la base de datos. D espus de llam ar a C o n ta r _ r e g s , el program a prim ero asigna el nm ero correcto de p u n te ros de ipo cfl.ar que apu n ten a !os m iem bros d a t a de las estru c tu ra s OBI. y luego mide la longitud de cada u n a de las cadenas en ellos. La llam ad a a l i s t a r _ r e g s inicializa dichos valores, y luego, utilizando ia sin tax is de p rin tfq u e recin term inam os de com entar, c l i e n t e _ c d m .c escribo cada p a r clave/valor a s t d o u t . Tal como se hizo notar, c l i e n t e _ c d n . c est diseado para se r utilizado desde un scrip t de interfaz, de modo que lleva a cabo u n a sola operacin y exhibe su aaiida de m anera sencilla. Se requiere de cdigo adecuado de in terfaz p ara form atear tanto su en tra d a como su salida. Tenga tam b in en cuenta que todo dato a in g resar que contenga espacios debe e sta r rodeado de comillas sim ples o dobles. Por ejemplo, p ara agregar la clave "F rank Sinat r a ' y ol valor G randes xitos", la invocacin correcta seria:
5 ./cH*nt9_cxfm -a 'Frank Sinatra* Grandes oxtos'

Luego de llevar a cabo la oporacin requerida, c l i e r .t e _ c d m .c cierra la ba so de datos y salo. La funcin m0 d 0 _de_ em pleo le recuerda al u su a n o cul es la m anera adecuada de invocar a l program a. Las ru tin as do apoyo a !a interfaz de usuario basada en ncurses c encuentran definidas en C d m _ p a n ta lla . M , cuyo cdigo fuente so lista a continuacin. r sorar.* .joi orograna .n Intrnw t: rtcdscr.h / / ztn p a n ta lla .i - fluttna do n*noo do pantalla para la baso co datos 3* CO
n u jic a l

/
ifndo? CCW_P4.SUl.U_H_

IqusUs */

r Protoccion contra nultlp lo inclusin de lM tntO k

<drin cmj>ami>ulu in c lu o t c u r m . i

j\_

/
tn lc ia lU a r al suaaiitana co curses. Retamar a si se tione xito o - I U so prM uc un urror.

I
in : i n l c l i a r j} a n u l ln { v o u );

/* Cerrar el subsistema de surse3. No se 'eterna nuigun valor. I


void cerrar_ncurse8{vold)r

r
(ftJtrazar la pantalla prin cip a l. No se retorna ningn valor.

/
vaio :ra 2 =r_pantalla(void;

'

'

>

J L & -t;V

J '

Caci'.ulo 2 2 : P royecto d e program acin

r
xr:&ir n ososaj ac La linea s esTao.

*/
roid 15e.-sa39_j_u 5ua.-1 : (cr.ar -aensaja):

/
?rea*rar una ventara sa^a la r.trjc a y la salida 33 oatcs.

(
roc pr#p*rir_veflana{wwOQw *vtmasia)r

/*
?refiarsr ur-a ventara oara ser vuelta a exhibir.

/
v e is aetrar_v*ntana(WINOOW *790: 303):

r
00 tener un oar cUve/valcr oara fla<ur a la sato de cato*.

/
O l aA*dir_r*s{cftar cuf_elave. c.lar B u.valor);

/
: r r la c U o# vin registre jara ar tlu in a tte .

V fO-.C Ufliar_rg{cr'ar 'Dcif_cl4v) r


OCterer la clave ee un reg-srro ; r a buscar.

/
vota cscar_reg(c,;ar *cuf_clave};

/
E xn i& ir un par c la v e /v a le r

/
, 0 1 ; costra. j*eg(efur aof_alave, cnar So.vatar).

/
Secuoerir un p*r clave/valar tssecm caao per usuario

*/

432

Programacin en Unux

v o iJ ' cuserarj'agurar *wf_clave|

/
L i s t a r to c e s io s r e g is t r o s a re $ 9 n te s or. l a Caso da d a te s

/
'C id is ia r _ r 9 g $ ( c h a r * b u f_ c la v e f char * l)u f_ v a lo r . in t c c n ta d o r); *?ndlf / CDM.PAMTAi.LA_H_ ' I

La interfaz definida e a c d m _ p a n t a ll a . fi es tan to unu conveniencia como un esfuerzo por m an ten er la inoduluridad del sistem a. Como convenienaa, reduce en gran m edida ia canLidud de cdigo que requiere el program a con trolador de p an talla. i n t e r f a z _ u s u a r i o _ c d m .c . Mejora tam bin la modularidad porque, como ya so mencion, siem pre y cuando ia interfaz definido en el archivo do encabezado no cambie, el cdigo que im plom entn dicha in terfaz puedt! se r rescrito cada vez que sea necesario. Hbluodo de implementacrn. es ju sta m e n te lo que se verA albora. r to&Ore del orogr.vr.i ->n Intornit; ncdocr.c / /*
c d a ^ o a n tilla c - Inpionenta o l uan ejo do p a n t a lla p ara la bnso d* c n t c i ae CO n u n c a e s

/
m c iu d a < c u rse i.n > in c lt r fe <rcrn -iin ciw Je 'c a n j j a n t a l l B . t r

:>COw a a iiw in ;

Ventana p r in c ip a l ' !

nZMXM nenyutn; / B a rra .: nena en i a p a rte s u p e r io r s e la montana p r in c ip a l /


a INO* statuBW in; p r in c ip a l */

/ tin a a da a sta o o an i a p arto i n f e r i o r de l a ventana ' Zor.a de e n tr a d a /a a ia c a de la ven tan a

wl.tOCM v e n ta n _ c e ^ t"a o a io ; p r in c ip a l ' I

mt L aicializarjiafttallm d j <
m t * a x y , iraxx;

i f ( i . i 3 l n i n - t n i t s r { ) > == v j lL | < o e r r o r ( * c d n _ o a n t a iia .c : l a ir w i n * } ;

rc f jr n - I ;

V
g e t n a x y x js t a s c r , x a x y , n?.xx); SuCvantana i e s r s l a c u a l e s c r i b i r ur 'iran u ' / -r';H 5 .iu m - a s r w in t s t c s c r , 1 , n axx, Z, \5)) == {

C a co o 22: Proyecto de programacin

483

: e a _ j * 't i i . j . c :

o a n w rin ) ;

rsturr }
! SuSventara en acn# M c r i e i r w s j j o*
if f f lt t t u x w i, ? t e r * ln ( s t t s c r . J , i m , p * r r o r , c 4 t_ p * n ta lIa .c: s t a t u m r - 'j ; r* tv m *1 ; / e**y i , >> ** V JL L ) (

)
/* Sc5-er,tarj 3or^3* ti*n laca.' t lig r u s y ia aalM a 0a:o9 / i((-ta*a__tratajo 3erLi(?ajsr, axy 2, nxx, !, I)) - N U L L .* /
a t r s r r : c a jiir . illi. t ; r it y r * ; rt* ? M _ ftjr a c M ;

>
/ C c ^ ig y - a r i t e c la d o /

if{c& r* u< ) ifW j


r ttm ; nu

/ ?rocejar*roi l i entraca c d ito s noiotros V

: f ( k r P M ( jf c r . r* tu m - t{

. e m j / H a t n iit a r i u n clo o o* c ia v o a - F /

i f i n o f o s l ) 1W) r* tu rs - t;
r * t u r r ;

/ Controlar la ja ltd a a* dacoi nosotros /

>
O IO
c r r r _ a c u r i * s ( '* a i d |

.' O r a k ();

SM taurar i oocc j t i w a r

ingreso

c a r a c te r e s

i : : ) /
c ai in (B eru ifl; i in (s ttu n l; 3 i ii( e r ;ti,'s .2 e _ :r 3 s a :o . o d B in n ; / R estau rar e l a s tw o c e ! t4 rn iT 3 l / LM rj.- la s ste v e n ta n a j /

}
v o ic tr a f jr _ p 4 r i'5 iia iv u ia )

era.- - t r - , - r2-A i.*3;irie -S a lir* ;


r A E fin v iK ftW , 3

^ l-E B i'.ir

r-i-Si;3car

FS-flecuperar

C5 -L is ta r

* . V i , "Kru; ;

)
4 8 4 P r o g r a m a c i n e n L in u x

>

>

>

)
Captulo

22: P r o y e c t o

d e p ro g r a m a c i n

m .

w rafre5h(nennrinl
re ? r* $ t-();

vaid 9laisar_ reg {ch ar #6'j'_cLava)

(
preca.-j,-_vintana(vectii-i_<j9_:r*54jo); *v*prinr(v*ntana_a_:r3baja, t , a, TNTeflPflETE: *);

>
void n a n s a je _ a _ u s u a r io ( c l 8 r n a n s a je )

M nsaja_a_usua-:o: ' tgrese c ia v * ); w ;et 3tr:arttarta_ 3 _t>'3 bs 3 0 . 8 u f _ : I a v s |; p o stra r jrtrtar* a(v afitan aj* _ rab aio |;

(
w e P 3 5 9 (s ta tu a * ifl> ;

nvprintw<9tatusir., o , 8 wrefrashtJtatuawln);
r fra s h ();

' S s , nonsaj e);

i
ve id <J<tfar_res(Cftar *Buf_ciava)

{
:rt54!-a.-_.*4.--.a(vri:ar;s_i9_:rj6aj'j); 'rp<-UiT(y#fltana- de_trat>jO, 1, O, *IMTeRPRSTE: );

>
v c id 0 re a ra r_ v r.t3 n a fW Ifi0 !M 'v e n t a n a l

w .5 a ;s _a _u ty a rio riftc rt< clava*); gatatrfvtftna_*_tna:o, 5 f_ c la v e ;;

(
* en m (vntana);
o ch o ();

sk5Jtrr_nntar4( ar.:ana_3a./f abalo);

>
veis *c*:r*.-_r*$nar D ufjcU va, cn ar Duf_valor) *otd nos:rar_vonuna{it\C(m ventana)

( eraMiventna_d*_:."ioa}'jJ;
nvcrint| '".:ar.t_a*_:raoajo, 1 ,

(
n o o c * ia ( |;

*, *INToaPREfE: is- , buf.oiavc);

*vo.-int<var.tui4_3_t-'iw|o, 2. . TITU LO : S i ', ouf_valor|; o*trar_v*fltana(vantaftaj5t_traftajo);

rrafratinlvontanai; ra f ra v i{);

od lU T *r_.*^j{cflar 5ur_cU v, zt\tr tw fjra la r, m t contaor)

)
voic 4 r ta o ir _ r e g ( c n a r o u f la v a , c n a r *0u r _ v a l 0r>

(
i n t u n , u i y , ligolnt_y;

<
3reoarir_vantara(veo:anaje_traD aJo}; aw o i Uttw(vM:ana_de.> traoa]o, t, , 'INTaflPRETE: >; nansa]a_a_ust:aria( 'Ingrese c la v e * |; *flts:r(van?ana_3e_tranao, su f_ cia v a ) ; avwoPlntvr(ven:ana_de,trabaio, 2, vj, TiTiiLO: *); nenaaje,ajjsuarxo(*Ingrese valor *I ; *'gnstr<v9nuna_a9_tr3Daa, ouf_vaIor|; wpar_ventana(vantana_de_cracajo);

e iiV yntana_5 _ tric a io , i u i y , aaxx); if(c o rta c o r ) ; eras; * *ntira j s a . t r a c a j a i ;


BvW I(vnta fl_3a_trifia io . ccntacar, 0. ACS_HLINE, xaxxj; rrtpriflT(ventana_de_traoio. ccntaacr t |, e, NTeflPRETs*); lywrxnT 1 ventar,aj _ : r asa) a, ccncsccr 1, eaxx / 2. TTULO*) sw ,lire (ve r:a n a _:e _:ric a jo . contaccr - 2, a, ACS.HLI.'tE, uaxx);

i
siguia ite j = :c-r.*=::: - 3:

Program acin en Linux

BWjrirTw'vntanajJijjrabaio, sifluienT9_y, o, *Hs , &uf.clav); nvwcrinrw|vitana_ce_traoijo. s5ut*nt9_y, saxx i 2. V s*, auf_valof); Tvastfarj/^ntanafvflrttana^c^tracalo!;
vold r#cuprar_reg(!ar *huf_clav9l

t
0reparar_ventafl(w itana_fle_trab 8 |o ) ;

itv*Brint'|v?otana_C9_tfaEajo. t, , 'INraRPflTf-: ); nefl3a;#.a,u9uarUI *lPflr93B c la v e ); *99?**(v9nui 4_d9_trab3]o. O uf_clave);

*aUrir_v9r .jr.aiv*i'.tana_20_traBa}i>|; ) En e*te mdulo suceden muchas cosas, poro no tantaH como p<xlfla parecer a pn* mera vista, m t c i a l i z a r _ p a n t a l l a micializa el subsistema do ncurses, crea tres subvenanos utilizadas a travs del programa y establece un estado del tedado que sea amigable con las ncurses. 'l\ como so lo mencion en los Capitulen 11 y 12, la mayora do los problemas que mplean ncurses deben interpretar la entrada do teclado de m anera directa (sin intervencin del kerael), y de ah sur vje la razn para llamar a C b re a k . La llam ada a keypad permito interpretar fat alm ente las pulsaciones de tecla do cursor y de funcionen del teclado. La fun d n noecfio evita quo cualquier te d a mal pulsada sea reflejad en la pantalla, salvo que se lo requiera espoclicamunte. Las subventanas que son creadas sim plifican la administracin de la pantalla. Como se ver enseguida en el progra ma controlador de panUdlu, ol manejo do la enerada y la salida va dos ventana* separadas hace quo el retrazado de la pantalla sea mucho ms sencillo, c e r r a r j i c u r s e s restaura la entrada desdo teclado a su modo procesado o 'cocdo* (cooiicd) y cancela los recursos de memoria otorgados a las tres subventanas. Finalmente, esta funcin llama a endw in p ara perm itir que las ncurses se hagan cargo do prolijar los recursos que emplearon. Estos pasos restauran el es tado del term inal a su condidn preexistente. t r a z a r _ p a n t a l l a simplemente exhibe la pantalla nidal que vern los usuarios cuando comiencen el programa. La runn a n e n sa j e _ a _ j$ u a r io actualiza u n a linea de estado m antenida en la parte inferior de la pantalla. Esta linea de estado es empleada para brindar al usuano informadn adidonal y para c-xhibir mensajes de error. Tanto mensa j e_a_uSuario como otras ratin as utilizan dos rutinas utilitarias, preparar ^ventana y (F o s tra r_ v e n ta n a , para simplificar la adm inistradn de venta nas. preparar_ventana borra una ventana y activa el modo de envo de caracteres 3 pantalla, hariendo que las pantallas que contengan datos ingresa dos sean fciles de leer. La ru tin a :n o s tra r_ v e n ta n a , por su parte, actualiza a ventana con la que se ha estado trabajando y tambin stdscr, de modo que cual quier cambio qua haya sido efectuado quede reflejado en la pantalla del usuario. Las funciones aadir_reg, eliminar_reg:b u s c a r ^ r e g , n i c s tr a r _ r e g y r e c u p e r a r _ r e g presentes en c d m _ p a n t a il a . c im plem entan ia fundonalidad necesaria p a ra aadir, elim inar, buscar, exhibir y recuperar regis tros individuales, respectivam ente. Las m ism as transfieren datos recupera dos dsde la base de datos a la p an talla de ncurses. I-a fu ndn l i s t a r _ r e g s merece u n comentario especial. La m ism a e st diseada p a ra

Csotulo 22:

P r o y e c t o de program acin

4 8 7

exhibir todo? los registros de la base de dato s (comparable a a opcin - L de c l i e n t e ^ c d s . c ) . La m ism a tr a ta de d isponer la salida a pantalla de una m anera atractiv a. Ei argum ento c o n t a d o r es clave. Cuando contador es 0 ningn registro h a sido exhibido todava, de medo que l i s t a r _ r e g s prim e ro crea u n encabezado an tes de exhibir cu alq u ier registro. De all en adelan te. l i s t a r _ r e g s actualiza la v en tan a d e trabajo, con ei registro siguiente. U na mejora tit: p ara esta fu n a n aera p erm itir desplazarse por la ventana de trabajo si el nm ero total de registros a 3er exhibidos excede el nmero de filas que posee la v en tan a de trabajo.

La parte m s sustancial de la mcerfaz interactiva reside en i n t e r f az_usua


r i o _ c d n . c , que se lista a continuacin
/ xene'* 5*1 T9griM fl in c # r'Jtjjs u a r;o j:tB .c /

r
ir<t*rfa:_u*vrio_:o.; - Contraaisr dt 3a* 5s cato Je CO a . :c a l bisado

en " t u r t a i. I H-KlvH <tdli0.f->


<*nu:d.f> wclyc*
;n c lu C * * trK J w ti # ir .c li* J t

*ar v / ra
r*

te*

)
*/
P lib e 2 .1 .1 de oae

-getoot
< ! tr in g .f t>

oetopt
*eacov a m u tra c io n

ir*
Y a .ie jo

* 1
3 d a to * *f

5 it5 r_ d e _ :< ja .T c d K r .r * /

de

p a n ta lla

K ttlM
v o id

-t2*

p c o o _ d * _ e p l * o '. : c ) ;

ir t a*afl(int argc. cnar arjvt

{
i r t v a lo r j-* tc r n d o . o p cio n , fx e y . c c n x a w r , l ; e a te ro cr-ar * o o ta rg ; ( Os < g rc o t.n > /

c* i r S u f_ c 1 < * [ Iw S C J U F i , Ou*_valdfITAHW0_9UF|; zr.ir 06* v a lo r ; a lc r * ;

/* v a l:: .- 1 lirsei ze ectaflos 't


s * i:c n (ir j;t {

c a t 2: * u t iliz a r la aase ce date espcciicada / cociw* = efcot(iPjc, argv.

lf\COt'.Sn a

i f i c o r a n ; * X .l ) {

Odo_de_pM(J; > aisa t

* -l

./

> .>

>

>

> J

> J

'
Capcuio 2 2 : P ro y e c to d e p ro g ram ac i n

4&8

Programacin en Linux

489

f { a b r ir jjb (o p t a r } )) f p r ir .;f( s M < T ,

( ' E r r o r a l a b r i r l a C 3S? 3 5 ta to a % s \ n \ o p t a r a )

3las
3 8 T.S3 i _ _ U S ,1 - 1 0 ! c 1 ' r o i s t r a

n a S id o a r s d id o * l;

9 X t(S X IT .P A IL U flE > ;

ir r ;
C19 <v _":3 i :

} } >
bn jafr; a s o <: / U t i l i z a r l a o ase d tatos D redeterninatfa */

~Z: E lia in a r un registro {


r ? i ; f l i - a r _ - 5 i a 'j t ,_ c l3 v o ) :

9 l i * r a r _ r s g ,'b u '_ c lz v ) ;

i? ( vale r_re tomado > 9) r-3CM :*_3_jS'.arior'::379 ra ^reentrada*); ?1 i|v3 lo r_re tcm a c < a> o*r.*aj _a _jJuario (* Tuve lu^a-* error no a riv is to J;
9 l

I f fa b r ir _ d b ( V U L L | ) {

c u t [ 'E r r o r a l a c r i r la b ase do d a to s p r e o n t e n ir a d a * :- ; exlt(EX IT_rA lLU R 6>;

}
Onjak; d a f a u lt : H CdO .8_ffl0lo(i
re a * :;

B tr.s4T_a _jS 'jrio Cil *?gis;ro ha J i t o eliBnado*); bra<f


/* l in e a tlB conandos nul r * c a c t a 5 a /

ras* *SY_F(j :

; =<: Buscar un

r*gu t r o */

ys c a r_r^(O g '_c la v ); 3 ? flIlt(4 v ilO f. 8, U Z 5|C 8 T!J valcr_r*tcrnado ouJca.-_rea-'bv* _clav, va lo r); if(vaior_re*.om*do > o

\ r fw m an bioqut do m u cu -i
' coron. a r n cu rse s V l f ( l n t c l a l i z a r j > a n t a l l a i ) < ) ( / Las n cu rao s no arran ca ro n */

Br.i4j*_i_gsuapiorClav na <nccnt*a*|; lia

i t (valor_rtc.*nadc < a)

B u t i ( r r o r 1 i n l c u l k a r n eu rita s*); c # r r a r j < ) ;

nflnj4ji_i_uuar:3(*'wvo lugar r re r no p r m s to * ): Isa ( a*n*a l *_a_jx/ar :c (* E l ra g u tra na sido ubicado*); i5 rm tri5 u f_va lo r, 's.*-.*, ( tn t; v a i o r . n , fenar V/.or.OUtAj.-

axitEXir.FAILURE);

)
y F r a M r l a p a n t a l l a i n i c i a l */ tra z a rjja n t a lla O ;

a o s t r a ^ r e g p u ^ c l a v . b a f jf u L o f ) ;

>
sreai;

/ t i laio principal do ccfl-andoa

( {

:aja KTr_F(5) :

* F 5 :- ecuprar un registro /

wnila( ( Tky - fltch{)> I* KEY_F(1}|


jw lt c h jf k a y J { C158 <EY_F(2} : C

.-*cue*rir_r*g(buf_cave); M*set(*Valoc. , s:<sf ( 0 8 T ) ) ;

F 2: A adir un r e g i s t r o */

/llar^rtornaas = recuparar_.~$|bf_clav, valo r);

a a d lr _ r e g | 5 u f_ c la v e , b u f _ v 3 l o r ; v a lc r_ ,-a to rra d a aa 2 i r _ r e g f 6'j f_ c la v o . C y f_ v a lo r | , i* (v a lo r _ r s to r n a d o > 0 } 3 B n s a 9 _ a _ u 3 u a n o r C la v e ya a g i s t e * ) ; a is e if( v a lo r _ r a to r n a d o < n6n33!_a_usijarL3(*TV lu g a r e r r o r no p r e v is t o * 1 :

i f t v i i a r ratom ado > ai aer.ss33_4_J8uario Clava no e rc o n tra c a " ); l i o i ' {valcr_rato m aco < 0:
n*ftsaja_a^VJario(*Tuvo lugar error no arsvisto*!;
le
o M M ] e _ 3 _ j 3 u a r i o ( * E l r e g i s t r o na 5 r.ee ja i c a o a * } ;

490

Programacin en Linux

JCrintfC-jf.valo**, %.**, (In t)v a lo r.s iz e , {C tor *)valar sata); *5strar_reg(buf_sllve. b u fj/ a lo r); br*ak; caga K E Y / (8 ):

l* F8: L is ta r toaos los registros (


0) (

lf(fcontacor = con tar_rtg s{))

nofl5a;8_a_usuariol'No existen registros en osta aase de catos*); or#ait;

) l Establecer una tabla de puntero (


l* (ic l v e j - nalloc(?U9O|D07 ) contndorli w .aa|_a_uiurto( "Sr-or do nemcria ); t {(va lo r* * na lloc(szo ot{ 06 r ) contador)) WJU| iionsii|e_,t_\)juario( rror do nonsrla*); WJlL)

/ Asignarla valor f o r c ; i

a caca puntero / < contador; * t) (

l< (clavs| 11 nallcc(r/MM0_8U*)) NULL) { r.unsa:_a_UBuario{ "Error do nenaria*); oran*;

f
tf 11valor*i[l) ^ <talloc(rwwio_BuFj) NULL) ( nansa)_a_usjarlo( Error ce nenoria*); brea;

)
c RecuDerjr todos los registros */ valor_r9tomaco = lst3r_regs(slvea, valoras); if|vaIor_retcmaao == 0 ) { lensajeji^suanoCProoiena con el admnistrasor de tase de oatos*), break;

)
Exhibir los -egstros recuperados er osntalla . a r ( i * 0 ; i < contador; - i! { 3p rin tfitjf_cla ve , . ' s *. | in t;s tr le n (c la v e s [l]), c la v e s U ]); sprint*( buf_valor, v s * . (in t)$ trle fl< v a lo r* s [i])( v a lo re s fij);

Ustar_r3gs(0uf.clave, Out_valor, i ) ;

}
tr.saj9_a_uSLano|'Este es a l u ltin o registro* );

Capitule 22: Proyecto de programacin

491

5 *su l:

i ' Ca* incorrecta, tn fo rn ar i us.iar;o j Sin f i n t r l;

w-nk; } / Srttf sn*ctt(fk*y) / } crrr_sef); eerr*r_rcvr*(J;


* i:< x : .5UCC3S);
C * r ra r la
3 3 39

<JatO */

C#r-*r ! SU083tit<M t# C U T O S */

I n s t r u c c i n * !

u so

r o y a e a

i
fO iO dO _3_*0U O {vO llJ)

<
pucs(*MOOO 0* 9 * t 0 tn:rfai_uiuarvo_o3fl l-a 5ia a dato!*);

*it!x!*_F*:w l; ) m t e r f a z ^ u s u a r io _ cd m . c debera r e a t a r l e familiar al lector. El flujo de este programa, y gran p a n e de su cdigo, se asem ejan mucho al cdigo do c l i e n t e _ c 3 n . c . Ello es deliberado. 1 d U e io de la interfaz de base de datos es tal que la muca diferencia verdadera e n tre el cliente de lnea de comandos y e! program a interactivo es que los datos recuperados de la base de datos de be formateado de u n a m anera que re-aulte adecuada para las ncurses. Por supuesto, existen ciertas diferencias m t e r f a z _ u su a rlo _ c C m . c es mucho m as sencillo de invocar. El p ro g ram a acepta u n a opcin de linea de comandos. - a archivo), que le perm ite a uno utilizar una base de datoa dife ren te a la predeterm inada. c d _ u s ic a .tb. Los argum entos u opciones in vlidas producen un m ensaje con instrucciones de uso, del cual se m uestra a continuador, u n ejemplo:
$ nts-*i_usjl< i3 j:t -s ljjfta asse 3 catos UlCC EMPLEO; n:er*ai_t,u3rio_c<Ja [-a O*ra_t>ase_3a_datos

Los siguientes bloques de cdigo ab ren ia base de datos, comienzan el su b sistem a e ncurses y tra z a n la p a n ta lla -.nidal. La pan talla que crean i n i c i a l i z a r _ p a n t 3 l l a y t r a z a r _ p a r t a i i a se m uestra en la figura 22-1.

) Programacin en Linux

F ig u ra 22.1. La panialla principal de in te r fa z _ u s u 3 r io _ C d m . Toda la accin tiene lugar en ol lazo w h ile loop. La sentencia s*v tc f. procesa las puiaaaor.es de teclas del usuario, procediendo entonces a llam ar a la ru ti na adecuadu El usuario puede p u lsar una de laa siguiente* teclas vlidos F2: F3: F4: F5: F6: A adir un registro E lim inar un registro B uscar un rogistro R ecuperar un registro L istar todos loa registros

F I0 : S alir del program a Si so comete u n rror de ti peo aparecer en la p an talla el m ensaje C la v e no del* m i d a exhibido en la lnea do escudo. El xito o fracaso de cada operacin se m u estra en la lnea do estado por medio de la fiinan m en sa}e _ a _ u su a r i o . Uno puede hacer fcilmente que el program a acepte otros pulsaciones do tecla como alias do loa comandos actualm ente definidos. Por ejemplo, el tipear a o A lo perm itira al usuario a ad ir un registro, y si o p ea ra I o L podra obte ner un listado de todos los registras presentes en la base de datos. Cuando so oprim e F2. prim ero ol program a le solicita que ingrese el nom bre del in trp re te y luego el ttulo del CD. En !a figura 22-2 se m u estra la a p a riencia de la p an talla despus de haberse aadido un registro. Si la clave ingresada ya existe an la base de datos, se exhibe en p an ta lla el correspondiente m ensaje de error. P ara eiim inar un registro de la baso de datos, O prim a F3. La p an talla que aparece cuanto se elim ina un regislro 3e m u estra en la figura 22-3.

Cawtulo 22: Proyecto de programacin

493

F ig u ra 22.2. i n t e r f s z _ 'j s u a r i o_Cd<r, despus de haber aadulu un nuevo CD a la base df. datos.

F ig u ra 22.3. in t3 r fa z _ < js u a r i0 ^ c d fld e s p u ta de hab*r elim inado un C l) de la base de datos. La ru tin a b u s c a r _ r e g , invocada cuando ei uauario oprime F i, recorro la baso de datos buscando una clava que coincida con la clave que ingres el usuario. La figura 22*4 m u estra la p an talla despus de hab er ingresado la clave a buscar, y !a figura 22-5 m u e stra la p an talla luego do u u a b sq u ed a exitosa, i n t e r f a z j j s u a r o j d m u tiliza la funcin m o s tr a r _ r e g pora exhibir el regia ero que encontr. L a figura 22-6 ilu atra el aspecto do la p a n ta lla cuando ia bsqueda no arro ja resultados positivos.

F ig u r a 22.4. i n t e r f a z _ u s u a r i o _ c d n luego de haberse ingresado una cla ve p ara buscar.

Programacin en Linux

F ig u ra 22..5. n t e r fa z_usu3r0__cdm exhibiendo el resultado de una b q u td a f'xitoa,

F ig u r a 22.6. Apariencia de a pantalla luego de una bsqueda infructuosa de i n z e r fa z _ u s u a r l o _ c d a . Lo mismo que la ru tin a C l i e n t e __cdm, la operacin de r e c u p e r a r _ r e g busca u n a clave especifica en lugar de recorrer toda lu base de datos en bus ca de una coincidencia. Desde el punto de n a t a del usuario, el aspecto resu l tan te de la pan talla es idntico. El cdigo m s interesan te de i n t e r f az j j s u a r i a _ c d m . c es el empleado pora lista r todos los registros de la base "de datos. O tra vez, su funcionalidad en la aplicacin interactiva es casi idntica a la de s u pruno de la linea de comandos. Comienza por obtener el nm ero de registros presentes en la ba se de datos. Si el valor obtenido es cero, el program a exhibe un m ensaje a ta l efecto en la lnea de estado. De no ser asi, i n t e r f a z _ u s u a rio _ c d m . c co m ienza por establecer tablas de punteros a claves y valores y luego le asigna el correspondiente valor a cada puntero en la correspondiente tabla.
C O N S E J O

insistimos, una mejora valiosa serla asignar cada eierrento do ta te d a dinmicamente


en lugor de asignarlo estticamente.

La llam ada a L i s t a r _ r e g s rellena las tablas de c l a v e s y de v a l o r e s . 1 correspondiente bloque de cdigo utiliza u n lazo ^ o r p ara exhibir en pantalla todos los CDs presentes en la base de datos. La Ggura 22-7 m uestra la apa r e n t a de la pan talla despus que i i s t a r _ r e g s h a actualizado la lnea de estado para indicar que ha sido exhibido el ltim o registro de la base de datos.

Captulo 22: Proyecto de programacin

495

F ig u ra 22.7. l i t a d o de todos los registros presentes en la base de datos de CD musicales. La ru tin a de listado de registros de i n t e r f a z _ u s u a r i o _ c d m .c realiza un buen trabajo listando todos los CDs p resen tes en la base de datoa. Si *1 lec tor desea m ejorar su funcionalidad, modiflquela de modo que ei uauario pue da desplazarse por la lista de u n ex trem a a otro

Lo que viene
Qu t !o que viene ahora? Bueno, c u rra r el libro y convertirse en un lamo so program ador de Linux, por supuesto! Hablando on aerio, el lector ha cu bierto en t e libro u n a g ran cantidad d<* m aterial y ponee una slida base p ara seguir program ando. Lo que re*ta es sunplem onte escribir pilas de pro gram as que utilicen lo que haya aprendido. No existe realm ente otra nume ra de convertirse en ur. program ador com petente de Linux que ia prciica. A unque un libro ie pueda m o strar los principios y modalidades bsicas, la experiencia es el m ejor m aestro. Siga a d ela n te y programe!

Parte VI
%

Apndices
A . R e c u rs o s a d ic io n a le s B . H e r r a m ie n t a s a d ic io n a le s d e p ro g r a m a c i n

,1

A
Recursos adicionales
Bibliografa comentada
ALLESA.VDRO RUBWl, L inux D tvict D riixrs. ORcilly, 1998, ISBN' 56592-292l. Este m el libro que tr a ta sobre cmo escribir controladores de dispositivos para Linux; contiene vanos ejemplo* completos y tiles. ARMAS KaLLZ DaLHEI>gx. programmng with Qt. OTtoly. 1999. ISBN 156592 588-2. Por el momento. es ei nico libro publicado sobre la pro gram acin con Qt Si uno pretende realizar programacin formal con el tool* kit Qt. esta libro es de empleo obligado. B ill RcENBIatt, Leam ng ihe Korr. Shell, C/Reilly. 1993, ISBN 1-56592-054-6. U na introduccin tutorial a la interfaz de Kcrn, contiene varios captulos dedica dos a la program aran de scnpts para esta inierftt. Todo su contenido debena poder ser aplicado a p d k sh , la versin de dominio publico de la interfaz de Korr. BRENT B. Weu3. Practica! Programmng m T il and Tk, 2da edicin. Prer.tice Hall, 1997, ISBN 0-13-616830-2. T d/T k es el lenguaje UNDG'Linux de scn p ts que cuenta con ms prestaaor.es. T d es la seccin de modo cexto y Tk aade una interfaz X Window, Este libro es el texto recomendado para aprender Td/TicBrzax W. KkrmGHaN. D e ssis M- R tckie, The C Programmng Lan^uage, edicin. P rennce Hall, 1988. ISBN 0-393-9694-5-2. Conciso pero completo m anual sobre el lenguaje C de programacin, tal como se encuentra norm a lizado por ANSI e ISO, esento por la5 dos personas que crearon el C.
C amROS N ew Ha M, B_l R osensla TT, L ea m in g :he bash Shell, 2da edicin, O'Rcly, 1998. ISBN 1-56592-347-2. U n a introduccin tu to ria l a la in te rfa z c a s f i , contiene varios captulos dedicados a la program acin e sc rip ts p a ra e s ta in te rfaz .

Clo-.ts L. Tondo, S cott E. Gqg>L, The C A n s ia r Book: Solutions to Exercies ir. :'ne C Programmng Language, 2** edicin. Preatice Hall, 1989, ISBN 0-13*109653-2. E s:e libro contiene soluciones para cada ejercido que Kernigh an y Ritchie pocen - a su libro, The C Programmng Language. Lam enta-

}
500 Programacin en Linux

blem ente. las soluciones suponen conocimientos de caractersticas del len guaje todava no presentadas. D onald K n u th , The A r t o f Com puter Program m ing, Volme 1: F u n d am en tal Algorithms. 3 edicin, Addison-Wesley, 1997, ISBN 0-201-89683-4. D onald K n lth . The A rt o f Computer Programming. Volume 2: Sem inum erical Algorithms, 3ra edicin, Addison-Wesley, 1998. ISBN 0-201-89684-2. Don'ald K>"TH, The A rt o f Computer Programming, Volurne 3: Soring and Scarchir.g. 3ra edicin, Addisoa-Wesley, 1998. ISBN 0-201-89685-0. E stos tres volmenes son las obras clsicas sobre desarrollo de software. Son n eutrales en cuanto a herram ien tas y lenguajes, pero el conocimiento destilado de 30 aos de programacin, as como miles de algoritmos, justifican absolutam en te la inversin (el conjunto de los tre s volmenes cuesta ms de u$s 125.00). E ric H arlow , Devefopmg L in u x A pplications m ith GTK a n d GDK. New R:ders. 1999, ISBN 0-7357-0021*4. GTK* and GDK proveen los toolkii* y bi* bliotecas que brindan suporto a GNOME, el adm inistrador do v en ta n a s do Enlightenm ent, y al popular program a de m anipulacin de im genes GIMP, un clon do Adobe E hotoShop. Jam es D. Foley. A ndries van Dam. S tev b n K. Felvek, Jo fn F. H u g h es. Ri c h a rd L. P h illip s, Introduction to Computar Graphics, Addison-Wesley, 1993, ISBN 0-201-60921-5. L i obra clsica sobro xneos paro com putado ras. E sta versin oa en vordad u n a versin compendiada de Computer Grnpfuer. Principies a n d Practica. Si uno quiere com prender grficos de computa* cin. este libro, o au prim o ma grande, es ol que debo agenciarse. K N. Kjno. C Programming: .4 M odeni Approach, W. W. Norton an d Com* pany, 1996. El libro de King es generalm ente recomendado como la introduccin tucorial a C para aquellos que en cuentran el lenguaje C de programacin dem asiado lacnico. KURT W all, NLutK W.vrSQN, MajK WHITIS, L in u x Program m ing Unleauhcd, M acm illan C om puter Publi3hing, 1999, ISBN 0*672-31607-2. ?;3te es un li bro do nivel interm edio avanzado que cubre muchos aspectos de la p rogra macin p a ra Linux. LARRV WALL, TOM CHRISTIANSEN, R a n d a l L. SCHWARTZ, Program ming Perl, 2lla edicin. O'Roilly, 1996). ISBN 1-56592-149-6. Escrito por tres lum in arias de Perl, incluyendo al creador del longuaje, Larry WaLL. cubre toda la gam a de program acin con Perl, versin 5. MlCHAEL BECK. HaRaLD BOHMK, MlRKO D2L-U)7.KA, ULP.tCH K unitz, R o b er? MaGKUS, DlRK V ERvoRNF,R, L inux K em el Internis, 2la edicin, AddisonWesley, 1998, ISBN 0-201-331*43*8. De u n tercio del tam ao de The Linux K em el Book, Beck y com paa b rin d an al lector u n a mucho mejor introduc cin al kernel de Linux.

Apndice A: Recursos adicionales

301

M ck afi. K. Jo k x s o s, Epjk W, T so a n . L m u x Application D tvvlopm ent. Addison-Wesley, I99S, 0-201-30821-5. Escrito por dos de los mejores program adores de aplicaciones de Red H a t Softw are, este libro realiza u n excelente tr a bajo en explicar las su tilezas de escribir aplicaciones p a ra Linux. No cubre kernel hacking, sin embargo. MlSE LoUBDES. AfiDY Oram. Program m ng w ith G N U Software, O'Rcilly. 1997. ISBN 1-56592-112-7. E scrito por integrantes de Cygnus Solutions, pro veedores de apoyo tcnico y de l a versin comercial de las h erram ien tas GNU, este es un excelente libro sobre el empleo de h erram ientas de desarrollo GNU taie.? como g e e , Ernacs, make y g o b , el depurador (dcbugger) de GNU. N en. M aitk ew s y R :ck S to k e s, B eginning L in u x Programmng, Wrox Press, 1996 E ste libro, aunque d esactualizado a esta a ltu ra , cubre tcnicas bsicas de program acin en Linux/UNDC E st m al titulado, adem s, ya que ta m bin cubre program acin en UNIX. PaIKCK VcLKERDING. ERIC FOSTTR-*QHNSOS\ Kevw ReICHARD, L inux Progmmnung, > 0 5 Press. 1997, ISBN 1-55828-507-5. Volkerding, creador de la popu lar distribucin de software Siackw are, recorre el amplio panoram a de la pro gram acin pora Linux, cubriendo mucho terreno en un breve lapso de tiempo R a n d a ll L S ch w a rtz t Tom Chp.istia.vskn, L ea m in g Perl, 2,A edicin. O'Rcilly. 1997. ISBN 1-56592-234-0. Si se desea apronder Perl, este es el li bro que se debe leer. Rmy C a ro . E ric Dumas, P ra n c k M v el, The L inux K cm cl Book. Jo h n Wiley and Sons. 1998, ISBN 0-471-98141-0. Traducido del francs al ingl.s. C ard y sus coautores explican casi cada linea de cdigo de la kernel 2.0.x E st desactuaiizado actu alm en te, por supuesto, debido al lanzam iento de la kernel 2.2, pero sigue siendo a n una excelente introduccin La traduccin del francs es tosca y despareja- E ste libro no puede ver el bosque por m irar los rboles. R ich a rd M. Stallm am y R o la n o M cG ratH , G N U Make. A Progm m fb r Olrccing Rcompilation. Freo Softw are Foundation, 1993, ISBN 1-882114-80-9, E scr.to por los creadores de G N U m ak e, este libro cubre make de adelanto p a ra acras y de a m b a p a ra abajo. Todo lo que no se encuentre cubierto en este libro, se lo deber b u scar e n el cdigo fuente. WaRREN W. Gay, Sarros Teach Y cu m elf L in u x Program mng in 24 Honra, Macraillan C om puter Pubiishing, 1999. ISBN 0-672*31582-3. Buen* in tro d u c cin x la program acin p a ra Linux. W RICHARD ST7r.TrNS, A dvanced P rogram m ng in the U N IX Enuironm ent, Addison-Wesley, 1993, ISBN 0-201-56317. L a obra clsica sobre program a cin -n UNIX. Aunque no es especifica de Linux (ni siq u iera menciona a Li nux, de hecho), cubre com pletam ente todas las cuestiones referentes al aca-

Program acin en Linux

tam iento a POSIX. Como Linux es u n clon de L^EX. la m ayora de las tcni cas m encionadas tam bin tienen videncia en Linux. Stevens se en cu en tra actualm ente revisando APUE, como es sabido.

Recursos de Internet
La In te rn e t desborda de informacin sobre Linux. E ste apndice apenas al canza a rozar la superficie de lo que hay disponible.
S itio s W e b

G eneral Thi Association of Com puting M achinery (Asociacin de M quinas de Com putacin)
nttp:/vw>*. acn.org/

Tho Free Softw are Foundation (Fundacin de softw are gratuito) n ttp :/, m i.M f.org/ The G rtJ Project (El proyecto GNU)
htTo:/'w*w.cnu.org/

Instituto o f Electrical and Electronics E ngineers (In stitu to de Ingenieros Electricistas y Electrnicos)
n -t o ://**.i.o rg /

Linux.com
nttp:/,*w*. :inu*.car/

The Linux Documentatior. Project (Proyecto do documentacin de Linux)


ht?p:/itft;aUb.unc.Ou/U>P

The Linux G azetta (La gaceta de Linux)


http://wwi.uc.ccia/lg/

The Linux Jo u rn al E1 peridico de Linux)


nr:p:/^w#. U nuX jourM l.caa/

The Lmux K em el ^E! kernel de Linux)


rirrs ://***. kernil.org/ h ttp : II** . coa/ guices /TU(/ m
aex

. ntnl

The Lmux K em el H ackers Gu:de (La g u ia del k em e l de Linux para hackers)


Pttp:/irn.reOfia:.con;aiJ8/Hyper.*<es'gt.'lfng.fitnl

Linux Online (Linux en Lnea)


it t p :/ ,'* .i:.,m .crg,*

The Linux P rogram m er s 3ounce Pom t (El ilum inador de los program adores de Linux)
f r e t a : / iw v a .ii.n u .O i.a u /lin u x /p r o g r a m u n g ,'

Apndice A: Recursos adicionales

503

i ne L inux F rogrsnuner's Guide L a g u a de program acin de Linux) Ttc: t t linuxwM.c5. r m . eou/ cP6/ Lm-jx M agazine R evista de Linux) M o ;/ 1wwi iL,-ui m * LinuxToday (Linux Hoy) to: /. w. lir.iutaiay. cw Linux Weekly N ew s (Noticiero 3em anal de Linux) Linux World (M undo de Linux) Linux WWW Mailing List Archives (Archivos de lista do correo WWW de Linux) h ttc: 1 1 1i"-u***. < 16 . tr tu . ti'jl C W i l_ r en ivm Mailing L ist Archivos (Archivos de lista de correo) fttt9 ://v.uil-trcfilW coa/ The UNIX Program m m g FAQ (las FAQ [Preguntas Frecuentemente Formu ladas\ sobre program acin UNIX) >tts: I . * U.N!f -faQ/crocraiMP/taq/ Usenet FAQ (FAQ [Pregunta* Frecuentemente Formuladas] de UieneC) Rtt?: vw.lwvifila.Mo/fijs/ htt://*wi fiq.org/ U seaix The Advanced Compucing S ystem s Assocation (Usenix - La Aso ciacin de Sistem as Avanzados de C om putacin) http://OTv.uttAii.org/ Linux C e rn e r Development (C entro Linux: Desarrollo) TTO: / . I.1 V Xc*ntr.arj/ar/5veixni':/
JUEGOS

The Linux G ame D evlopers Web R ing (Ei C uadriltero de los prugram adores de juegos para Linux) ntrp:/ w . c . m : -Kk-lO/lfiOBlcg..ira Linux GSDK rr.-.z: i- i i t a-c.c*-esquirol u ---d8*.fi:a G rap.cos Form atos de -archivos grficos -zzz: OTv.cis.oMa-srst.Ki'nyBtraxt, faq/uswet/gi'aaucs filfor*ats-fsc. tco .rrr;

5 04

Programacin en Unux

Mesa
h* : 11 ** . asee. ta c . etiul orianp /Mesa. fttnl

PROGRAMACIN PARA REDES


B e e j's G u i d e to N e t W o r k P r o g r a m m i n g ( G u a d e B e e j d e p r o g r a m a c i n p a r a re d e 3 ) n t t p : / Iwmt. es t . c suc i i c o . odu /-bc j /gu i d a n e ; f S p e n c e r s S o c k e t S i t e ( S it io d e s o c k e t s d e S p e n c e r ) ftttp :// ww. iow tfc . coa /s c c te ts /

The UNIX Socket FAQs (Las FAQ (P reguntas Frecuentem ente Form ulada^ sobre sockets UNTX)
h tp i.'/ w w .ia H ^ e ld .c o n / a c s / a n lx - fa q / s o c k e t i

DESARROLLO DE SISTEMAS OPERATIVOS


T h e O S D e v e lo p m e n t W e b P a y e ( L a p g in a W e b d o t ie s a r r o lio d e .s is te m a s o p e r a t iv o s ) ftttp - S/9* iff e c x .n s:.a u /cs-d ev /o sd o v/ in d * x.n tn i V V r it in g L i n u x D e v ic e D r iv e r X ( R e d a c c i n d e c o n t r o la d o r e s d o d is p o s it iv o s p a r u L in u x ) hr tp: y ,'w . --otiha: .con/ -]ol'3onr/dcvj.cB3 .n tfll

SEGURIDAD

Diseo de softw are seguro


n t t o ^ .'^ .s u n .c flit / s iH ^ o r ld o r U n o . awRl O.i i3 8 / sw o l^ 4 * # cu rity.M n l?C < i

08i

T h e S o c u ro U N I X P r o g r a m m in g F A Q ( L a s F A Q (P re g u n ta s F r e c u e n t e m o n to F o r m u la d a s ) s o b r e p r o g r a m a c i n s e g u r a o n L 'r .ix ) n : t p : / wn*.*niti>fang.con/iupf

DISTRIBUCIN DE SOFTWARE

Construccin de paquetea RPM


n u p : / ,'vw .rpn.org/

MULTIMEDIA
P r o g r a m a c i n e n L i n u x d e c o n t r o la d o r e s p a r a C D - R O M n:*.p: / !***. e e . tu . o: . au / L inux /cdroit / G u i a p a r a p r o g r a m a d o r e s d e s i s t e m a s a b ie r t o s d e s o n id o nctp:/.' vtcn. 4f ro n : te c n . con/ agu ido /

TOOLKITS PARA GUI

GTK
n:p:/,'iw.gtK.3rg/

T .ioriai de GTK
< : t p : / /la m>n. con/- slow/gtk /

Acr.dice A; Recursos adicionales

505

C entro re desarroliadores de KDS itts : *ww.f.uniielD. ecu.au/-ssk/taie/devil/ LessTf Project (Proyecto LessTif) nttp: H***. Uiszxt .erg i Trol! Tech's Q t Q t de Troll Tech) Http:/ nnf.troIi.fV3/ Pgina principal de Xorms http://tx-C$.ptys.i.etfV/*forw/
PROGRAMACIN UNIX

S un Developer's Corniectioc .Conexin p a ra program adores de Sun :rtrp:/ v.3un.:ofl/a-<*l-0'f"3/devoloi5ars.nrrl


PROGRAMACIN X W1ND0W

Tho O pen G roup (El Grupo A bierto >(anteriorm ente X C onsortium )


n tt o :/

lfechniad X Window System S ito s (Sitios tcnicos de sistem as X Widow) * W .! ** r*?:ui,0*tiy*t0n/KSiti.htl X Imago Extensin irifo (Inform acin sobro extensin de X Iinago) n * T O ;.u a e ri.e t.c c o /c rn n /j/U o -jn / XPM form at and library (F o rm ato s y bibliotecas do XPM) http :!!** i/ir u . f < / aali / U tw i / < o>hw l
DISTRIBUIDORES

C aldera System s flttp;: / **< yJtMU .coa/ Deban rictp: -*".e*oi*vor<;1 Red H at Soft*.varo h ttp :/ **.'wr*:.co> S lackw are wn.sUcmrj.cai
nrtff:

***.:arsa. zza

S ta n p e d e

rizc:.. hsn.iZiaceei.erii/

Programacin en Linux

S-u.S.E
h t t p : / > '* * . i i s s . c c * /

U senet com p. adm Ln . p o i Ley - Polticas de adm inistracin de sitios. com p. L ang. c -C u b re program acin con ANSI/ISO C. cOiTp. o s . l i n u x . d e v e lo p m e n t. a p p s -C ubro ios detalles de programacin de aplicaciones bajo Linux. com p. o s . i i n u x . d e v e lo p m e n t. s y s te m -C ubre todo lo quv uno siem pre quiso sabor sobro ln programacin de sistem as con Linux, pero no se atrevi i preguntar. comp - o s . l i n u x .S etu p -E sta b le c im ie n to y adm inistracin de un sistem a Linux. com p. s h o l i . p ro g ram m er -Cubro program acin de interfaces. com p. u m x . adm m -A dm inistracin do un sistem a UNIX. comp. u n tx .p ro g ram m er-A n aliza la program acin en el entorno UNIX.
L is ta s d o c o rre o

L.u siguientes listas de correo son accesible con Majordonio Para suscribirse a una lista, envo un tr.en.saje a m a|ordom o& vger. r u t g e r s . edu con la p ala bra s u s c r i b e seguida por ol nombre de la lista de correo en el cuerpo del mensaje. Los comandos presentes on la lnea de asunto" no son procesados.
l i n u x - a p p s - A p li c a c io n e s d e softw are

Unux-c-programming-Programacin y desarrollo con C l i n u x c o n f ig - Configuracin de sistem as l i n u x -d o c - Proyectos de docum entacin Liriux - f s f - Fundacin de softw are g ratu ito li n u x g e e - A suntos im portantes p ara aquellos que program an en Linux i i n u x - k e m e l- D e b a te s generales sobre e lk e rn e l i i n u x - k e r n e l -a n n c u n c e -Anuncios sobra kernel li n u x - k e r n e l - d i g e s t -Compendio de kernel de Linux i i n u x - k e r n a l - p a t c h - P a r c h e s de kernel i i n u x - l i n - j x s s -DesarroLlo Linux M ach de servidores nicos l i n u x - o l-E m p le o dei tuoUdt de in terfaz de objeto l i n u x - o p e n g l - Program acin con OpenGL en Linux

Apnele? A Recursos adicionales

507

ii f l y x pkg - P a ra facilitar la instalacin d e paquetes l m u x r a i d - D esarrollo y empleo de softw are 7 hard w are RAID l i n u x s e s i - Desarrollo y empleo de controladores SCSI l i n u x s n p -L m ux ea m quinas m ulproceso sim tricas l m u x so u n d -U tilizaci n de tarjetas y u tilid ad es de sonido bajo Lmux l i n u x - s v g a l i b * D ebates obre bibliotecas SVGA l i n u x - t a p e - Utilizacin de dispositivos de alm acenam iento en cintabajo Linux l i n u x te n a -U tiliz a c i n de la suite torra de program as l m u x x 1 1 -U tilizacin del sistem a X Wmdow bajo Linux L ista de De sarro i loa de Software p aru Linux, pora desarroliadores do soft ware- P a ra su sc rib ir , en v iar un m ensaje a l s d - l i s t - r e q u e s tP c a n n o n e x p r e s s .cora con nada en el cuerpo del m ensaje excepto SUBSCRIBE.

.1

B
Herramientas adicionales de programacin
Bastidores de aplicaciones
J X . e s q u e le to d e a p lica cio n es /1 m * . z c c . e a ltfc n . oj/ L e ss f. u n clo n d e M o tif ntto:: *. U l t i f ,0T9 X o rm s, u n toocit d e X W in d o w s d e a ito n ivel
::p . e r * w s * ir * --'" M w M f o n u

J*/

C r y sta l S p a c e , un m otor 3 D e s c r ito e n C *+ n ttp : ; i ay z t l . ii/uixgjMs . c /

Bibliotecas
Epoio*. u n a encapa u lnr. C f - de la m ayora de loa API do UNIX nttp ros. orfl/ LibWWW. una biblioteca g e n e ra l de Web p ara clientes y aorvidores n t t j :;/ 3.org/:<je/*w/0Htri3<j:i.cfl.htal So. u n a im plem entacin ro b u sta de la Biblioceca E st n d a r do E/S n ttp :. . rts u re n .i t t . co*/sw/tools/afio/

Certificacin
C aldera System s Linux T rainm g
p.r:?:. - c a l c e . * i y m e s .con/ecucat
ic a I

Linux P ro fe sio n a l n s u tu te

ntto://9**.lp.or/

Programacin en Unux

Ked H at Softw are Developer T raining


h t t o:ll'mm P M f t a t . C 3 n i ' i C 0 u t / , 9 9 9 / p r 5 S 5 _ d e v _ t r 3 i r . i n g . h t t l

Red H a t Softw are L m u x C ertification


n ttp : / *r<w. r o-jnat. cw p ro < ju c t3 / f axn in g . htal

Compiladores y lenguajes
A lleg ro CL. un s is te m a d e d esa rro llo rp id o d e a p lica cio n es L lS P /C om m on L ISP nt t o: fpanz.ccntflo^i'Oload.ntnl

C C s T , un in te rp re to C V C + + h ttp :/ / r o o t.M M .c n / r o o t/ C in t .n t q l EGCS


neto://Q C J.cygnu *.ca1/

F G R T R A N 90
h t t p :/ / w m .t M ls 'ullt#u.cco/<low nloM /Li' 0 *i(.itJii

F reeB u ild er, un IDE b a sa d o e n J a v a nr:3://*inburi.ocm.cOB,'.xOWinvlin/Froofluldor/lnax.ntni JD K , el Kit d e d esa r ro llo d e J a v a V.1.2 n ttp : / 1 ***.t>Uck<lo*n.q c jI jva llnux/cir^ora, htnl P G C C . el GCC p ara P en tiu m nttp:/.'*.flcc.al.org/ PGC C, e sta c i n d e trabajo http://WKW.Mrocp.con/ Tcl/TK nttpw w.5criDtics.ce*/proau5ts/Tcltk/iraox,nt.Tii

Distribucin de software
P g in a p rin cip a l d e R ed H a t P a ck a g e M an ager -ictp://*,rpn.orgf

Editores
C forge, u n e n to rn o in te g ra d o d e d esa r ro llo C /C ++
nttp:;/ww.codaforge.cc<r/C3l-Dlfl/Custco/M 8Vir:<aplan/Bot8ter.C9l?flEgisterafr9

C M eister, u n a p la ta fo rm a /co m p ila d o r ID E in d ep en d ie n te

n tts :/ fvm . creister .cea/

Apndice S. Herramientas adicionales de programacin

Code Crusador
stto- .cco.eiltecr.

GNCFro. una versin comercial de las herramientas de desarrollo GNU


n-tp: 11.cy;ivjj.t3o'5^y0^5

Jessie. una IDE de plataforma cruzada desarrollada por Silicon Graphics


Atto:M os9.sai.csa/cro}i:irt*uia/

Grficos
General Graphics Interface, un sistema grfico de plataforma cruzadu
nt-prQ xet.orw

MESA, un clon del toolkit OpenGL de SCI


h ttp ://V M .a tu 3 d .o rg /

Herramientas
LCLint. una herramienta esttica de verificacin de cdigo
/ *v. jcj . ic* .o ::.#u/Ulti:

Cbecker. para localizar errores de memoria en tiempo de ojecucin


nttp: /'* .rg/scfmre/cftfleMr/cnecJur "tB

CCMalloc. otro perfilador de memoria nt:/.'iserse.ira v**.Ut-*r%w<ccttUocr

Miscelneas
Lnsure+~. una herramienta esttica de validacin de ^.odigo como LCLint) ntj: I /. parsoft -coai crocucts/lrsure/ ird**-nt> PowerRPC, una herramienta de desarrollo rpid para ..uadas cediraientos remotos tttj: M..Utoclj.coa ;r 0 CLC:*'S0 ^rrpc.'t"':-s4<3/v1
Xaudio SDK. n toolki: para construir soft'vare h n s : / *v. t auou . c / cow Icae i / *Liflu*
.1

pro

Wotsit's Format, un recurso para cientos de formatos de archi/u fttt?;/j vw.aotsu.org/ Wiilows API. para transportar aplicaciones de Wmdows a Linux
t t s ;, / W .V lle S .8 0 *

512

Programacin en nux

.1

>

'

'

> '

'

'

Code Medie, una interfaz basada en X ai G B depurado .gdb) ittC: / /w*w ita.caitech. edu/-gienn/ne-3lc.ht*l Referencia en iinea a biblioteca de C nt-p: / lnkunMr*.con/itnjcL/ Index. ntni

Software cientfico y m atem tico


Trazado de datos (Data Plotting) DS.LIN
{Liscs/OLiaci)
nt:o://vr*w.U.inpi. npQ.de/tfisiin/110c5.htnl (LI3CS/0LI8C2) http:

<!*m. linn pi.n pg.d/d islin /U bc6.h tnl

PV-WAVE/JWAVE, herram ientas de anlisis visual de datos ntto:..'w *w vnt.ooo/Drocuct3/fave/wave52iregister.htTl


VARKON, b ib lio teca s do in g e n ie r a y CAD
nt ?a : 'v^. 1Cro f orn. o / $o<ire# . > itn

Software de base de datos


D ISA M 96. b a ses d e dato ISAM (M todo do A cceso S ecu en cial Lndexado) ft11 p: i / w w . 3y t*do aign B. c on/C l Sin / r jj1 3 r . .it o Inform ix
n t t p ://w. infornix.co/linux/

M ySQ L. u n a p op u lar b aso d e d a to s SQ L p a ra Lanux h ttp :// 1ww.By5ql.con/ O racle


n ttp ://platforo#.orael*. con/llnux/

PostgreSQL
Htip;//Af*w.pca;grsqi.org/

>

>

>

>

>

>

ndice
S m b o lo s ifdcfs. arch ivo s con.
22

tin c lu d e . a rc h iv o que
ronttonan. 12

-g. opciones. 14. 21. 450 -help. opciones. 30 -i, opcin, 37 jN. opcin. 37 -k. op ci n . 37. 53
I. o p c io n e s , 14, 220,

$, p a la b ra * cla v e . 411-

41S
S, v a ria b le * . -46 .C. e x te n si n , 9 .ce. e x te n s i n , 9 .i. e x te n si n . 9 .11, e x te n si n , 10
.o, extensin, 10 Jj, extanain. 10 .o, M to n si n , 10

/dov, filM y stcm , 70. 278 t a r u o t ' Li u p to d a te . m en saje d e e r r o r , 52 < -1, valor, 84 < std arg .h , 304 a. e x te n si n . 10 , 303 -anvi. o p c i n , 14. 17-18 b. o p cio n es, 468 -c, op ci n . 11, 14,300301

D XOPENjSOLR C E ,
m acro, 347 -d. o p c io n e s. 37. 52. 301, 428 dele te, o p c i n . 449 -Dfooobar, o p c i n de lin e a d e c o m a n d o s, 14 -E. op ci n . 10 -. in d ic a d o re s (flajsj, 19. 30 -f. opcin. 19, 3", 414415 fstack, sw icch d e v e r i ficaci n d e e g es, 29

300,413. 421 Ldirnjuno. opcin, 1415 m, o pcin do ln e a do c o m an d o s, 450 MM. opcin. 15 n, opcin. 37-39 O. opcin. 14, 19-20, 23. 29 o, opciones, 14, 450 -On, opcin. 14 p. opcin, 301 -peduntic, opciones, 14. 17-18 q, opcin, 301, 428 -r, opcin, 37, 301-302, 414-416, 418-420 -s, opcin. 37, 10-42, 300-301 -static, opcin, 14-15 -truditfonaJ. opcin, 14 -u, opcin, 300, 413. 420 -v. opcin, 15. 300 -W, fam ilia d e opcio nes, 14, 29. 37, 39 -Wall, opcin, 11.17 -w error, opcin, 15 Wfile, opcin, 37 W im plicit-m d/cactor (flag) de funcin. 29 -x. opcin. 12

516

Programacin en Unux

.1

A a b o rt, fu n c i n , 23, 87 a b r ir archivos, 140, 142 bases de dato Berke ley, 204-207 colas (queues), 356357 FTFOs, 331 Gnu DeBugger (gdb). 426 pipes, 322-323 programas con Gnu DeBugger (gdb), 426-427 acceso ile g a l, m em o ria , 434, 437 acceso , g a n a r a archivos bloquea dos. 182 a informacin do a r chivos, 148-149 n variables Juera de rango. 434 acceso s de bitrt, 134 ilegales, 435 indicadores (flugs), open y creat, lla m adas u sistem a, 140 permisos, modifica cin de. 152-154 a c c io n e s, ra t n , 258* 264 a c e p ta c i n d e p e d i d o s d e co n ex i n , 383-387 a c tu a liz a c i n d e tar* balls, 449 A DCs (c o n v e rtid o re s a n a l g ic o -d ig ita les), 288 a d d c h , n c u rs e s , fu n

c i n d e , s a lid a d e c a r a c te r e s , 230234 a d m in is tra c i n d e p ro c e s o s y m em o ria , 122-123 a d m in is tra c i n de r a t n , n c u rs e s, 257-264 a d m in is tra c i n de mapeo de memo ria. fam ilia de lla m adas para. 174 da ventanas, ncur ses. 253-257 a d v e rte n c ia s , g e n e ra c i n c o n GNU ce (gee), 17-18 a g re g a d o d o se g m e n to s d e m e m o ria c o m p a r tid a (SHM ), 347-351 a g re g a d o d e tar* h n lls, 449 a g re g a r archivos comprimi dos, 446 bases de datos Ber keley. 204-207 bibliotecas do pro gram acin, 300317 colas (queues), 356357 color, ncurses. 250253 com entarios, makefiles. 50 conjuntos de sea les, 107 cursores, 213 daemons, 191-200 Directorios de S iste ma de Control de

Revisiones (RCS), 411 directorios, 163-165 estructuras de comu nicacin ioterprocesos (IPC), 342 FIFOs. 331-333 formatos grficos a aplicaciones, 313 formularios, n cur ses. 269-273 m akeles, 35-36 m apa en memoria, 175-177 m em ona com partida (SHM), segm en tos, 345-346 mens. ncurses, 264268

procesos, 77*33
reglas, herram ien ta makc de GNU, 40-52 RPMs (A dm inistra dores de Red H at Package), 453*459 semforos. 368-374 sesiones. 193 sockets do entorno UNIX, 387-388 sockets. 380-382, 394*397 subventanas, 253255 tarballs (archivos tar), 446-448 ventanas nuevas e independientes. 253-257 ARFLAGS, v a ria b le p re d e fin id a , 47 A itk cn , P e te r, 139 a lc a n c e d e v a ria b le s , 434-435

ndice

517

alig n e d . a tr ib u to . 23 a lm a c e n a je d e d ir e c c io n e s. re d e s , 393* 396 a lm a c e n a je d e e le m e n to s e n b a s e s de d a to s B erkeley, 208-210 a lm a c e n a je te m p o r a rio (ca c h e ) d e tip o e s c r ib ir d e sp u s , 142 a n lis is d e a rc h iv o s d e e sp e c ific a c i n . 455-458 A PI. V er in te rfa c e s p a ra p ro g r a m a s d e a p lic a c i n a p lic a c io n e s aadido de formatos grficos a. 313 base de datos do CD musicale. cdigo fue ni* p ara, 463495 bases de datos, re cursos para. 512 bastidores de aplica ciones. recursos para. 509 compilacin. 7-30. 425-426 contrasea. 65 corriendo en Gnu DeBugger (gdb), 426-427 creacin de bibliote cas para. 301-304 daemons. creacin de. 191-200 depuracin. 426-435. 439-443 cstribucin. 44o453. 504. 510

extensin de p resta ciones de, 313 gzip. 51 Ipedated, 196-199 m ake de GNL*. 33-53 recompilacin des pus de extensin. 313 recursos cientficos y m atem ticas pa ra.. 512 setgid y setuid. 6667 ar, c o m a n d o . 301 AR, v a ria b le , 47 a r c h iv o s b in a rio s , C o n c u r r e n t V er si n S y ste m (CVS), 412 a r c h iv o s b lo q u e a d o s, u tilid a d RCS descripcin. 41 ingreso y extraccin. 422-423 a rc h iv o s c o m p rim i d o s, c re a c i n d e. 448 a r c h iv o s d e c o n fig u ra c i n . 303 a rc h iv o s d e d ir e c to rio . V er d ir e c to rio s a r c h iv o s d o dispo.si. tiv o . 133 a r c h iv o s d e e m p a q u e ta d o , lista d o d e s u c o n te n id o co n l a u tilid a d tar, 446-449 a rc h iv o s d e e sp e c ifi c a c i n . R PM . 455 459 a r c h iv o s d e r e p o s ito rio . V e r a rc h iv o s

d e tr a b a jo a rc h iv o s d e s lo a g r e g a d o .160 a rc h iv o s d e tr a b a jo descripcin, 410 modificacin. 413 projam ieato, 420421 visuaiizacin de dife rencias entro. 418-420 a rc h iv o s e s p e c ia le s d e d is p o s itiv o s d e c a r c te r , 133 a rc h iv o s n o rm a le s, 132 a rc h iv o s o r i e n ta d o s a b y te s , 132 a rc h iv o s rp in rc , 453454 a rc h iv o s Uir. 446-449 a rc h iv o s a incluir, opciones y argum ontos. 1516 a p ertu ra de. 140-142 ostento (log), c rea cin de. 194-196 binarios, C oncurrent Versin Systom (CVS), 411 bloqueados descrip cin 410 ingresar y extraer de directorios RCS, 422-425 cerrar, 140, 141 configuracin de, 303 Je biblioteca, opcio nes y argum entos, 15-16 de especificacin, en paquetes RPM, 455-459

'

>

>

.)

,i

518

P ro g ra m a c i n e n Linux

de trabajo. 410. 413, 418-421 definidos con ^ifdes. 22 de3cnptorcs. cierre de, 19*4 directorios. Ver dimctonos eliminacin desde tarballs, *449 en trad a / salida (E/S), llam adas a sistem a. 123 escribir a. 142-L44 especial de bloque, especial do carc ter y diapoitivo, 133* especiales. Ver a r chivos de disposi tivo extensiones, in te r pretacin do cc de GNU de. 9-10 grficos. formatos, 503 impresin de infor macin referente a, comando rlog, 421-422 .ndwdos con include, 12 ingresar y extraer archivos, Revisin Control System fRCS), 411-413 imncdificables, 160 lecrora de, 142144 tnakc cdigo m ultifuente. compilador. de programas con, 12-14

creacin, de reglas, 40-52 creacin de un ar chivo make, 3536 descripcin de un makefile, 34 manejo de, 132-190 norm ales. 132 Revimon Control Syatem (RCS), 410 revisiones, 410 rpmrc, 453-I54 *ln para urtndir, 160 Ver tam bin vnculos simblicos; tarballs a rc h iv o s, b lo q u e o d e. 182-185 a rc h iv o s , se cc i n (RPM ), 458-459 a rg u m e n to s clave, iniciali/.acin, 208 cmd, 371-374 facilidad y prioridad, 197 GNU cc (gee), 14-22 indicadores, 179 llam ada a box, 238 longitud y com:en 20 . 177 opcin, 196 tipo, 363 valor, inicializacin d e .208 arreglos im prim ir prim ero ubicaciones en m em oria asocia das con, 430 semforos, 369 AS, v a ria b le , 47

ASFLAGS, v a ria b le . 47 a s ie n to (log), a r c h i vos d e, d a e m o n s, 194-196 a sin c r n ic o , c o m p o rta m ie n to descripcin, 94 llam ada a fork. 79 AT&T, 95 at m ic u . 183 a tr ib u to s nlmeado, 23 em paquetado, 23, 26-28 no retom o. 23-26 no-vuelco y aync, 160 procesos, 62-77 a ttr ib u te , p a la b r a re s e rv a d a , gee, 2326 a ttr o n y a ttro ff, lla m a d a s u, 251 a u d io c o m p rim id o , 288 a u d io sin c o m p rim ir, 288 a u d io . Ver ta r je ta s d e so n id o B B * tre e , b a s e d e d a to s, 205 b a c k tra c e , co m a n d o , 429-430 b ad m em , fu n ci n . 436-439 B ailey, E d . 453 B all, B ill, 137 b a s e d e d a to s d e CDs m u sic a le s, c d igo fu e n te de p ro g r a m a s p a ra . 464-497

ndice

519

b a s e s d e d a to s b a s a d a s e n re g is tro s , 204 b a s e s d e d a to s q u e e m p le a n d is p e r si n ih a s h ) de d a tos, 204-205 b a s e s d e d a to s B -tre e , 205 B asadas en d isp er siones o hachea, 204-205 basadas en registro?. 204 Berkeley. 203-217 CD musicales, cdi go fuente para. 464-495 recursos de softwa re, 512 Ver lam bitn Domair. ame Sjutem (DNS) b a s tid o re s p a ra a p li c a c io n e s, 509 B erkeley, b a se d e d a tos, 203-217 B erkeley, A PI ( i n te r faz d e p ro g ra m a s d e ap lic a c i n ) p a r a so ck ets. 380*382 b ib lio te c a r s a d l i n e . GNU. 432 b ib lio te c a , a rc h iv o s de, o p c io n e s y a r g u m e n to s e m p le a dos, 15-16 b ib lio te c a s c o m p a r tid a s, 310*312 b ib lio te c a s de p ro g ra m a c i n , c r e a cin d e, 299-317 b ib lio te c a s de p ro g ra m a c i n , h e r r a

m ie n ta s p a r a . 300* 304 b ib lio te c a s e s t tic a s , 15-17. 303-310 b ib lio te c a s convenciones sobre nom bres. 15 de ncurses. 220-240 de programacin, creacin de, 299317 stticas. linkeo do. 15-17 readlme de GNU. 432 recursos p ara. 509 b ig -en d in n , c o m p u ta d o ra s , 392 b its m o d ific a d o re s de m odo d e a r c h i vo, 135-136 bits de acceso. 134 informados por co mando SN0CTL_ 0SP_GETCAPS 294 modificadores de modo da archivo, 135-136 bkgd. lla m a d a , 237239 b lo q u e a d o re s, a rc h i vos, 183*186 b loqueo d e a rc h iv o s e sp e c ia le s, 133 b lo q u eo d e re g istro s, 185*187,189 b loqueo de archivos, 182-189 e memoria. 179-180 de registros. 185-139 b lo q u eo s c o m p a r ti dos, 1 8 6 blo q u eo s c o m p u ls i vos, 183

b lo q u e o s d e a d v e r t e n c i a . 183 b lo q u e o s d e le c t u r a o c o m p a r t id o s . 186 b lo q u e o s d e e s c r i t u ra o e x c l u s iv o s ,
!S (

b lo q u e s d e d a t o s ,

134
b o r r ie r , f u n c i n . 230 b orrar

registros corrientes de bases de dutos y cursores. 215 directorios. 165-167 archivos de tarbalis, 446 elementos de bases de datos Berkeley, 210-211 colas do mensajes. 365 semaforoi, 3671-374 evitar en archivos do trabajo, durante ingreso a directorio RCS. 413 b o x . f u n c i n . 239
b o x , lla m a d a a m ac r o , 238 b r k , lla m a d a , 123 b u g s (erro res)

de memoria, tipos de,435-436 correccin de errorea con GNU cc (gee), 21-22 B u r n e t t , S t e v c n , 137
b u sca r

ayuda sobre coman dos de Gnu DeBugger igdb), 437 paiabras reservadas de Revisin Con-

520

) ) ) ) } Programacin en Linux

>

crol System CRCS), 415-416 problemas en memo ria, 433-441 bytes, o rd e n d e , 392
C

C con E je m p lo s (li bro, 139 C P ro g ra m m in g L a n g u a g e, s e g u n d a e d ic i n . E l (lib ro ), 139 c, o p ci n d e lin e a d e co m a n d o s, 446 c_close. fu n c i n , 215 c_del, lla m a d a . 215 c_get, lla m a d a . 214 c_ p u t, fu n c i n . 214 en d o n a s de p se u d o -c a ra c te re s, 234 c a d e n a s, tip o s d e d a tos e sp e c ia le s en chair. puntero u una cadena de psoudocar actores, 234 chtyp. tipo de ca rcter que rep re sen ta un pseudocarctor, 231 ident, parm etro de la funcin openlog 196 callo c, r u tin a , 123 c a n a le s e n d is p o s iti vos m e z c la d o re s d e so n id o , 281-285, 290 c a ra c te re s , n c u rs e s entrada, 243-244 salida, 230-234 case, ra n g o s d e. s in ta x is, 23

c at, co m an d o , 32-322 C a th e d r a l a n d Che B a za a r, T he, 56 CC, v a ria b le . 47 C e rra r archivos, 138, 141 base3 de datos, 205207. 215 descriptores de a r chivos, 194 FTFOs, 333 Gnu DeBugger. 429 pipos, 322-323 c e rtific a c i n p ro f e sio n a l d e , L in u x , e n tid a d e s , 509 C FLAGS. v a ria b le p re d e fin id a . 47 c h , fu n c i n , 237 c h d ir, r u tin a . 163 c h m o d , U am adu, 123, 151-153 c h o w n , lla m a d a . 123, 153-154 c h s tr, e n d o n a s de p se u d o -c a ru c te re. 234 c h ty p e , c a r a c te r e s d e c a d e n a , fo rm a to, 231 ci, c o m a n d o , 411-415 c la v e /v a lo r, p a ro s, 204 c lav es, e n b a s e s de d a to s , 204 c lav e s, e n m e m o ria c o m p a r tid a , 343 c lie n te s , c o n e x i n a s o c k e ts. 383-388 cise, fu n c i n , 206 ci se, lla m a d a , 123, 140-141,324 c lo se d ir, fu n c i n , 167

c lo selo g , lla m a d a , 196 c lr t, fa m ilia d e f u n cio n es, 239 cm d. a rg u m e n to , 371-372 co, c o m an d o . 409-415 co d ecs. 278 c d ig o e n e je c u c i n , m o d ific a c i n de, 433-434 c d ig o fu e n te compilacin de pro gram as con archi vos do, 12-14 programa p ara base de dolos de CD musicales, 464495 SOffuiinionto de cam bios, Revisin Control System (RCS), 409-423 c d ig o m u e rto . 29 c digo ejecutar, modificar. 433-434 fuente baxe de datos de CD musicales. 464-495 rastren de cam bios, Revisin Control System (RCS), 409-423 inspeccin de. Gnu DeBufrger :gdbi, 430-431 modificacin de. implementaeiones, 57 muerto. 29 optimizacin. GNU cc (gee;, 19-20

ndice

521

ratn, compilacin. 258 reutilizacin. 299 c d ig o s d e re to rn o , su m a n e jo en n c u rs e s , 253 cdig o s de error. 124-123 de retom o, ncurses. 253 c o lo re s, a g re g a d o a v e n ta n a s con n c u rs e s , 250*251. 253 c o m a n d o s d e im p re si n . 429-432 co m a n d o s ar, 301 backtrace. 429-430 cat, 322-323 d y co. 411-415 cpto, 446 cut. 322-323 dele!*. *32 disable, 432 echo. 42 en makulcs, 35 enable. 432 gdb (G nu DeBugger), 425-427 Help. 429 id. 66 idcnt, 417-41 mo breakpom ts, 432 in s ta ll 449-453 invocar al anterior. 432 h lL envo de sea les. 99-100 ldeor.g. 302-303 ldd, 302 list. 429. 432 is. 9. 333

mkfifo. 332-333 om. 300-301 p rln t. 430-433 res. 417-423 riog, 420-421 run. 42S SNDCTL.DSP.G ETC A PS. bits reported by, 293 sta t. 147-151 step, 434 w natis, 429 c o m e n ta rio s , e n m ak e file s, 50 c o m p a r a c i n d e a r c h iv o s d e tr a b a jo . 418-420 c o m p a tib ilid a d do b ib lio te c a s , m a n te n im ie n to , 310 c o m p ila c i n c r u z a da, im p o rta n c ia e n L in u x , 8 c o m p ila c i n de cdigo p ara ratn, 258 con ncurses. 220-222 do program as. 7-30. 426-427 c o m p ila d o r d e C. V er GNU cc, eg e s co m p ilad o re-s, sitio s Web p u r a d e s c a r g ar, 510 c o m p re s i n d e t a r b alls, 448 c o m p re sa , u tilid a d , 448 c o m p ro b a c i n d e b i b lio te c a s , 308-310 c o m u n ic a c i n in te rp ro c e s o s (LPC) descripcin. 321 m em oria com partida

(SHM). -341-372 C o n c u rre n t V ersi n S y ste m (CVS), 409* 411 c o n d ic i n d e c o m p e te n c ia descripcin. 79 seales, 95 c o n d ic i n d e s a lid a . p ro c e s o h ijo . 84 c o n e x i n a s o c k c ts. 383-388 c o n e x io n e s a re d e s , 394 c o n fig u ra c i n c o r r ie n te d el m ix e r do so n id o , v is u a li/a c i n , 281-284 c o n fig u ra c i n , urchivo d e e m p a q u e ta d o d e R ed H a t (R PM s), 453455 c o n ju n to d e C o m p i la d o r GNU M ejo ra d o . 28-30 C o n ju n to E x p e ri m e n ta l GNU do C o m p ila c i n . 2830 c o n ju n to s d e s e a les, 95. 107 c o n m u ta c i n d e p a q u e te s , re d e s , 378880 c o n s ta n te s de tip o fi le, 136 lseek , lla m a d a , 143 c o n s tru c c i n d e p r o g ra m a s bibliotecas de pro gramacin, 299317 RPM (A dm inistra-

522

Programacin en Linux

dor de em paque tado de Red Hat), 458-459 c o n s tru c c i n , s e c c i n (RPM ), 455456 c o n s tru c c i n d e a r c h iv o s e je c u ta b les, h e r r a m ie n ta m okc d e G N U , 33* 53 c o n te o s do r e f e r e n c ia , m e m o ria c o m p a rtid a , 345 c o n te x to descripcin de. 62 variables do, 434135 c o n tr a s e a , p r o g r a m a s d e, 60 c o n tro l d e ta r e a s , s e d a le s , 93 c o n tro l dol proceso de cons truccin de pro gram as. 33-53 de semforos, 371376 c o n tro le s , e n tr a d a /sa lid a . Ver lla m a d a a ioctl c o n v e rtid o r e s a n a lo g ico -a-d ig ita l, (ADCs), lim ita c io n e s d e g ra b a c i n d e fre c u e n c ia s, 288 c o p ia d o d u r a n t e e s c r itu r a . 80 c o rre c c i n d e e r r o re s, GNU cc igcc),
21-22

c o rre g ir. V er d e p u r a r c o r r id a d e p r o

g ra m a s e n G n u D e B u g g er (gdb), 426-427 c o rr u p c i n d e m e m o ria , 435 e p io , c o m a n d o , 446 C P P . v a ria b le p r e d e fin id a , 47 C P P F L A G S, v a ria b le p re d e fin id a . 47 c re a r archivos de em pa quetada compri midos, 449 archivos tar, 447-449 bases de dato Ber keley, 205-207 colas (tfueues), 358369 comentarios en makofilos, 50 conjuntos do sea les, 107 cursores 213 daem ons. 191-200 directorio, 165-167 Directorios de RCS (Revisin Control System). 411 estru ctu ras IPC de comunicacin en ere procesos, 342 FCFOs, 331-333 formatos grficos en aplicaciones, 313 formularios con ncurses, 270-274 makefiles, 35-36 m apas en memoria. 175-177 m ens, ncurses, 265269 ncurses. color, 250253

procesos, 77-83 programacin de bi bliotecas. 299-317 reglas, herram ienta make de GNU. 40-52 RPMs (adm inistra dores de em pa quetado de Red Hat). 453-460 segm entos de memo ria compartida (SHM), 107. 347348 semforos, 368*371 sesionen, 193 socketa de entorno U N K . 386-3887 sockets, 381-383, 395-396 nuhventanas, 253255 ventanas nuevos e independientes, 253-257 c re a t, lla m a d a , 123, 139 c re d e n c ia le s d e u n p ro g ra m a , 62 o rd e n a m ie n to s alfan u m ric o s, o rd e n de c la sific a c i n , 204 erm o d e , fu n c i n . 242, 244 c u o ta s d e tie m p o , 62 c u rs_ w in d o w , p g i n a d el m a n u a l, 253 c u rs c r, p u n te r o , 223 c u rs e s d e BSD, 258 c u rso r, fu n c io n e s de, n c u rs e s , 223 c u rso r, lla m a d a , 213 c u rs o re s

creacin. 213 movimiento con ncurses, 239 navegacin de bases de datos con. 213215 c u t, c o m a n d o , 322323 CVS. V er C o n e u rrv n t V ersin S y ste m D DAC. Ver c o n v e rtid o re s do d ig ita l a a n a l g ic o D sc m o n s creacin. 191-200 inclusin de bibliote cas estticas en. 303 d n ta tfra m a . p ro to c o los, 380 d a to s e s t tic o s , b a ses d e d a to s B e r keley. 210 d a to s estticos, bases de da tos Berkeley, 210 laten o a de. 19 D ata B ase T h an g . 204 DB.NOSYNC. v a lo r de a rg u m e n to flags d e fu n ci n d b .o p e n . 206 d b . fu n c io n e s y p a r m e tro s. 206 DB, in d ic a d o re s ifla g s), 214 DBT. V er D a ta B aso T hang d e n ir handiers de seal. 106-114

variables. 42 d el. fu n c i n . 210 d e le te . c o m a n d o . 432 d e ls c re e n . fu n ci n , te rm in a c i n d e n c u rs e s, 228*230 d e p e n d e n c ia s , m nkefiles, 35 d e p u ra c i n co n GDR. 429 d e p u r a r (d o b u g g in g ) con Electric Fence, 43S-440 con Gnu DeBugger (gdb). 426-435 con mcheck. 441-442 con mpr. 441-442 habilitar, ncurwa. 221 memoria. 435-443 program as compila dos. GNU cc (gcc).

21-22
Ver tambin (roubUshocting (solu cin do proble mas) d e rw in . lla m a d a . 254 d e s c a r g a r (d o u n lo a d in g ) compiladores desde Internet, -510 Red Hat Package M anager (RPM), 453 d e s c r ip to r e s , c ie rre de, 194 d e se m p e o mejorar y optimizar cdigo: con GNU cc igcc), "19-20 reseas, 29 d e s p la z a m ie n to de c u rso r, n c u rs e s ,

p e d id o s c o n e s p e c ific a c i n d e v e n ta n a . 239 d e sp la z a m ie n to do c u rs o r, n c u rs e s, 239 d e te c ta r acciones de ratn. 259-264 .eriales pendientes. 114-116 d e te n c i n do p ro c e sos, 86-89 d ie_ o n _ erro r, fu n c i n . 23 d ife rim e n to d e co m andos pop d esd e la p ila (sta c k ), 19 d ig ita l a a n a l g ic o , c o n v e rtid o re s (DACs), lim ita c io n es en g ra b a c i n de fre c u e n c ia s, 288 d ire c c io n e s du fam ilias do soc kets Berkoluy, 381 ligazn a sockts, 383-387 redes, alm acena miento, 393-395 d ire c to rio s cam biara, 163-165 creacin y elim ina cin. 165-167 descripcin, 133 listado, 167-169 Revisin Control System (RCS), creacin de, 411 d ire n t, fu n c i n . 168 disable, com an d o , 433 d isk s, e s c r itu r a de m a p a s a . 179

5 * 4

Programacin en Linux

d is p o sic i n do v e n ta n a s , n c u rs e s, 223-225 d isp o sic i n , se a le s d e. 94 d is t ta r g e ts , majkefiles, 51-52 d is trib u c i n d e so ft w a re . 445-160, 504, 510 d is tr ib u id o r e s de s o ftw a re , 505-506 di, in te rfa z , 312-315 D N 5. V er D o m a in a m e S y ste m doit, fu n c i n , 72 D o m a in a m e S y s tem <DNS), 104407. V er ta m b i n b a s e s d e d a to s D S P.C A P , b its in f o r m ados p o r com an d o SNDCTL_DSP_GET_CAPS. 293 d u p w in , fu n ci n , 256 d u ra c io n e s d e s e a les, 288

E/S. Ver e n tr a d o /s a li da echo, c o m a n d o , 13 ech o , fa m ilia de f u n cio n e s, 231, 242 e d ita r permisos de acceso, 151-153 directorios, L63-165 archivos propiedad de, 153154 marca da fecha y hora . 158-160 unpiezr.encacianes

sin modificar cdi go, 57 proteccin de m a pas, 179 ejecucin de cdieo. 432-433 archivos de trabajo, 410 e d ic i n d e c d ig o fu e n te makeflea, 36 recursos p ara, 508510 eges, 28-30 E le c tric F e n c e , d e p u ra c i n co n , 43814 e lim in a c i n (kip ro c e s o s do, 86*89 e lim in a c i n d e b lo q u e o s e n a rc h iv o s e x tr a d o s . 422 e lim in a r archivas de trabajo, evitar d u ran te in greso a RCS, 413 archivos en tarballs. 44 colas de mensajes, 366 cursores, 215 directorios, 165-167 elementos en bases de datos Berkpley,
210-211

regiscros corrientes de bases de datos, 215 semforos, 371-374 e m p a q u e ta m ie n to d e a rc h iv o s, s is te m a s d e, 446-454, 504, 510

e n a b le , c o m a n d o , 433 e n c a b e z a d o , se c c i n (RPM), 456-457 c n c a m in a d o rc s , c o n m u ta c i n d e p a q u e te s , 378-379 e n c a p s u la m ie n to . Ver sn te s is e n d w in . fu n c i n , n cu rsC s te r m i n a c i n d e. 228-23 e n to rn o , v a ria b le s d e, 45. 302 e n tr a d a /s a lid a (E/S) de archivos, familia de llam adas a sis tem a. 123 tnultiplexing de. 169-174 e n tr a d a /s a lid a , c o n tro l d e, 279-280. 283 e n tr e n a m ie n to , r e c u rs o s p a ra , 51 e n v o d e se a le s, 99102 E ra (E p o ch ), 158 e ra s e , fu n ci n , 239 e r r a r le p o r u n o , tip o d e e rro r. 435 e rr n o , v a ria b le g lo b al, 126-128 e rro re s verificacin con GNU ce (gee), 17-18 cdigos de, 124-128 control de, 379 adm inistracin de dacmons. 196-197 herramienta maJie de GNU. 52-53 llamadas a siste ma. 126-127

ndico

525

errarle por uno. 435 Hamaca a pipe. 325 retornados por fun d o n es de men post y u n pos;. 256 valores, fondones de Socket*. 382-383 e rr o re s , c o n tro l d e. 379 e s c r ib ir a archivos. 141-143 a FTFOs. 335-336 3 pipes, 325-331 a sockets do entorno UNIX. 390-392 a sockets de Protoco lo do Control de Transm isin/ Pro tocolo de Interne! (TCP/IP), 398-401 mitpas a disco. 179 mensaje* a colas. 360-363 reglas, herram ienta m ake da GNU. 40-52 e sp e c ific a r frecuencia del m u treo. reproduccin do sonido, 290 ventana, ncurses. 238-239 e s ta b le c e r form atos de m uestra y frecuencia de mueatreo de soni do, 289-290 funciones de alarm a p ara interceptar seales. 102-105 niveles de sonido de interactivos, 2852S7 nm ero de canales

d e audio, 292 parm etros de dispo sitivos de sonido p a ra reproducir sonidos. 288-293 puntos de detencin, nom bres de fun cionad y nmeros d e lnea. 432-433 m nask, llam ada, 193-194 volm enes de dispo sitivo mezclador d e sonidos, 2S1 e s tru c tu r a s cabos (stubs). 301 packed, atributo. 23, 28 EXDEV, c d ig o de e r r o r r e to m a d o p o r L lam ada a sis te m a , 125 exoc. fu n c i n , 80-83 e x h ib ir configuracin co m e n te del mez* d a d o r do aomdos, 281-284 diferencias entro a r chivos de trabajo, 413-420 p alab ras reservadas del Revisin Con trol System (RCS), 415-416 valores de v aria bles. -433 e x it, f u n c i n . 23, 86 e x te n d e r la c a p a c i d a d d e u n a a p lic a c i n , 313 e x te n s io n e s d e C, G NU e c (gee), 2224

ex tensiones
C, 22-24 interpretacin por parte de cc de GNU de. 9-10 bibliotecas estticas. 303 F f, o p c i n d e ln e a do com andos p a ra a r c h iv o s ta r, 446 facility , a rg u m e n to d e l a d m in is tr a d o r d e in g re s o al s is te m a , 197 fa lla s d e m e m o ria n im ia s , p ro c e s o s, 73 fa lla s im p o r ta n te s d e m em o ria , p r o ceso s, 73 fallas, d e m e m o ria , n im ia s o im p o r ta n te s , p ro c e s o s, 73 fa m ilia d e d ir e c c io nes, s o c k e ts B erkcley, 381 fch d ir, r u tin a , 163 fch m o d , lla m a d a a siste m a , 151-153 feh o w u . lla m a d a a, 153-154 fc n tl, lla m a d a a , 123, 186 field, fu n c i n , 271* 272 F IF O s, 321-338. Ver ta m b i n p ip e s c o n n o m b re file, m odo, 134-137 file sy ste ra e x t 2 , 160* 163

>

>

S26

P ro g ra m a c i n e n U nux

fin a liz a r p ro c e so s. 86-89 flag, v a ria b le , 313 flag s (in d ic a d o re s), 19. 29-30, 139, 214 f l a g s a rg u m e n to , 179 flags, p a r m e tr o , v a lo res, 176 flock. lla m a d a a sis tem a, 123 fo rk . 323 fo rk . lla m a d a a, 7880 fo rm a to s chtypo. pseudo-caractere, 231 de m uestra lo audio. obtener y estable cer. 289-290 grficos. 313, 503 fo rm u la rio s, c r e a c i n d e. 269-274 fre c u e n c ia s , lim ita c io n e s e n su g r a b a c i n , 288 fto k . fu n ci n , 344 fu e r a d e ra n g o , v a ria b le s, a c c e so de, 434 fu g as, m em o ria. 438. 441-442 ful 1-d p lex , ta r je ta s d e so n id o descripcin, 294 grabacin de sonidos e n ,287 fu n c i n a la rm . c o n fi g u r a r p a r a in t e r c e p ta r se a le s, 102-105 fu n c io n e s abort, 23,87 addch, salida de ca

racteres con ncur ses, 230-234 alarm , configurar p ara in terceptar soales, 102-105 badmem. 441-443 border, 239 box. 239 c. 214-215 o h .237 cise, 206 dosedir, 167 clrt. familia de, 239 ermode. 242*244 cursor, 223 db o p e n .206 do control de m ens. ncurses, 266-267 do!. 210 delscreen, term ina cin de ncurses, 228-230 d)Q_on_error, 23 dirent, 168 dlopen, 312 dldose, 3132 dierror. 312 dlsym, 312-313 doit, 72 dupwin, 256 echo, 242 echochar, 231 endwin, terminacin de ncurses, 228230 erase, 239 exec, 80-83 exit, 23. 86 field, 271-272 ilacin de nombres, 432 ftok, 344 get, fam ilia de, 6364, 67-68, 212,

223. 245-246,343344 hline. 238 horch. 238 inset, 393 init, 226-228. 250. 265 insch, 232 k Jl. 88-89.101-102 tibefence. 438 line, 239 mk, familia do, 165, 323. 332-333 mousemask, 258259. 261 magbuf, 360-361. mv, 231-232 convencin do nom bres. ncurses. 225-226 n c w jte m y new . m e n. 265-266 newterm , uiicializa* cin de ncurses. 226-230 noecho, 242-244 opendir, 167 pause, intercepcin de seales. 105106 peloso y popen. 329331 po.st_menu, 266 pseudo, 225 put, 208 readdir, 168 retresh, 223 rradir. 165 sa_*. 110 scanw, 245-246 sem. 343,368-369, 371-374 set_m enu_fonnat. 265

indico

527

seaockopt, 394-395 shm gct. 343.346347 shruid, 348 sig. 109-110, 114 socket, 382-383 start_color. 250 sysconf. 71 system , 69-72,77 traoes. 429 unpost.m enu, 266 utim e. 156 vwscanw, 245 waddch, 231. 242 wait. 84-66 wech ochar. 231 w fndoM , 261 wgotch. 242 win, 238-239 wiaach. 232 Ver tambUn llam a das fu n c io n e s, lla m a d a s o. 126. 193-194 G g a n a n c ia . 281 g a tilla d o . 294 gcc. Ver GNU cc g d b . Ver G n u D eBugg e r (gdb) g e n e ra c i n d e a d v e rte n c ia s con GNU cc (gcc), 1718 g e t, fa m ilia de fu n cio n e s. 63-64, 6768, 73-76, 223, 242, 245-246 g et. fa m ilia d e lla m a d a s a s iste m a . 122123 g et. fu n c i n , 212, 343-344

GET. v a lo re s . 371-372 GETALL. v a lo r d el c o m a n d o Cffld d e la fu n c i n se R ic tl, 370 G tD s (LDs d e g ru p o ), 64-66 GNU cc (gcc), 7-30 com parado con eges. 29-30 compilacin de pro gram as. 7*21 extensinne* de C. 22-24 ejemplos de. 24-28 opciones y a rgu mentos. 14-22 con m ltiples arch i vos de cdigo fuente. 12-14 G nu D cB uggor (gdb), 426-435 GNU. h e r r a m i e n ta m ak e, 33-53, 432 beneficios de su uso. 34 invocacin. 37-40 rr.akeies. creacin de. 35-36 manejo de errores. 52-53 reglas, creacin de. 40-52 g ra b a c i n d e s o n i dos, 287-288 g r fic o s aadir form atos gr ficos x aplicacio nes, 313 caracteres. 232 form atos de archivo, 503 g ru p o s , p ro c e s a m ie n to d e, 76-77

GU Is (in te rf a c e s g r fic a s d e u s u a rio ), to o llrits. 504-505 gzip, u tilid a d , d i s t r i b u c i n d e so ftw a re , 446-449


H

h a b ilita r d e p u ra c i n ncurses. 221 acciones de ratn, 258 h a n d le , v a ria b le p u n te r o , 312 h a n d le r s d o se a l, 106-114 h as_color:\, lla m a d a , > :,o h e lp . c o m a n d o , 429 h e r r a m ie n ta m ak e. Ver h e r r a m ie n ta m a k e d e GNU h e rr a m ie n ta s aada- formatos g r fico a, 313 base de datos de CD musicales, cdigo fuente para, 464495 bases de datos, re cursos para. 512 bastidores, recursos para, 511 cientficas y m ate mticos, recursos para, 512 compilacin de. 7-30, 426-427 contraseas ocultas,

66

corriendo en Gnu DeBugger (gdb), 428-429 creacin de bibiiute-

, 52S

f J } ) ) ) Programacin en Unux

>

cas p ara, 300-30-3 aemon3, creacin e, 191-200 depuracin de, 426435. 438-443 distribucin de, *45453.504,512 extensin de presta ciones de, 313 gzip. 51 Ipedated, 198-200 raake de GNU. 33-53 beneficios de. 34 invocacin de, 3740 malte fitas, crea cin de. 35*36 manejo de errores d i, 52-53 reglas para crea cin de makefiles. 40-52 recnmpilacin des pus do oxUnain do prestaciones, 313 sctgid y setuid. 6667 Ver tambin recurso HIVAL, v a lo r s u p e rio r d e ra n g o en se n te n c ia c a se ran g o s, 24 h lin e y h o rc h , fu n cio n e s, 238 h o s tn a m e s en D N S (D o m a in a m e S y ste m ). 402-405 h u rfa n o , p ro c eso ,
84

I id. c o m a n d o , 66 id e m , c a d e n a , 196

id e n t, c o m a n d o , 417418 id e n tific a c i n d e v a ria b le s , 434 id e n tif ic a d o re s de p ro y e c to , 344 id e n tific a d o re s , 343 do cola de mensajes, 356 de procesos, 62-63 de proyecto, 344 Id irn a m e , o p ci n . 14-15 TDs d e g ru p o (GEDs), 64-66 tD s d e u s u a r io <UIDs), 64-66 ID.s e fe c tiv o s, 64 IDs r e a le s d e u s u a rio y d e g ru p o . 6-1 Illogal o p tio n - m e n saje do e r r o r , 53 In ip le m e n ta c io a c s modificacin 3111 va ria r el cdigo, 57 p rocosos, 61 im p re si n do informacin de archivo, comando rlog. 421-422 prim eras posiciones do mem oria aso ciadas con a rre glas, 430 in c lu si n d e a r c h i vos, o p c io n e s y a r g u m e n to s, 15-16 in c o m p a tib ilid a d e n tr e v e rs io n e s d e b ib lio te c a s, 310 in d e p e n d e n c ia de te rm in a le s , n c u r ses, 220 in d ic a d o re s flags),

19. 29-30, 139, 214 Lnct, fa m ilia d e fu n c io n e s, 393 in fo b re a k p o in ts , co m a n d o , 432 in fo rm a c i n s o b re tiem p o s, en p ro c e sos. 69*72 in fo rm a r a c c io n e s d e r a t n , 258 in g re so d e c a d e n a s , n c u rs e s , 245*246 in ic ia liz a c i n de argum entos clave y valor. 208 de conjuntos do pa ros do coloros, 250 de ncurse3. 226-228 in icio du p ro g r a m a s en G nu D eB ugger <gdb), 428-429 In it. p ro c e so . 62 In it.p a ir, fu n c i n , 250 in itsc r. fu n c i n , 220228, 265 in lin e , p a la b r a r e s e rv a d a , 23-24 in m o d ific a b lc s. a r c h iv o s, 160 in o d e s, 147 in sch , fu n c i n , 232 in s e rc i n d e c o m e n ta r io s e n m ak efiles, 50 in sp e c c i n d e c d i go, G n u D o B u g g e r (gdb), 429-430 in s ta la c i n d e t a r g ets, m a k e file s, 5152 in s ta la c i n , se c ci n (RPM ), 456-158 in sta ll, co m a n d o , 449-452

ndice

529

insxaiacin/desinst3-

c h iv o . G NU cc. 910

la c i n , s c r ip t, s e c c i n d e (RPM ), 456 in te rc e p c i n de acciones de ratn. 259-261 de seales. 102-114 in te rfa c e s g r fic a s d e u s u a r io (G U Is), to o lk its. 504*505 in te rfa c e s p a r a proTramas d e a p lic a ci n (A PIs) adm inistracin de seales. 106 prcgram srin de jonido. 277-294 socket Berkeley. 3780-352 in te rfa c e s de manejo de archi vos. 138-154 de MIDI i Musical In sin u n en t Digi tal Interface). 278 de programacin de aplicaciones < API) adm inistracin de a a les, 106 programacin de tonidox, 277294 de ratn. 258 de sonido, program a cin de, 277-294 di, 313-316 grficas de usuario (GUI), toolkits, 504-305 I n te r n e t, re c u r s o s p a r a p ro g ra m a d o re s , 502-512 in t e r p r e ta c io n e s de e x te n s io n e s d e a r

I n te rro g a c i n a d is p o s itiv o s m e z c la d o r e s d e so n id o p o r c a n a le s d is p o n ib le s . 281-284 in v o c a c i n de la h erram ienta m akc de GNU, 37-40 de 1a utilidad tar. 446-448 del comando install. 450-453 io ctl. lla m a d a , 279280. 283 [PC (c o m u n ic a c i n in te rp ro c o so ) descripcio. 321 m em oria compartida (SHM). 341-374 IP C S y ste m V. 342374 IPC , o b je to s, 342 IP C . v a lo r e s . 371-372 IP C . V?r c o m u n ic a c i n in te rp ro c e s o s

to s, in ic ia liz a c i n , 208 k ey (clave), a r g u m e n to d e fu n c i n m sg g e t, 357 K h a ttr a , T aj, 441 kill, c o m a n d o , e n v o d e s e a le s , 99-100 kill, fu n c i n . 88-89,
101-102

k illin j (e lim in a cin) i, p ro c e s o s de, 86-8

J
J o n e s , B ra d . 139 ju e g o s , p ro g ra m a s de garillado, 294 recursos p ara pro gram adores. 504

K
K e rn e l, m o d o , 120 K e rn ig h a n , B ria n . 139 k e y (cla ve), a r g u m e n to d e fu n c io n e s d e b aso d e d a

L, o p c i n . 421 la n z a m ie n to d e p ro g ra m a s e n g d b (G nu d e b u g g u r). 428-429 la te n c ia d e d a to s . 19 lazo d e e s p e ra . 345 la zo s w h ile , p e lig ro s d e , 26 lazo s desenrollar, 19 tipo ag u ard ar acce so, 345 while, peligros de, 26 Id.so, id e n tific a c i n d el n m e r o d e v e rs i n d e l lin k e r, 302-303. 310 Idd, c o m a n d o , 302 LDFLAGS, v a ria b le p re d e f in id a , 47 le e r de archivos. 141-143 de F I f Os. 335-338 de pipes, 324-330 de .sockets de entor no UNIX, 390-392 de sockets de Pruto-

irc ce

. i

' :
- ' ib

IC ? I / ' V t . . i V

< ( i m

-l
-i

II '
* '

iir-i:u-*
nr* 1

tr '
i i. -

.1 1- I

* * s***i

lTi'.nl il'

- i- '

TTK/ |.1*.| ,H ' I |


. rir i.^ -r tu n il* > M 'l'i 'V ( i . ..

i*. l"-i *. |iii"...it: I


1 1r -I 1 i

trv -

11'

l i l i u i . 1 1 ,i>* in' l i ft*: ii. 'i M - m . --i * , 1' t t r- -m tu 1 1 ....; .. . t/ Vil .t : " I ..I 1 | l I ! V | l'U -*) 1 M. - '

;t|. i. I n r . i . l i ;i ></ i.. . . i ! ) i' i ' i j:-i. : i{ ls : :;v -l I (II 1-UiM

. ,i }

;;

.1

' ' " ' 'UI.' -i-i ' " * '

"i ** . ti* .ir i - ' ! -

:*'
tlllilllL . .M U l.,1

,i. i i ;;; . r .i | ' " ii... ,

ir. . :fr SMni/ ,1 'M.t | . : .is_.i l n m r i , 'i. rv_\ ' Ji ; i t : l*V n . J 'T
I! r . ' i !'*. lili

I >'

l . ) ali . r - ; i t i- rn 1 '
' .-

: L;.;-'" > i ii I I >1 ti - -1=? ' flll * 1 I IV At-JV i-t


.?* I O l'. j

;>
r.i.'.i -

r C t . | I .

i*[.

>

> y > >


N OM BRE .DESVA RIADLE. v a ria b le d e fin id a p o r u s u a rio , 42 n o m b re s de bibliotecas com p artidas. 310 de funcin, fijar. 432 de hosts. en Domain 1 V ane System CDNS), 402-405 de seales. 94 n o m b re s, c o n v e n c io n e s so b re bibliotecas. 15 funcione3 de ncur ses. 225-226 n o n -se e k a b le , tip o de a rc h iv o , 126, 321 n o r e tu m , a tr ib u to . gee, 23*26 n o ta c i n d e c im a l c o n p u n to d e d i re c c io n e s d e re d , 393 n u e v a s v e n ta n a s , c re a c i n d e, 253257 n u il, se a l. 100 n u m e ro s e c u e n c ia ! de u so de r a n u r a . 343 n m e ro s de linea, establecer, 432 de redos. alm acena miento, 392 de revisin de archi vos. 410 de seal, 94 secuencia! de uso de ran u ra. 343

532

Programacin en Linux

m odo c ru d o ( ra w ), 243 m odo u s u a r io , J20 m odo, p a r m e tr o de la lla m a d a o p e n . 139 modos ennode, 243*244 erado o sin procesar < rr.iv}, 243 de archivo. 134-136 descripcin. 344 kem el y usuario, 120 m d u lo s. 302 m o u sc m a sk , fu n ci n , 253-261 m p r, d e p u ra c i n con, 441-142 m p ro tc c t, lla m a d a , 12:5* 175,179 m retn o p , lla m a d a , 123,180 m sg, fa m ilia d e fu n cio n e s, 358-360, 363-368 m sync, lla m a d a , 123, 175, 179 m u e s tra s , 288-290 m u ltim e d ia , r e c u r sos p a rt p r o g r a m a d o re s. 504. Ver ta m b i n ta r je ta s d e so n id o m ltip le s a rc h iv o s d e c d ig o fu e n te , c o m p ila c i n d e p ro g r a m a s co n . 12*14 m u ltip le x in g , E/S, 169-174 m un, fa m ilia d e lla m a d a s , 123, 175177 M u sical In s tru m e n t

D ig ital In te rfa c e (M IDI), 278 mv, fa m ilia d e fu n c io n e s, 231-232


N

n a v e g a c i n d e b a se s de d a to s B erkeley, 213-215 n c u rs e s , 220-274 d e n e g a c i n d e s e r v i cio . a ta q u e d e, 177 N e tsc a p e , lin k e o de b ib lio te c a s e s t t i cas, 16 N etuinrh P rotfram triing series, (lib ro ) 385 n ew _field y now_forin, lla m a d a s , 271 n e w j t c m , fu n c i n , 265 n e w .m e n u , fu n c i n . 266 n e w m a sk , lla m a d a , 137 n e w te rm , fu n c i n , in ic a li/.a c i n de n c u rs e s , 226-230 n e w w in , llu in u d a, 253-257 nm , c o m a n d o , 300301 No ru le to m a k e tur* g e t (m e n sa je de e r r o r d e ta r g e t). 52 n o -b lo q u e a n te , lla m a d a d e E/S, 170 n o -d u m p , a tr ib u to , 160 n o ech o , fu n c i n , 242244

o
O . f a m il ia d e i n d i c a d o r e s < fla g * ), 139 O , f a m ilia d e o p c i o n e s p a r a f o r m u la r i o s . 2 7 1 -2 7 2 o b je to s c a r g a d o s d i n m i c a m e n t e , 312316 o b je to s

cargados dinm ica m ente. 312-318 IPC. 342


o b t e n c i n d e la c o n d ic i n d e s a lid a d e l p r o c e s o b ij o , 84 o p c io n e s d e lin e a d e com andos

comando install. 449 GNU cc tgee), 14-22 herram ienta m ako de GNU. 37 utilidad U r. 446-148
o p c io n e s

-ans. 14. 17-18 <, 11. 14 -d <nombrc_dirpctono>. 428 -d. 37. 52 de comando ar. 301 de comando build, 480 de comando install, 450 ce comando Idcong. 302-303 de comando Idd, 302 de coman do nm, 300 de funcin ald, 271>72 de GNU cc (gee), 14-

de utilidad tar. 446 deiete. 449 -Dt*oo=bar. 14 -E, 10 -fS e. 37 -f, 414-415 -filag, 19 ^ .2 1 -ggdb. 14, 21 -Help. 30 -i. 37 -I<nombre_directorio>, 14-15 -jN. 37 -k. 3 7 .5 3 -1.414. 421 -L<nombre_direc to n e , 14-15 -leuraes, para compi lacin con ncursea.220 -Ifoo, 14 MM. 15 n. 37-39 -o file, 14 -O. 14. 19-20. 23, 29 -On. 14 pedantic, 14, 17-18

o p e n . lla m a d a , 1 23, 1 3 9 ,1 4 1 o p e n d ir , f u n c i n , 167 o p e n lo g , lla m a d a , 196 o p t im i z a c i n , c d i g o , G N U cc (g e e ), 19-20 o p tim iz a c io n e s d e c d ig o p o r o m i s i n d e h i l o s d e p r o g r a m a , 19 o p t io n , a r g u m e n t o d o l la m a d a o p e n lo g , v a lo r e s , 196 o r d e n d e b y te s, 392 P p n ck o d , a tr ib u to , 23. 2 6 -2 8 p a d r e , p r o c o s o , 84 p a la b r a s r e s e r v a d a s , 2 3 -2 6 , 4 1 4 -4 1 6 p a n ta lla

do curses. 223 trazado de lneas de color en, 251-253


p a q u e te s , c o n m u ta c i n d e . 3 7 8 -3 7 9 p a r m e tr o p ro te o tio n d e la f u n c i n tn m u p , 176 p a r m e tr o s

-q. 42S
-r. 37, 414-416,418421 -s. 37, 40-42 -static, 14-15 traditional, 14 -u, 413. 420 -v, 15 -W. 14. 37-39 -Wall. 14, 17 -error, 15 -Wle. 37 -Wno-def. 29 -W-:gn-compare. 29 -Wunde. 29 -x.12

22
de herram ien ta make de GNU, 37

db, 206 llags, parm etro de la, funcin mmap, 176 modo, parm etro de la funcin open, 139 para configuracin de dispositivos de sonido, 288-293 pid. parm etro de la

>

534

Program acin e n Linux

funcin kill. 88 protection, parmeEro de la funcin mtnap, 176 sig. parm etro de la ftincin kill. 38 tuneout. parm etro de la funcin select, 170 p a re s clav e /v alo r, 204 p a ro s clave/valor. 204 de inicial izacin de pares de colores, 250 P a rk e r , T i m. 137 p a u se , fu n c i n , in te rc e p c i n de *ealos, 105-10*5 p else, fu n c i n , 329, 331 P e re n s , B ru ce , 438 p e rm a n e c e r a la es c u c h a d e c o n e x io n es. so c k e ts, 383387 p e rm iso s d e acc e so , 151-153 p e rro r, fu n c i n , 126128 P erry , G rcg , 139 p e rs o n a liz a c i n d e E le c tric F e n c e. 438-139 PLD <ID d e p ro ceso ), 62-64 p id . p a r m e tr o , 88 p ip e , lla m a d a . 324 p ip e lin e s (s e c u e n c ia s d e p ip es) de in te rfa z , 323 p ip e s con n o m b re , 133. Ver ta m b i n FIFO s

p ip o s c o n n o m b re , e q u iv a le n c ia con a rc h iv o s, 331 p ip e s sin n o m b re , 132-133, 322-323 p ip e s, 132-133, 321331 po li, lla m a d a , 123 p o p e n , fu n c i n , 328, 331 p o p s d e s d e la p ila , re ta rd o y acu m u la c i n , 19 p u n te r o s d o a rc h iv o , p o sic io n a m ie n to , 143-145 POSIX, b lo q u e o s, 185, 3$4 POSIX, IPC , 342, 356 p o st_ fo rm , lla m a d a , 271 p o t.m e n u , lla m a d a , 266 P P ID . Ver D d e p ro c eso p a d re p re p a r a c i n , secci n (RPM ), 456-457 P rim e ro q u e E n tra , P rim e ro q u e Sale. Ver F rF O s p rio rity , a rg u m e n to d el a d m in is tr a d o r d e in g re s o a l s is te m a, 197 p ro c e s o h ijo , 62 p ro c e s o h ijo , o b te n c i n de la c o n d i c i n d e s a lid a del, 84 p ro c e s o p a d re , ID (P P ID ), 62-64 p ro ce so , ID del (PED), 62-64 p ro c e so s

adm inistracin de llam adas de. 122123 atributos. 62-77 cliente. 381 como xombie, 84 creacin. 77-83 oliminacin. 86-89 manipulacin. 77-90 servidor. 381 p ro g n a m e : C o m m a n d n o t founri, m e n sa je d e e rr o r. 53 p ro g ra m a c i n a v a n z a d a en el e n to r n o UNIX, 30-1 p ro g ra m a c i n de C o n tro l d e P ro to colo d e T ra n s m i si n P ro to c o lo de In te r n e t (T C P /IP ), 392-405 p ro g ra m a c i n de Protocolo de Con trol Transm isin/ Protocolo de in ternet (TCP/IP), 392405 de u u je ta s de soni do. 277-294 p ro g ra m a d o re s , r e c u rs o s p a ra , 502512 p ro g ra m a s aadido de formatos grficos a, 313 bastidores, recursos p ara. 509 compilacin de, 7-30, 428-429 corrida en Gnu DeBugeer (gdb), 428429

ndlc

535

creacin de bibliote cas para. 301-304 daem ons. creacin de. 191-200 de base de datos para CD musical, cdigo ftiente para. 46449-5 de base? de dates, re curras p ara. 512 de c o n lr e a . 66 depuracin. 426-435. 438-443 distribucin. 445453. 504.510 extensin de las pres taciones de. 313 gr.p. 51 Ipednted. 193-200 make de GNU. 33-53 recompilacin tras realizar una exten sin. 313 recursos cientficos y m atem ticos para. 512 setgid y seuud. 66-67 p ro lija d o , secci n (RPM ), 456-460 p r o lija r ta r g e t, 40 p ro p ie d a d d e a r c h i vos. 153-154 p ro te c c io n e s d e m a p a s e n m em o ria, m o d ific a c i n de. 179 p ro to c o lo s c o n fia bles, 380-381 p ro to c o lo s d e d a to s basados en paque tes, 380 p ro to c o lo s d e se c u e n c ia d e d a to s, 380

p ro to c o lo s o r i e n ta d o s a c o n e x i n . 379 p ro to c o lo s s in c o n e x i n . 379 p ro to c o lo s de redes. 379-330 Protocolo de T rans m isin/ Protocolo de In te rn et (TCP/IP), 392-405 p rp id s. 43-49 p s e u d o -c a ra c to re s , 231 p se u d o -fu n c io n e s , 225 p u e rto * descripcin. 396 para M usical Instrum ent D igital Interface (MIDI), 273 p u n te r o s cursor y stdacr. 223 de posicin en archi vo. 143-145 p u n to n d u d e te n c i n c o n d ic io n a l. 432 p u n to s d e i n t e r r u p ci n . e s ta b le c i m ie n to c o n G n u D e B u g g e r (gdb), 432-433 p u t, fu n c i n . 208
R

RCS. V er R ev isi n C o n tro l S y stem rc s c le a n . c o m a n d o . 420-421 re sd iff. c o m a n d o . 418-420 rc a d . lla m a d a . 123 rc a d , lla m a d a . 325 re a d d ir, fu n c i n . 168 re c o m p ila c i n d e a p lic a c io n e s d e s p u s do s e r e x te n d id a s. 313 re c u p e ra c i n d e c o m a n d o s p rev io s. 432 re c u p e ra c i n d o ole* m e n to s do sd o b a se s d e d a to s B erkoley, 212-213 re c u rso s para programadores de Linux. 502-512 utilizacin de, proce sos. 72 R ed H a t p a c k a g e M a n a g e r (RPM), 453-

160
re d e s p o r c o n m u ta cin do c irc u ito s , 378 re d e s almacenamiento de direcciones. Protocolo de Con trol de Transm i ti /i / Protocolo de Internet (TCP tlP ), 393 almacenamiento de nmeros de nodo. Protocolo de Con trol de Transmi sin/ Protocolo

r. o p ci n d e ln e a d e c o m a n d o s, 446 ra s tre o d e u n a fu n ci n . 429 ra t n , in te r f a z d e, n c u rs e s , 257-264 R a y m o n d . E ric . 56 res, c o m a n d o . 422423

, I ) ) .g r a...a C.V.J eti dnux

'I

>

de internet (TCP/IP). 392 conexiones, 394 conmutadas por cir cuitos, 378 conmutadas por pa quetes. 377-379 protocolos, 378-379 recursos de progra macin, 504 re d im e n s io n a r a r ch iv o s m a p e a d o s en m e m o ria , 180 refreg h , fu n ci n , n c u rs e s, 223 re g is tro d e b a n d le r s d e se al. 109-111 re g is tro s c o rr ie n te s , elim in a c i n d e sd e b aso s d e d a to s, 215 re g la s e x p lc ita s, m akofiles, 1 8 re g la s im p lc ita s. m a k c files, 48-49 re g la s p a tr n , m ak efiles. 49-50 re g la s, 35.40-52 re p a r a c i n d e p ro b lem a s Itroublenh o o tin u ) bugs. con GN'U cc tgcc), 21-22 problemas de memo ria, 435-443 Ver tambin d ep u rar re p o s ito rio s , 411 re p ro d u c c i n d e so n id o , p ro g r a m a c i n d e . 287-294 re s e a s , d ese m p e o , 29 re u tiliz a c i n d e c digo . 299

R e v isi n C o n tro l S y ste m {RCS), se g u im ie n to d e m o d ific a c io n e s a l c d ig o fu e n te , 409-123 re v is io n e s de archivo?, 410 exhibir diferencias entre archivos de trabajo, 418-420 R itc h ie . D e n n is, 139 rlo g , c o m a n d o , 420421 RM, v a ria b le , 47 rm d ir, fu n c i n . 105 RPM (R ed H a t Packago M a n a g er), 453-460 ru , fa m ilia do m ie m b ro s do la e s tr u c tu r a s d* p a tr n ru s a g e , 73 R u b in i, A le ssa n d ro , 258 ru n , c o m a n d o , 428 ru s a g e , p iitr n d e e s tr u c tu r a , 72-73 r u t a d u ac c e so , p ip e s sin n o m b re y con n o m b re , 322 r u tin a s c h d ir y fehd ir, 163 r u tin a s d e e n tr a d a d e d a to s , n c u rs e s, 242-246 S sa, fa m ilia d e e le m e n to s d e e s tr u c tu r a s d e p a tr n sig a c tio n , 110 s a lid a d e c a d e n a s , n c u rs e s , 234-237

s a lid a m is c e l n e a de d a to s , n c u r s e s , 237-240 s a lid a , r u t i n a s d e , n c u rs e s , 230-240 s a lid a . Ver e n tr a d a /s a lid a s a lir de archivos, 139. 141 de bases de datos, 205-207. 215 de descriptores de archivo, 194 de FIFOs, 335 e Gnu DuBugger, 428 de pipe. 324-325 S a m s T each Y o u m c lf C in 21 Dtiyx, q u in ta e d ic i n (li b ro ), 139 S am s T each Y o u m e lf L in u x in 24 h o u rx (lib ro ), 137 S a v o lu in e n , H a n n u , 279 sb rk , lla m a d a . 123 scanvv, fu n c i n , 245246 SCCS (S o u rc e C o d e C o n tro l S y ste m ), p ro g ra m a p a r a c o n tr o l d e v e rs io n e s d e c d ig o fu e n te , 409 se cc io n e s, a rc h iv o s d e e sp e c ific a c i n , RPM . 456-459 s e c u e n c ia m ie n to , 379 SEEK , c o n s ta n te s , 143 se g m e n to s d e m e m o r ia c o m p a rtid a , 346

ndice

537

se g u im ie n to d e c a m b io s e n el c d ig o fu e n te . R ev isi n C o n tro l S y stem RCS), 409-423 se g u ir el v in cu lo . 134 s e g u rid a d , re c u r s o s p a r a p ro g r a m a d o re s , 504 s e le c c io n a r handlers de seal. 106-114 ventanas. ncurses. 233-239 se lcct. U am ada, 123, 170,345 som , fa m ilia d e fu n cio n e s, 343. 368374 se m fo ro s b in a rio s . 368 sem fo ro s, IP C S ys te m V, 368-374 *emi d p le x . 322 sem i-d u p le x , ta r je ta s d e ftonido descripcin, 294 grabacin de so n id o en. 237 se n te n c ia s case, sw itc h , 24 se a le s b lo q u e a d a s , 94 se a le s c o n fia b le s , 95 se a le s e n tr e g a d a s , 94 se ale* g e n e ra d a s , 94 se a le s n o b lo q u e a d a s , 94 se a le s n o c o n fia b le s descripcin, 95

desenrollar, lazo, 19 s e a le s p e n d ie n te s . 94, 114-116 se a le s , 93-116 duracin de, 238 llam adas a sistem a, 123-124 s e r v id o re s conexin a sockets. 383-388 denegacin de servi cios, 177 llam adas a sistem a, 121 syslog. llam ada, 196 sesiones como g ru pos de procesos, 76-77

creacin de. 193


s e t.f ie ld .b u f f e r , lla m a d o , 271 s e t_ fic ld _ u se rp tr, lla m a d a . 272 * ct_ m o n u _ fo rm a t. lla m a d a . 266 SETA LL, v a lo r del p a r m e tr o , som id d e la fu n c i n sem c tl, 372 sc tg id , p ro g r a m a s , 66-67 se tsid , lla m a d a , 192196 s e ts o c k o p t, fu n c i n . 394-395 s e tu id . p ro g r a m a s , 66-67 SETVAL, v a lo r d e l p a r m e tr o c m d de la fu n c i n se m c tl, 371 sh m . fa m ilia d e fu n c io n e s , 343, 347348

sig , fa m ilia d e lla m a d a s, 109-110,114. 123-124 sig, p a r m e tr o d e la fu n c i n k ill, 88 SIG, so a le s, 97-99 s in c ro n iz a c i n d e b a s e s d o d a to s B erk eley , 215-217 sin ta x is SIdS. palabra re se r vada. 415 ar, comando. 301 attron y attroff. lla m a d a s 251 c, fam ilia de llam a das y funciones. 214-215 casi* ran g w . exten sin de sentencia caso, 23 cloje. funcin. 206 conoxiones a sockets. 383 cursor, llam ada. 213 db opon, funcin, 206 definicin de v aria bles, 42 del, funcin, 210 di. fam ilia de funcio nes, 312-313 establecimiento de puntos de d eten cin, nombres de funciones y nm e ros de lnea, 432* 433 exec, funcin, 80 exit, funcin, 86 fork, llam ada, 78 get, funcin, 212 has_colors. llam ada, 250

Programacin en Linux

identificacin de va riables. 434 it_pair, funcin, 250 mstafl. comando. 450 nvocacin de GNU tgcc), 8 ioctl. llamada. 279 t, funcin, 38 !d, lomiiia de coman dos. 302 roakefiles, reglas, :i.5 tukfilu, comando y funcin. 332-333 tr'3^. fam ilia do fun ciones. 357-358, 363-365 nm. comando. 300 n o m b r e _d e _v a RAS LE, variable
d efinida por u su a rio, 42 PJP0. llam ada, 325 popen y pelse, fu n ciones. 329 P u t. funcin. 208 resciean, com ando.

420 sem , fam ilia de fu n ciones, 368-371 sbrnnt, llam ada, 348 shrnget, mcin, 347 Socket, fundn. 381 3ian_color, funcin, 250 sw itch, sentencias de, 24 -ync. llam ada, 215 sy siem , funcin, 77 v ariab le de expan sin imple, 44, 389 ''ariables expandi

das recursivam ento.43 wencloae, funcin, 261 s n te s is d e fu n c io n a lid a d . 57 rin te tiz a d o r e s d e t a b la d e o n d a s , 278 sis te m a s o p e ra tiv o s , re c u r s o s p a r a d e sa rro llo d e , 504 S N D C T L _D S P _G E T ' CA PS, c o m a n d o , b its in fo rm a d o s p or. 294 s in te tiz o d o re s d e s o n id o . 278 rtockaddr, p a tr n de e s tr u c tu r a , 385 so ck et, fu n c i n , 381383 so ck eta, 381-401 s o ftw a re aadido de formatos grficos a, 313 baso du datos de C D musicales, cdigo fuente para, 464495 bases de datna, re cursos para, 512 bastidores, recursos para, 509 cientfico y m a tem tico, recursos p a ra, 512 compilacin, 7-30, 426-427 corriendo en G nu D eBugger (gdb), 428-429 creacin de bibliote cas para. 300-303 daem ons. creacin

de. 191-200 depuracin, 426-435. 138-443 distribucin. 445453,504. 510 extensin de p resta ciones de, 313 gzip. 51 Ipeated. 198-200 make de GNU. 33-53 para contraseos. 66 recompilarin luego de extender las prestaciones. 313 setgid y aetuid, 6667
s o lic itu d e s

de conexin, acepta cin. 382-387 de operacin de des plazam iento. es pecificando v enta na. 239 so n a m e , 310 SO IJN D JVUXF-R, fa m ilia d e rn a cro s. 280-281 S p e c ia l E d itio n U sin g L in u x (li b ro ) 137 S R C D IR , v a r ia b le rc o u r s iv a d e e je m p lo . 43 .st_blksize, m ie m b ro d e e s tru c tu r a de p a tr n s ta t, 148 s ta c k s (p ila s). 362 s t a r t , a r g u m e n to d e fu n c i n m u n m a p . 177 s ta rc .c o lo r. fu n c i n , 250 s t a t, c o m a n d o . 147151

Indice

539

s ta t, lla m a d a . 123 s ta ru s. p a r m e tr o de fu n c io n e s w a it y w a itp id . 84 s td sc r. p u n te r o a e s tru c tu ra de po tr n WTNDOW, 223 sto p , c o m a n d o . 434 Stev-ens, R ic h a rd . 302.384 s u b v e n ta n a s . c r e a ci n d e , 253-255 SubW in. lla m a d a . 253-255 s u p re s i n de m ap eo s de a rc h iv o s. 177178 s u p r im ir archivos de trabajo, vitar d u ran te su ingreso a directon o RCS, 413 archivo* an tarballs. 449 colas de mensajes. 364 cursores, 215 directorios, 165-167 elementos de bases de datos Berkeley,
210-211

sy stem . fu n c i n . 697 2 ,7 7
T

registros com ent# desde bases de da tos, 215 semforos, 371-374 sw itc h . s e n te n c ia , 24 sync, a tr ib u to . 160 sy n c . lla m a d a , 215 sy n lin k . lla m a d a . * 123 syseo n f. fu n c i n . 71 syslog, se rv ic io p r o v isto p o r el daem on sy slo g d . 196

T. o p ci n d e lin c a de c o m a n d o s . 446 ta b la s d e sm b o lo s. 426 ta b la s d e sm b o lo s, c o m p ila c i n co n apoyo de d e p u ra d or, 426 T a c k v tt. J a c k , 137 ta m a o d e v e n ta n a s , n c u rs e s , 223 T ape A rc h iv a r (ta ri, 446-149 ta r, u tilid a d p a r a d is tr ib u c i n de s o ftw a re . 446-449 ta r b a lls c o m p r im i d a s co n irrip , 448 ta rb a lls . 446-149. Ver ta m b i n a rc h iv o s ta r g e t t a r u e t n o t re m a d e b e c a u s e of e rr o rs , m e n s a je de e rr o r. 53 ta r g e t p r e d e t e r m i n a d o . m a k e file s, 36 ta rg e ta fic tic io s, mak efiles, 40-41 ta r g e ts , e n m ak efiles, 35-36, 40-41, 51-52 ta r je ta s d e so n id o , p ro g ra m a c i n , 277-294. Ver ta m bin m u ltim e d ia TCP/EP i P ro to c o lo de C o n tro l de T ra n sm isi n / P r o tocolo d e I n t e r

n e t), 392-405 te r m in a r ccurses. 228-230 procesos. 86-89 tie m p o d e C P U d e u s u a rio . 69 tiem p o d e C PU d el s iste m a , 69 tiem p o n o rm n ], 69 tim e o u t, p a r m e tr o d e la lla m a d a scle c t, 170 tim es, fu n c i n . 69, 71-72 tim e s ta m p s (m a rc a s do fech a y h o ra ) m o d ifica c i n e n a rc h iv o s, 158-160 to o lk its par: in t e r f a ces g r fic a s d e u s u a rio (G UIs), 504-505 TO PD IR , v a ria b le re c u rs iv a d e e je m plo, 43 tra n sm isi n d e s e a les, 99-102 tra n s m is io n e s b a s a d a s e n b y tes, 379 T ra n te r, Je ff, 287 trazar lineas de color, en pancaUas, 251-253 especificar ventanas para, ncurses, 238 tro u b le s h o o tin g (r e p a ra c i n d e p r o b lem as) bugs, con GNU cc (gee), 21-22 problemas de memo ria, 435-443 Ver cambien d ep u rar tr u n c a d o d e a rc h i-

540

1 ) 1 ) 1 Programacin en Unux

>

>

vos, 145-147 tr n c a te , lla m a d a . 123 ty p e. a rg u m e n to d e la fu n c i n m sgrcv, 363


U

u, o p ci n d e ln e a de co m a n d o s, 448 UID s (ID s d e u s u a rio), 64-66 uiim ic. lla m a d a , 123 u m ask , lla m a d a , 137138. 193-194 u m a sk s. 332. 359 d e s in s ta la r. ta r g e t. m ak e fle s, 51-32 UNIX BSD. 95 UNIX recursos de progra macin. 50<1 sockcts de entorno de. 385-392 u n lin k . lla m a d a . 123 u n p o s t .m e n , fu n ci n , 266 U sen e t, re c u r s o s p a r a p ro g ra m a d o re s , 503 uKtat, lla m a d a , 123 u tilid a d e s gzip. 51 make de GNU, 33 beneficios do, 34 creacin de makefiles, 35*36 creacin de regias, 40-52 avocacin de. 37-40 manejo de errores. 52*53 p ara creacin de bi bliotecas, 299*302

p a ra depuracin Electric Fence. 438-440 G nu DeBugger (gdb). 426-435 mcheck. 442-443 mpr. 441-442 para distribucin de software, 446-449 u tim b u f, p a tr n de e s tr u c tu r a , p a r m e tro d o fu n c i n u tin io 158 u tim o , fu n c i n . 158
V

v , o p c i n d e lin e a de c o m a n d o s , 446 v alo re s do AFMT. fam ilia d macros de formato de audio, 289 de cmd, argum ento do funcin somet. 371-372 de error, funciones de socket.. 381-382 de facility y priority. argum entos de adm inistrador do ingreso al siste m a, 197 de llags y protcction parm etros de funcin mmap, 176 de funciones w ait y w aitpid, 84 de handie, argum en to do la funcin dlclose, 315 do indicador, argu mento de la fun cin dlopen, 314

de option. argum en to de llam ada openlog, 196 de variables, exhibi cin y modifica cin. 432-433 v a lu , a rg u m e n to de fu n ci n p u t d e b a se d e d a to s , in ic ia liz a c i n , 208 v a ria b le s a u to m ti c a s, m a k e fle s, 4547 v a ria b le s d e e x p a n si n sim p le, m nkefleSt 43-45 v a ria b le s d e fin id a s p o r u s u a rio , m ak efile s, 42 v a ria b le s e x p a n d i d a s re c u rsiv a x n e n tc , m a k efle s, 4345 v a ria b le s g lo b ale s. 126 v a ria b le s p re d e f in i d a s en m ak e fles, 47-48 v a ria b le s alcance y contexto. 434-435 de entorno, 45, 303 de makefles. 41-48 fuera de alcance no visibles), 434 globales, 126 identificacin, en gdb. 434 LDFLAGS, predefi nida, m ake de GNU. 47 packed, atributo, 23 v e n ta n a s in d e p e n d ie n te s , c re a c i n

> 1
n d ic e

)
541

>

d e . 253-257 v e n ta n a s , n c u rs e s adm inistracin. 253257 disposicin. 223-22-5 especificacin de l neas de trazado y solicitudes de ope raciones de des plazam iento, 238* 239
v e r c h . a r g u m e n to do m a cro b o x . 238 v e r ific a c i n d e s c r ip t , s e c c i n (R P M ) , 456 v e r ific a c io n e s

v n c u lo s sim b lico s. 134. Ver ta m b i n a rc h iv o s v is u a liz a r conguracin co rrie n te de. mez clador de sonidos, 231-284 diferencias e n tre a r chivos de trabajo. 418-420 p alab ras reservadas de Revisin Con tro l System RCS), 417-418 valorea de variables. 432
v o l m e n e s d e m e z c la d o r d e so n id o s f ija r i n t e r a c t iv a m e n t e , 2 8 5 -2 8 7

w a i t p i d , lla m a d a . 123 w b k g d , lla m a d a , 239241 w b o r d e r , lla m a d a , 238 w e c h o c h a r , fu n c i n , 231 w e n c lo s e , fu n c i n , 261 w g e tc h , fu n c i n . 242 w h a t is , c o m a n d o ,

431
wi n , fu n c i n , 238239 w in s c h . f u n c i n , 2 3 2 W o rld W id c W eb , r e c u r s o s f o r p r o jr a m m o r s , 5 0 2 -5 1 2 w r i t e , lla m a d a , 123,

entrad a y salida de archivos, Rsviuon Control System > RCS). 411-412. 422-423 errores, GNU cc (gee), 17-18
v e r s io n e s

325
X X W in d o w p l a t a f o r m as 86,

fijar. 281
v w s c a n w , f u n c i n , 245 W w a d d c b , f u n c i n , 2 3 1 ,2 4 2 w a i t , f u n c i n , 8 4 -8 6 w a i t , ll a m a d a . 123 w a i t p i d , f u n c i n , 84-

bibliotecas, incompa tibilidad entre versiones, 310 control de. Revisin Control System (RCS). 409-423
v fo r k . lla m a d a . 80

extensiones. 22 recurso de progra macin, 504


Z z , o p c i n d e l n e a d e c o m a n d o s , 1 46-448 / i p , u t il id a d , 4 4 8 z o m b ie . p r o c e s o . 8 4

86

.1

>

>

.)

>

>

>

G r a c ia s p o r c o n f ia r e n n o s o t r o s .

Pearson Educacin

O b r a m o s acercarnos ms a nuestros lectores. Po.- favor, complots y onvle por correo o fax esta tarjeta.

Ttulo 3et Bbro:

A u t o r ----------------------------------------------------------AOQvivrxo fi. -----

SoSecocr^j los i e o a s

Sos o u e io interesara rsciOir informacin

0
Q Q

Afimm^ra&On Maricting C om putaon Textos L n jw s-tB ro s M anagem en:

OtvUgacKin Cie^tirioa econom a Eloctr6nica Negocios Otros

_ -----------. ----Puesto: -------------------------C.P.: --------

Dom cjo. Pax: E-meH:

P learso n E d u c a c i n

Pearson Educacin Cono Sur Av. eq.mienlc de ics Patcxos 1959 ( 12 6 6 ) Capal r^iorz. Tsl (5-1-11] 4309-6 ?0C Fax (S-11)4309*615-9 E-madc nta'3peafsoned.coin.ar Pearson Educatlon S.A. Casa Juana de Amrica Av. 8 d9 Octubre :JC61 11 SCO, Montevideo. Uruguay TflbFax (02)486-1617 Pcareon Educatlon Carlbbonn Monte Mal. suto21-8 Mu02 Rivera Avenuo H a Rgy, Puerto Rico 009:8 Tol. (737) 751 -1830 r * * (787} 751-1677 E-ma: 3wicar1bcart.rvt y

Fearson Educacin de Chile Av Manuel Montt 1452. Providencia Tel. (562) 269 2059 Fax '582) 27-1 S I 58 E-mail: r.fopearSpearsonet.Cl Pearson Educacin d Colombia Carrera G3 22-55 Sania fii de Bogot D.C.. Colombia Tol. (571).105-9300 Fax (571) <505-901 * Pearson Educacin Esparta 120 Nurtez do Balboa. Madrid 28006. Espaa T!. (3491} 590-3432 Fax (3491) 590-34.18 Penraon Educacin Mxico Callo Cuatro No. 25 2do Pino Fracc. Industrial Aleo Blanco 53370. Naucolpan do Juror. Estado do MJoa Mxico Tol. (52) 53670700 Fax. (52) 53870813 Pcaruon Educngno do Brasil Ru Emilio GoaldJ 747. Lapa OSOG5-110 Sdo Paulo SP, Brasil Tdl. (011) 861-0201 Fax (011)861*0634

awiphprSUcaifeo.net
Poarson Educacin ControamCrlcrt y Panam Barrio La Guana. Moravta 75 motma nano. Oal Ponen Ncru col Club La Guana 3an Jos. Costa Rica Tai. (506) 23S 72 76 Pax (500) 280 65 69 S-matl: onvwonrj'asal racsa.coxr

Vous aimerez peut-être aussi