Vous êtes sur la page 1sur 556

KURT WALL

Programación
en Linux
CON E J E M P L O S

FVíirson

Argentina • Solivia * Brü.! • Coiomb.a • Cosía Rica • Chile • Ecuador • Salvador •


España * Guatemala • Honduras • México • Nicaragua • Panamá • Paraguay • Perú 1
Puerto Rico • República. 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
/ datos de catalogaciónbibliográfica Associate Publisher
Dean Miller
519.68 Wall. Kurt
WAL Programación en Linux con ejemplos -1ª ed. -
Buenos Aires. Prenti ceHall. 2000 Executlve Editor
568 p.; 2-1x19 cm i e f f Koch

Traducción de: Jorge Qcria


Acqufsltlons Editor
ISBN: 9S7-9460^9-X G retch en G a n s e r

L Titulo - L Projroraación Development Editor


S e a n Dixon

Managlng Editor
Editora M a n a Fernanda Castillo
Lisa W ílson
A rm ado de in terio r y tapa P érez Villainil & Asociado*
T raducción; .Jorge Gvrin
Producción: M arcela M angareili Proyect Editor
Tooya S im p so r.s

T raducido de: Copy Editor


Lin-.ix Progrumming oy exam plo. by Kur*. Wall, publishml by QUE Kozia Entísley
Copyright 0 2000,
All R ighU Re*erv<rd.
Indoxor
Published by arr.uiguniont wtch the origmal publfoher,
Cberyl la n o e s
PRKNTICE HALL. me. A Pearson Educatlon Compnny.
ISBN. 0-7897-2215-1
Proofroadcr
B enjam ín B crg
Edición en EipaAol publicada por Ponmon Education. S.A.
C o p yright O 2000 Technlcal Editor
ISBN: 987.9460 09.X Cam eron Laifd

Team Coordlnator
Edte libro no puede te r reproducido totul ni parciulm antc e n n in g u n a for
Clnay T eeters
n ía, ox por n in g ú r. medio o procedim iento, jo a reprugráñeo, fotocopia, m i­
cro film ación, mimeogrtiíico o cu alq u ier otro alaterna m ecánico, fotoquinuco,
elvctronico. inform ático, m agnético, «ilectroóptlco, e tc é te ra . C a a lq u ie r re Interior De&lgn
producción i m ol perm iso pravio p o r escrito do la editorial violn derechos Karon Ryggles
reservado*, ed degal y const ituyu u n delito
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.
Copy Writer
R epública A rgaa& na
Eric B o rg ert
Q ueda hecho el depósito q u e dispone la ley 11.723
Im preso en P e n i. P rm tod in P erú. Productlon
Im preso en Q uebeoor P erú , en el me3 de noviembre de 2000 O an H arris
H e a tn e r M o sem an
P m n e ra edición: D iciem bre de 2000
> J J

vlí

El c o n te n id o d e u n v is ta z o

In tro d u c c ió n ............... ........ — .....................................— ................................. 1


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 ............................... 5
1 Compilación áe p ro g r a m a s ..................................................... 7
2 Control del proceso de compilación: el mak e do G N U ...... 33
3 Acerca del proyecto . . . . . . . . . . . . . . . . .......................................... 55
P a r t e II P ro g r a m a c ió n d e s is te m a s ...................................................... 59
4 P ro c e s o s ........................................................... ......... ................ 61
5 S e ñ a le s ...............« ..................................................................... 93
6 Llam adas a S is te m a ................................................................ 1L9
7 A dm inistración básica de archivos en L in u x .................... 131
5 A dm inistración 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 Manipulación de p a n ta lla con neu rae*............................... 219
12 Programación av an zad a con ncuntcs ................................. 2-19
13 La API de sonido: OSS/Fr«*« ............................................... 277
14 Creación y utilización de bibliotecas de program ación ... 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 Semáforos y colua d e m ensajes ............................................ 355
13 Programación de T C P rtP y s o c k e ts ..................................... 377
P a r te V' 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 depuración .............. - ....................................... 425
21 Distribución de s o ftw a re ................. ...................................... 445
22 Proyecto de program ación: 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

Program ación en Linux con ejemplos .................................. 1


Acerca de este lib ro ............................................................ 1
P a ra quién está pensado esto li b r o ................................ I
Programación en entorno L inux con ejemplos
capítulo por c a p itu lo .......................................................... 2
P u rtu I 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 ......................... 5
1 Compilación de p ro g ra m a s..................................................... 7
Utilización del compilador do código de GNU ( g e e ) .... 5
Invocación do g e e .............................................................. 8
E je m p lo ................................................................................ S
Invocación do g e e paso tí p a s o ........................................ 10
Ejemplo ................................................................................ 11
Utilización do m últiplos archivos de código fuente 12
Ejemplo .............................................................................. 12
Opciones y argum entos .................................................... 14
E jem plos............................................................................... 16
Extensiones dul GNU C ........................................................... 22
E jem plos...................................................................................... 24
Utilización de e g e s .................................................................. 28
Mejoras a g e e .................................................................... 29
2 Control del proceso fie compilación: el make de G N U ....... 33
¿Qué uso tiene make? .............................................................. 34
Utilización de make .................................................................. 34
Creación de m a k e f i l e s .................................................. .. 35
Ejemplo .......................................................... ..................... 36
Invocación de m a k e ............................................................ 37
E jem p lo s............................................................................... 3S
Creación do reglas .. ........................................................ _ 40
T argets ficticios................................................................... 40
E jem p lo s............................................................................... - 41
Variables .............................................................................. 41
Ejemplo ................................................................................ 42
E jem plos............................................................................... 44
Ejemplo ................................................................................ 45
Ix

Ejemplo - ...................... .......— ............................................ 46


Ejemplo - .............................................................................. 47
- R eglas im plícitas .— ................... - ....... ............................ 48

R eglas p a tr ó n ....................................................................... 49
Ejemplo .................................... - ........................................ 49
Com entarios ..................................................,............... — • 50
Targets ú tiles para un m a k e f i l e .................................. 50

A dm inistración de e r r o r e s ....................................................... 52
3 Acerca del proyecto ..............-.................................................... 55
El program a de base de d ato s de CD m usicales ............. 56
Componente* y R ubaútem as .................................................. 56
P a r t e II P ro g r a m a c ió n d e s is te m a s ................................................ 59
4 Procesos ............................... ..................................................... 61
Que es un p ro c e so ..................................................................... 62
A tributos de un proceso ....................................................... 62
tdenuíicadores de procesan ......................................... 62
Ejemplo .................—............................................................ 63
Identificaciones reales y efectivas ................................. 64
E jem p lo s............................ .................................................. 65
Program as s e t u i d y s e t g i d ....................................... 66
Información de usuario .......... ............................. ..........- 67
Ejemplo ........... —.............................................................- 67
Información adicional so b re p ro ce so s........................ . 69
Sesiones y grupos de p ro c e s o s ........................ ...............- 76
M anipulación de procesos ....................................................... 77
Creación de procesos .........—...........................................- 77
E je m p lo ......... ...............................................- ................... - 78
E speras en procesos...............—— ............................................—.- .............. S
E je m p lo ................................................................................ 85
Eliminación íkilling) de pro ceso s................................... #6
C uándo m an ip u lar p ro c e se s........................................ ........ - 89

Conceptos sobre señales .................. - ..................................... 94


¿Qué es una señal? ........................................................... 94

id U .
Terminología de las señales ........................................ 94
H istoria de las señ ales ................................................ 9-5
Señales disponibles .......... ........................................... 96
Envió de señales ................................................................... 99
Empleo del comando k i l l .......................................... 99
Ejemplo ........................................................................... 99
Empleo de la función k i l l ......................................... 100
Ejemplo ........................................................................... 101
Intercepción de señales ...................................................... 102
Progamación de u n a alarm a ...................................... 102
E jem p lo s.......................................................................... 103
Utilización de la función c a u s o .............. - ............... 105
Ejemplo ........................................................................... 105
Definición de un h an d ler de ? e ñ a le s ......................... 106
E jem p lo s......................................................................... 107
E jem p lo s..... ................................................................... 111
Detección de señales p e n d ie n te s...................................... 114
Ejemplo ........................................................................... 114
6 L lam adas a s is te m a ............................................................ 119
G eneralidades sobro llam adas a sistem a ...................... 120
Quó os una llamad/i n sistem a 120
Limitación»» de las llam adas n sistem a ................. 121
Quó empleo tiene una llam ada u sistem a 121
Utilización do llam adas a sistem a ..................... 122
Llam adas a sistem a comunes .................................... 122
Adm inistración de señ a le s.. ......... ................ ........... 123
Códigos do reto m o de los llam adas n sistem a ...... 124
E jem plos.......................................................................... 124
Tabla de códigos de erro r retom ados por llam adas
a s i s te m a ........................................................................ 124
Adm inistración de errores ................................ —..... 126
E jem plos......................................................................... 127
7 A dm inistración básica de archivos en L in u x ................. 131
C aracterísticas y conceptos ........—................................... 132
El modo de un archivo ................................................ 134
La urr.ask .................................................................. - ...... 136
Ejemplo ........................................................................... 138
) } ) ) ) ) J I ) ) i I J ) • i

xi

La :nterf3s de adm inistración de a rc h iv o s.......................... 139


A p ertu ra y d e r r e de archivos ........................................ 140
Ejemplo ................................................................................ 141
Lectura y e scritu ra de archivos ...................................... 142
Ejemplo ................................................................................ 143
Posicionam icnto del p u ntero del archivo ..................... 144
E je m p io ........ ....................................................................... 145
Truncado de archivos ...................................... ..... ..... . 146
E je m p lo ................ .................................... ...... ................ .. 147
Obtención de inform ación de archivos ......................... 148
Ejemplo .......... .............................................. ....................... 149
Modificación de la s características de un archivo ...... 151
Ejemplo ................................................................................. 152
8 A dm inistración av an zad a de archivos en Linux ............... 157
Modificación de la fecha y horn de creación y edición
de u n a rc h iv o ............................................................................. . 158
Ejemplo ................................................................................. 159
C aracterísticas del fiiesyat*m y x t2 ..................................... U50
Ejemplo ............................................. ................................... 161
Trabajo con d ir e c to r io s ............................... ... 163
Modificación de diroctonon .......................................... 163
E jem plos................................................................................ 163
Creación y elim inación do d irecto rio s............................ 165
Ejemplos................................................................................. L66
Listado de un directorio ................................................... 167
Ejemplo ..............- ...................................... ......................... 168
Mulciplexing de E / S .................................................................. 169
E je m p lo ................................................................................ 171
Archivos de mapeo e n m em oria - ........................................... 174
Creación de un m ap a de archivo en la m e m o ria ......... 175
Ejemplo ................................................................................. 177
Utilización de irn archivo mapeado ............................... 179
E je m p io ................................................................................. 180
Bloqueo de archivos .................................................................. 182
Bloqueo de La to ta lid a d del archivo ............................... 183
Ejemplo ...................................................... ...................... 184
t J } ) } , ) ) } } ) ) ) ) ) ) ) ) ) ) ) )

xiv

Dispositivos de sonido ....................................................... 27S


P a u ta s p a ra pro g ram ar s o n id o ....................................... 279
Utilización de la API de s o n id o ............................................. 279
E jem p lo s............................................................................... 231
Program ación de a u d io ...................................................... 287
14 Creación y utilización de bibliotecas de p ro g ram ació n ..... 299
H erram ientas p ara bibliotecas .............................................. 300
El comando ntn _......... .................................. ........... .......... 300
Ejemplo ................................................................................. 300
El comando a r .................................................................... 301
El turnando Id d ............ ..................................................... 302
Ejemplo .......................................... - ................................... 302
El comando I d c o n f i g ..................................................... 302
Variables de entorno y archivos de configuración ...... 303
Bibliotecas e stá tic a s.................................................................. 303
Creación de una biblioteca e s t á ti c a ............................... 304
Ejemplo ................................................................................ 304
Empleo de una biblioteca estática ................................. 308
Ejemplo ............................................................................... 308
Bibliotecas com partidas ......................................................... 310
Construcción do u n a biblioteca com parada ............... 311
Ejemplo ................................................................................. 311
Empleo de una biblioteca com partida .......................... 312
Ejemplc................................................................................... 312
Objetos cargados dinám icam ente ......................................... 312
En qué consiste este tipo de objetos .............................. 312
La interfaz elX ..................................................................... 31-1
Empleo d« !a interfaz U l .................................................. 315
Ejemplo ................................................................................ 315
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 ......................................... 319
15 Pipes y FIFO s ...................................... ..................................... 321
• Pipes (conductos) ....................................................... 322
A p ertura y cierre de p ip e s ................................................ 324
Ejemplo ................................................................................ 325
L ectura y escritu ra de pipes ............................................ 325
Ejemplo ................................................................................ 327
U na m anera m ás sim ple ................................................. 329
XV

Ejemplo ............................................ .................................... 330


F iF O s ............................................................... ................... 331
Q ué es un FIFO ................................................................... 332
Ejemplo ................................................................................. 332
C reac.ón de u n F IF O — .................................................. 333
Ejemplo ................................................................................. 334
A pertura y cierre -de F IF O s .............................................. 335
Lectura y e sc ritu ra de FIFO s .................................... ..... 335
Ejemplo ................ ....... ................ ........................................ 3.35
16 M em oria com partida ................................................................ 341
Introducción al IPC S ystem V ................................................ 342
Problemas que p la n te a el IPC System V ............................. 345
Q ué es la m em ona com partida .............................................. 34-5
Creación de un segm ento de m em oria c o m p a rtid a .......... 347
Ejemplo ................................................................................. 347
Adobamiento a u n segm ento de m em oria com partida 34#
E jem p lo s..................................... ....................................... 349
17 Semáforos y colas de m ensajes ..................... ........................ 355
El IPC System V y L i n u x ........................................................ 356
Colas de m e n s a je s...................................................................... 356
C reaaó n y a p e rtu ra do u n a c o la ..................................... 358
Ejemplo ................................................................................. 358
E sen tu ra de un m ensaje • una cola .......................... 359
Ejemplo ................................................................................. 361
Obtención de u n m ensaju presente en una cola
de m ensajes ........................................................................ 363
E je m p lo ................................................................................. 363
Manipulación y elim inación de colas de m ensajes ... 365

Semáforos ............ ...................................................................... 36$


Creación de u n s e m á fo ro .....— ..................................... 368
E je m p lo .................. - ................. .......................................... 370
Control y rem oción de sem áforos ................................... 371
Ejemplo ................................................................................. 372
13 Program ación de T C P /IP y s o c k e ts ....................................... 377
Conceptos y term inología de reden ....................................... 378
La API de Socket B erkeiey ...................................................... 380
I .1' ) I .1 ) I ) I í í J \

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

xvl

Fundam entos de los so c k e ta ................. - ................................ 381


Creación de un socket ....................................................... 381
Conexión a un socket .................i ..................................... 383
Sockets de entorno U N IX ........................................................ 335
Creación do un socket do emborno UNIX ...................... 385
E jem plos............................................................ .................. 386
Lectura y escritu ra de u n socket de entorno UNIX 390
E je m p lo ................................................................................ 390
Programación de T C P /IP ......................................................... 392
Números de red .................................................................. 392
Direcciones de red ............................................................. 393
Ejomplos ............................................................................. .. 395
Lectura y escrituro du uockets T C P /IP ......................... 398
Ejemplo ................................................................................ 398
Emploo de h o stn o m e * .................................................... 401
Ejemplo ................................................................................ 403
P a r te V U tilid a d e s d e p ro g r a m a c ió n e n L in u x ........................ -107
19 Seguim ientos de cambios en el código fuente:
El RCS o Ststom a de Control de Revisiones....................... 409
¿Por que razón u tilizar R C S ? ..................... ......................... 410
Terminología del control de versiones ................................. 410
Utilización del método RCS .............. .................................... 111
Verificación de archivos do RCS que e n tra n y s a l e n ......... 411
Ejemplo ....................................................................................... 412
Realización de caminos a archivos de reposición .............. 413
Ejemplo ...................................................................................... 413
Opciones adicionales de linea de comandos ..................... 414
E jem plos..................................................................................... 414
Palabras reservadas de RCS ........ ........................................ 415
S l d S ...................... ............................................................... 415
$ L o g :m e n s a je S ................................................................ 415
Ejemplo ................................................................................ 415
O tras palabras reservadas de R C S ................................ 416
El comando i d e n t ............................................................. 417
Ejemplo ................................................................................ 417
Empleo de r e s d i f f .......................................................... 418
E jem p lo s.......................................... ................ ................... 418
xvll

O tro s com andos KCS ............................................................... 420


Empico de re S C le a n ........................................................ 420
Ejem plo ................................................................... ............ 421
Empico de r i o g ......................................................... ........ 421
Ejem plo .................................................................... - ......... 421
Empleo de r e s .................................................................... 422
Ejemplo .............................................. - ................... —....... 422
20 U n toolkit de d e p u ra c ió n .............................................. .......... 425
Empleo del g d b .......................................................................... 426
Compilación con apoyo á e d e p u ra d o r............................ 426
Ejem plo ......— ......................................... ........................... 427
Comandos b á sic o s............................................................... 427
Detección y reparación de problem as de memoria ........... 435
Tipos de fallas do tnom ona .............................................. 435
Ejemplo ................................................................................ 436
M emoria D e b u te n » ......................................................... 437
Empleo de mpr y m check .................... ..................... —• 441
Ejemplo .............................................................................. 44i
U sando rucheck.................................................. ............. 442
Ejemplo .......- .................................................................. 442
21 Distribución de s o f tw a r e ...........................................- .......... - 445
Empleo de t a r y g z i p ............................................................ 446
Empleo de t a r .................................................................... 446
Empleo del comando i n s t a 11 .............................................. 449
Invocación a i n s t a l i ....................................................... 450
E jem plos............................................................................... 450
Empleo de R P M ........................................................................ 453
Requerim ientos m ín im o s ........................................ - ..... 453
Creación de un p aquete RPM ......................................... 454
Construcción efectiva d e l paquete RPM ..................... 4¿9
Ejemplo —........... ............. .................................................. 459
22 Proyecto de programación: a ^ a base de datos de CD
de m úsica ................................................................................... 463
E l código, módulo por m ó d u lo ................................................ 464
xvifj

P arte VI Apéndices 497


A Recursos adicionales ...................................... .. 499
Bibliografía com entada .................................. .. 499
Recursos de In tern et ...................................... .. 502
Sitios Web .................................................. .. 502
U senet ........................................................ .. 506
Listas de co rreo .......................................... .. 506
B H erram ientas adicionales de programación .. 509
Bastidores p ara aplicaciones......................... .. 509
B ib lio tecas......................................................... .. 509
C e rtificació n ............................................................................... 509
Compiladora»! y lenguajes ............................................. ..... 510
Distribución de softw are ...................................................... 510
Editores ................... .................................................................... 510
Gráficos ..................................................................................... 511
H e rra m ie n tn s.......... ........ ........................................................ 511
M iscelán e as.............................. ................................................. 511
Softw are científico y m atem ático ........................................... 512
Software do baso de d a t o s ..................................................... 512
índice tem ático ................................................................................ 515
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 sección áe FAQ (Frequently A shed Q uzstionso Preguntas fo r­
m ulad a s cor. frecuencia >de Inform ix y es presidente áe !a sección Linux dei
Grupo de U suarios de Informix. Es tam b ién vicepresidente de! Grupo de
U suarios de Linux de S alí Lake City, U t3h. EE.U U
Le adrada, sin que ia enum eración rep resen te un orden de preferencias, el
café, los gatos, la program ación. Ia cocina, lev an tarse tard e e irse a dorm ir
aún 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 staría 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 bién mo ay u d aro n a ponerlo nom bres a algunos
do los programad de m uestra cuando mi im aginación llegaba a su limite.
Pupá no hizo nada en especial, pero sin su confianza, apoyo y aliento yo no
podría hobor tenido la motivación nocesorio como p ara em prender la t.nrea
de escribir un libro. Mamá, te extraño 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 Benjamín
3on sencillam ente oí mejor herm ano, cuñada, sobrina y sobrino que
cualquiera pudiese ten er Gracias a la p andilla de F.l Paño 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, preguntándom e cómo iba todo Mi
perro Nudgo hizo honor al significado en Yiddish de su nombre haciéndome
com pañía a las 4:00 de la m añana, calen tan d o ini regazo, ayudándom e a
ü p ear e insistiendo en requerir mi atención ju s to cuando no se la podía
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
algún crédito, éste va para Dios.
Mi editor técnico, 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 estúpidos, evitaron que el libro sonase a página de m a­
nual. y en general lograron evitar que el au to r de estas líneas pareciese un
perfecto imbécil. G racias, Camerún.
El equipo de M acnúllan 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
todavía., G retchen, y te agradezco por no e n tra r en pánico cuando nos
retrasáb 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 bién, si alguna vez aparece por Sale Lake City.
Kezia Endsley Llevó a cabo u n excelente trabajo de edición del original y se
XXI

¿as arreglo p ara leer d i ¡r.ente cuando lo que yo había escrito p arecía prosa
bizantina. S ara Bosin, o tra editora, fue g ra tam e n te paciente d u ra n te la
etapa ce edición, 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 guión em e y
un guión 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 sección dedicada a n cu rses, reviso u n a versión prolim inor
de los capítulos 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 capítulo
sobre la AP! de sonido. A preao especialm ente la colaboración dn H annu
Solavainen. el au to r oriífinal de e sta API. por su ayuda.
Las em presas quo realizan negocios con. y p ara, la comunidad Linux ta m ­
bién 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 muchísimo tiem po do descarga y to d av ía m á s frustración. 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
próximo 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 pestañeó, cuando le expliqué que prefería colgar el sistem a
de algún otro que exponer el mío a los caprichos de algunos punteros b ri­
bones. Sirva como testim onio de la increíble estabilidad y robustez de Linux:
el mismo nunca se colgó, aunque me can se de exam inar archivos centrales
de Linux; las teclas wg*. ‘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 envíe un e-rr.aii a kwalI@xmission.com. de modo que pueda rem e­
diar la omisión. 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.
i

Programación 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
periódico o revi3ta sin escuchar o v er algún® mendfin ai "sistema operativo gra­
tuito denominado Linux, similar a UNIX y creado por LinusTorvalds..." Aunque
el resto del mundo parece recién h ab er descubierto Linux, este sistem a operati­
vo ha <:do muy coa^xid-j en Internet desde 1991. cuando Linus hizo pública por
pr-.mera ve* una de las primeras versiones del núdeo (kerntl) de 3U creadón.
Yo descubrí a Linux por primera vez en 1993, m ientras trataba de localizar una
versión de UNIX que pudiera utilizar en casa para aprender lo suficiente sobre
UNIX como para mejorar mis perspectivas laborales. Quedé asombrado de sus
prestación?? 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 Programación para/en interno Linux con tjtm -
píos? 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 técnicamente muy sofisticados y conocedores, qu«- además -m
encontraban familiarizados con UNEX.
A medida que Linux fu? ganando popularidad, .tu comunidad de usuarios ha ido
cambiando notablemente. El número de nuevos usuarioa no familiarizado» con
los desarrollo* de «ofVwar» en un entorno UNIX p«ro que querían program ar on
y para Linux crcdó desm esuradam ente. Por desgracia, ha habido un;« tvidán
falta de información dirigida hacia les programadores principiantes de Linux,
Hay. por supuesto, libres que le enseñan a uno cómo utilizar las herram ientas
individuales y que cubren temas específicos, pero Programación para/un >sntor­
no Linux con ejemplos reúne todo el m aterial relevante a este sistem a operativo
en an único libro.

Para quién está pensado este libro


Este libro da por u n ta d o que el lector sabe cómo utilizar Linux y que sabe cómo
programar en el lenguaje C. Debería estar en condidones de abrirse camino pur
e! ñiesyatem. leer páginas de m anuales, emplear un editor do texto y ejecutar
comandos Le será útil, aunque no sea excluyente, contar con una cooexión 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 posidón en que me encontraba yo en 1993.
Ye habúi 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 piéíora de
herramientas rr.e abrumó, lo mismo que* la terminología y. hasta cierto punto, la
propia filosofía de UNIX: todo es un archivo, unir entre sí multitud de pequeñas he­
rramientas para formar programas más grundes, 1h línea de comandos es oigo apa­
sionante. De modo que. si el lector sabe cómo 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 programación de Li­
nux. cate libro es para usted.
El otro grupo de ¡ectorcs son los usuarios de Linux que desean saber cómo redac­
tar aplicaciones que funcionen sin problemas en el entorno de Linux. Este grupo
ya se ha dado cuenta de cómo escribir y compilar programas y puede de hecho
comprender algo do lo que consta en las páginas do loa manuales, pero no tiene
ninguna idea 3obre io que es un proceso, cómo escribir un handler d* «erial, o in­
clusive de por quó razón hnbna que prcocujiarsc por ello Si el lector encuadr.i
en la descripción formulada en este párrafo, este libro también 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 código do
upiicaciones que se basa cu el kornel y utiliza servicios quo proveo justamente
ktfmel. Otro tema no cubiolto en este libro os la programación en X Window, La
programación de l.n GUI iOraphtc User ¡nterface. o Interfaz Gráfica de Usuario) es
una cuestión compleja y máa allrt del alcance do este libro, que esta dingtdo pnnci*
palmenta al programador principiiuite. La programación en X Window merecí* su
propio libro; hasta un compendio de material introductorio puede fácilmente ab ar­
car ua par de cientos de páginas.

Programación en entorno Linux


con ejemplos, Capítulo por Capítulo
La primera parte del libro introduce al loctur id entorno de programación en Linux
El capituio l, “Compilación de Programas", le ensenará a utilizar el compilador de
C de GNU. ¿ce. El lector podrá explorar sus opciones y características y aprenderá
algunas de las extensiones al lenguaje C que admite gcc. El capitulo 2. 'Control
del prcceso de compilación: el malte de GNU" anolizu ul programa make. que auto­
matiza el proceso de construcción do software. El capitulo final de esta parte del li­
bro. capítulo 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 programación empleará muchas de las técnicas 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 ISBN1ese este ¡D'O) para acceder a. sitio Wea oe Programación
en UT-üx mt ejemsos.

La segunda parte, “Programación de sistemas", dedica cinco capítulos a la progra­


mación ce bajo nivel para Linux. El primer tema son los procesos, porque ¡05 mis­
ma* constituyen la clave para entender cómo funciona cualquier programa que co­
rre baja lin n x E~ el capitulo -4, 'Procesos', el lector aprenderá qué os un pruceso.
cómo crearlo, manipularlo y eliminarlo. y cómo interactúan los procesos con la pro­
piedad de archivc6 y ei acceso a los recursos ñel sistema. El capítulo 5, “Señolea'
cxpjca qué son las sedales. cómo crear sus propios handlere personalizado? de se­
ñales y cómo hacer para peder ignorar señales.
La programación de sistemas a menudo requiere inicractuar con el kemel y reque­
rir ser.-.cos del miamo Las ivtíc/n calh p ro v e n la interfaz entre el código de su
aplicación y d kcrnel. de modo que esto se cu bre on el capítulo 6. “Llamadas a íír-
tema’ Tanto el capitulo 7 “Administración básica de archivos en Linux") como o!
capítulo 8 “Administración avanzada de ard u v w en Lmux") «atin dedicados h la
administración ce archivos con Linux Todo, o casi todo, lo que existe en Linux es
un arduvo. de modo que todos los programas, excepto los más simplea, nccwiUMn
de s^rv.cioa de archivos El primero de dicho» capítulos (el capitulo 7) suministra
tníormacón básica sobre lo« servíaos de archivos, incluyendo la creación. apertura,
¿ e rre y eliminación de archivo#, y la obtención de información aobre archivo*.
El capitulo 8 incursión* <*n tema* avanzados vibre administración de archivos,
tai es cómo 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 capítulo sobro reducción 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 cómo abordarlo»
La terrera parte ¿el libro, ’La* APU (interíneos de programación de aplicacio­
n es’de Linux', io conducirá i traves de algunas de las interfaces clavo de pro­
gramación de aplicaciones A Pls) disponibles en Linux. El pnm er tema a tra ta r
será la API de base de datos, porque la mayoría de las aplicaciones uecesitan al­
macenar dalos de una m anera ordeuada y que porania una recuperación 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 ‘Manipulación de pantalla coi: ncurses") y ei cupúulo 12 ■“Pro­
gramación s van rada de ncurses"' *«* concentran en la administración de p an ta­
llas en modo texto utilizando la API para r.curses. El capítulo 11 analiza los usos
básicos de loa ncarses tniciahzaoon, terminación, entrada y salida El capitulo
12 comenta las prestaciones avanzadas que proveen los ncurses, tales comn el
empleo de colar, administración de ventanas, interacción con rutones y creucion
y utilización de formularios y menús.
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. “Creación y utilización do bi­
bliotecas de programación*, clausura esta sección del libro. Todas las APIs discu­
tidas aquí son implementadas mediante el empleo de bibliotecas, de modo que
saber cóma emplearlas resulta esendaL Además, a medida que escriba más pro­
gramas para Linux, el lector se snconirará redactando el mismo código una y
otra vez; la solución es almacenar ese código en sus propias bibliotecas.
La cuarta parte dei libro cubre varia» m aneras de realizar ¡a comunicación 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, después do los
cuales sigue el capítulo 16 “Memoria compartida*), y ei capitulo 17 (“Semáforos
y colas de mensajes1'). Como Linux es un producto de Internet y cuenta con so­
fisticadas prestaciones para trabajar en red. no lo debería sorprender que el úl­
timo capítulo de esta sección, e! capítulo 18 ("Programación de TCP.TP y soc-
kets") esté consagrado a los fundamentos de la programación para redes
empleando TCP/IP.
La última sección del libro. “Utilidades de programación p.ira Linux", cubre he­
rramientas que el lector encontrará útiles a medida que vaya ganando experien­
cia en programar para Linux El capítulo 19 (“Seguimiento de cambios en códi­
gos fuente: El sistema de control de revisiones") cubre ei control dei códipo
fuente utilizando el venerable Sistem a de Control de Revisiones. Cualquier códi­
go de programación indefectiblemente contendrá errores, de modo que el capitu­
lo 20 <*Un toolkit de depuración”) le enseñará cómo utilizar el depurador de códi­
go fuente gdb y cómo emplear un por do tóolkits de depuración de memoria.
Electric Fenceymor.
Cuando el lector baya finalmente completado alguna vez esa aplicación imbari-
ble que tiene pensada, seguramente la querrá distribuir. El capitulo 21 “D istri­
bución de software*) cubre los métodos principales de distribución de software
t a r y el Administrador de Red H at Packag®, RPM.
El capitulo final del libro, el capitulo 22 ' "Proyecto de programación. u:iu buse de
datos de CDs do música") es un progrumu completo y de aplicación cotidiana, un
administrador de una base de datos de CD de mii&ica. Además do listar «I Código
fuente coaplato do! peoyocto, esto capítulo explico cómo funcionan en conjunto
la* diversas partos componentes del mismo.
Ese proyecto de programación da término al libro, y por onda a »u introducción u
la pmgram/ición pnra Linux. Si le quedan deseos de continuar aprendiendo, el
primero de los dos apéndices, el Apéndice .‘\ ("Rccuraoa adicionales") prove* bi-
bliografíu e información adicional «obro programación para Linux. El Apéndice
B i‘Herramientas adicionales de programación") proveo información sobre mate-
nal adicional lenguajes, herramienta», empresas y programas de certificación.
A esta altura del libro el lector contará con una sólida base do programación pa­
ra Linux. La experiencia, el maestro por ejemplo m ás importante, contribuirá u
nutn r aún mas su versación en la materia.

Lo que viene
El capitulo 1, “Compilación de program as," da comienzo a su viaje a través
de -a programación para Lmux m ostrándole cómo utilizar el com pilador de
C qcc de GNU. Después 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 programación 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
Compilación 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 ién compila FORTRAN icón apoyo de g77). Esto capítulo
m concentra en el com pilador de C porque C es la lengua nativ a de Linux
El capitulo tam bién cubre las diferencias e n tre g c c y egCS vennón 1.1.2. el
conjunto experim ental de program as del com pilador GNU.
E ste capitulo abarca los siguientes tem as:
• Invocación del QCC
• Opciones y argum entos para controlar la conducta del g cc
• Compilación de m últiples archivos fuente
• Utilización de las prestaciones de optim ización <le g cc
• U tilización de las prestaciones de depuración de g c c
• A d m in istra ra n de errores de compilación
• 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
Programación en Unux

Utilización del compilador de código de GNU (g c c )


El g c c le da al program ador un amplio control sobre el proceso de compila-
don. E ste último comprende cuatro etapas: preprocesado, compilación, ensam ­
blaje y vinculación. Uno puede detener el proceso después de cualquiera de di­
chas etapas para exam inar el rendim iento del compilador en la mism a. El g cc
tam bién 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 información de depuración, si se {s d eseara em ­
plear, que se in cru stará en el archivo binario resultante y, como !a m ayoría de
ios compiladores, a c c puede llevar a cabo tam bién optimización de códiico.
El g c c incluye m ás de tre in ta «advertencias individuales y rres niveles de ac-
v o rte n d a tipo “cap tu ra todo'. E l g c c es tam bién un compilador cruzado, de
modo que so pueda d esarro llar el código en una arq u itectu ra de procesador y
correrlo en otra. La compilación 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 física 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 diseñado 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 lar«a de extensiones i C. 1.a m ayoría de
estaa extensiones mejora ol desem peño, contribuye a la ta re a del compilador
tendiente a 1a optimización del código, o hoco m is sencillo el trab ajo del pro-
bram ador. El precio a p a g ar a cambio ea la disminución de la port.abilidad
Mondonarutnott alg u n as de las extensiones máa 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­
ción -c para especificar el nombre del archivo de salido, g cc preprocesara. cum-
pilará, ensam blará y vinculará ilink) e! programa, generando un archivo ejecu­
table, a menudo denominado binario. La sintaxis más simple se ilustra aquí
gcc «'•cbivo.en'rítía.c |-a vcluvo.saUda]
a r c h iv o _ e n tr a < ía .c « i un ardávo de código 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 espedñca, g cc lo denom inará a .O u t como opción predeterm inada.

E je m p lo
Este ejemplo utiliza g c c p ara crea r el program a h o la a p a rtir del código
fuente h o l a . c. Primero, el código luente:
TEMPLO >• \cno--e aol pragr&M on Internet: Hallo.c •/
/*
i.;3ta<Jo 1 . i
Capitulo i : Compilación de programas 9

• h o l a .c - P ro g rá M zinóaica ' ¡ “ o l a , cen dal *


V

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 3Üencio y Luego regresa a la


señal de petición 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 vendría 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 ./f»U
¡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 tífle 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 subdirec-
tono OM Ct.m o ire c to fto inctukJo en a m ta . on lugar ao utüüs/ 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 s«r ; 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 co-
tt^ o co norma) c - o uno w B rdatíaranerw c e se n e|ecu;ar

¿Cómo sabe g e e cómo 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___________


Extensión__________ Tipo de archivo_____________________________________
.C Cócsgo fuente ce lenguaje C

.C, . cc Código rúente c e lenguaje C*—

.i Cócigo fuente ce C creorccesaco

continúo
Programación en Linux

Tabla 1.1. continuación


Extensión Tipo do archivo__________________
.i i Código fuente de Cv+ preorocesaoo
.S, . $ Código fuente de lenguaje ensamblador
.o Código oajeto compilado
.3 . .so Cód'go do biblioteca compilado

In v o c a c ió n d e g C C 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 prcprocesa-
dor, cop, para expandir cualquier m acro que pudiese h ab er e in s e rta r los
contenidos de Ion archivos incluidos m odiánto tf in c lu ú e Luego compiló el
código fuente preprocesado. convirtiéndolo en código objeto. F inalm ente el
linkor. Ld. creó el archivo binario h o la . El proceso completo de vinculación
se ilustra en la figura 1-1.

F ig u ra 1.1. La compilación de un programa consiste de uaridi ¿tapa-

Uro puede recrear estas etapas m anualm ente, avanzando por el proceso de
compilación un paso por vez. P a ra indicarle a g e e que d etenga la compila­
ción iueiíü del preprocesado, utilice iu opción -E de g ee, como se indica a
continuación:
S gee -5 3rc-ivo_3':tr3í3a.c o arsnavo_salioa.cpp
I

Caoítu i : Compilación de programas 11

El paso siguiente consiste en com pila- si archivo preprocesado p ara conver­


tirlo en código objeto, utilizando ia opción -c de g c c . La opción • x se utiliza
p ara indicarle a g c c que comience ia compilación 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 llevaría a cabo la e ta p a de vinculación sería algo así como la si­
guiente:
í ®tc «reíH*©_«*tratf*.e o ar:ni»o_jaI:fla

) ai program a h o la del ejemplo anterior, avance paso a paso a tra -


¿M¿ vé» del proceso de compilación 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 código fuente, ju n to a otros símbolo* de preprocesado. El listado siguiente
es un ex tracto de h o l a . epo:
r n t t r - tn t f$*t5c» (FILE • 'o o a j •_ po j ) :

•* :* m m t **»:pcs ts o a t fpos_t
íTalioá * 518 '/w /U »daa«;*«io.n* 3

* i* * rr »oitf C:e*r_*fr ( R t i *_straart| ;

• x t t o i m t ?*cf * _ straan|

i-".: fcrfOT {FÍLt •_stre a a ) ;

ítíe m *ci<: c:ci',err_.cio<k« i^IL* *_ü rs a ir ;


ir.z **of_jn:aek#a cPI!_£ * _ a t r ís ii) ¡
e i:» rr » ir - i'_ .o ;c c « ¡ c i FI lE * _ stre a B l

e«:en*, voia par**" i_coost •_s¡

in t
*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 código objeto:


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

12 Programación en Linux

Se debo utilizar la opción - x p ara indicar!» a g cc que comience la compilación


a cierta altura, en este caso, a p artir del código fuente preprocesado. C uando
se efectúa e¡ liokeo del código 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 compilación en cualquier
etapa, si surgiese la necesidad.
Una situación en la cual uno puede realiza r la compilación 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 compilación paso a paso es cuando un
archivo incluido m ediante tf in c lu d e produce conflictos con el código 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 cuál 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 mayoría de los program a* de C consiste do m últiples archivo* de código
fuonto. do modo que cadfl Archivó fuente debo se r compilado a código objeto
antes del paito final do linkeo. E ste requerim iento se satisface con facilidad
Sólo se requiere proveer a g cc del nombro de cada archivo do código fuenu*
que no deba compilar, g cc se hace cargo del resto del proceso La invocación
de g c c nería 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 lin-


keario 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 ) Supongam os que so desee com pilar n u e v o * h o la , que utiliza código prove
^ pgí m ente de dos módulos, m o s tr a r , c y m e n s a je s .c , y un archivo do encabe-
zado. m sg . h:
/• Nooüre do prograaa un Internet: sh o m t.c
/• n«j*vc_floia.c •/
{J - ------------- o o s t r a r .c -----

r
• n o stra r.c _ Contralaúor 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: • } ;
Capítulo i : Compilación de programas 13

2 '•;rr*: " tí r* rr»Wjs_fcienveíiida};


iacri,-u-_S5n3s:«. «r.saj4_2«íC4di.;s| T
í;
>
/• fcnjijg.h

/•
• . E rtjc s iíc c (Je 7*nsa)í.C
••

t€*SV.E_H_
M ifise «éssyt_-_

« 1 3 UOfi»i*_««r*a j * {c* ar

/* •/
• • ------------------------------------------- ------------------------------------------w m jB .c

• ?«"ta;*.c - fyftctefl 5«?m:3a »r. o*r»j¡*.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 siguióme:


3 ..’i^tve_noIa

’Aíics. 3 rc-5."sU20<¡r i
gee recorre las m ism as etap a s de preprocesado-com pilación-linkeo que a n ­
tes. ¿sta vez creando archivos objeto p a ra cada archivo fuente an tes de pro-
Programación 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 compilación: el make de GNU", se verá cómo resolver este proble­
m a La próxima sección 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 línea de comando que acepta gcc ocuparía varía» p a ­
ginas. do modo que lu labia 1.2 p resen ta sólo las m ás comunes
Tabla 1.2. Opciones de linea de comando efe gcc___________________________
Opción______________ Propósito_________________________________________
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! cuantío so compila código objeto). Si no *e especifica el
nombre ele eate archivo, la opción prodetnrminad* o s a . o u t
•C Compltor sm OnkOúf.
D f o o -b a r Defino un macro de proprocoindor f oo con jn valor b a r en la
linnd J'» Comando».
ír u t a _ d ir 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
-ir u t a id ir Sitúa :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 opción predeterminada. gcc linKea bi­
bliotecas compartidas.
s ta tic Unkea bibliotecas estáticas.
• lfo o LinKea ia biblioteca foo.
•5 incluyo en el archivo binario información estándar ce
depuración.
ggcb incluyo en o! archivo binarlo muchísima Información de a p u ra ­
ción que sólo pueda interpretar el depurador del GNU. gdb.
-O Optimiza el código compilado. Esto es equivalente a especificar
- 01 .

-On Especifica un nvel ae optimización n. 0<*n<*>3.


-a n s í Coloca el compüacur en modo ANS1/IS0 C, no permitiendo ex
tensiones GNU cue generen confiteros con dichos estándares.
-p e o a n tic Muestra tedas '.as advertencias Que reouiere e- ANSi/ISO C es­
tándar.
-p e a a r.c ic - a r r o r s Muestra todos los errores Qi,ie requiere el ANS¡/!SQ C están­
dar.
tra o itio n a l Habilita el apoyo para ia sintaxis de! C ce Kerr.ighan y Sítente
(Sí el ector no comp/ende ¡o que significa esto, no se preocupe
por eiio; oasta con saber que Kernignan y Rltcfve fueron ios ai-
señadores fiel C originan.
W Suprime ccdos los mensajes de avenencia.
-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 Compilación de programas 1S

Tabla 1.2. C<yiVruad.ár ____ __ _____________ _________________


Opción_____________ Propósito__________________________________________
« e rr o r Er- lugar de generar advertencias, gcc convertirá las adverten­
cias «#• errores, deteniendo ia comolíactón,
VW 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 cómo 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 extensión de h o stn tre s caracteres), la acción 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 stán d a r de aalid.t).
ARCHIVOS OE 8 IB U 0 TE C A Y DE INCLUSIÓN
Si m dispono do archivos de biblioteca o de inclusión situados en ubicaciones
no estándar, las opciones - l r u t a _ d i r y - I r u t a _ d i r perantón jv.pod fk-nr
dichas ubicaciones y aseg u rar que se busquen ios respectivos archivos en
esas ubicación*!' 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
inclusión 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 invocación a gcc debería 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 programación, 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
estándar de sistema. Supongamos tam bién que los archivos de encabezado es­
tán 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 iínea de comandos debería sor sim ilar al siguiente:
i 5: : ai_icliaseis».e -!/uiu«no/lecáIrcis_inclusLafl«s L/u:ni¿riij/lc<«i/til3_at-
D i:a t » :s i Ir -.* va
La opción -i le indica al im ker que tom e código objeto desde la biblioteca e s­
pecificada. El ejempio an terio r vincularía l i b n u e v a . a.

CONSEJO
Lr-a :o-i*€»-oón 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-
.«•= tív5 ” .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 «¿rínir i *nointire.aa- función"-

Como opción predeterminada gcc utüiza bibliotecas compartidas, de modo que si


el lector necesitara vincular bibliotecas estáticas, deberá utilizar la opción • s t a •
t i c . Esto significa que sólo se utilizarán bibliotecas estáticas. El siguiente ejem­
pio crea un archivo ejecutable vinculado contra la biblioteca estática ncurnes:
S íce 35lic_c-r*«s.c •lucirse* -s:s:ic
✓ Para =;.-=rc=- = aregranar cen nc.-ses. .er *Uns ¡n:=r~az API 26 .sueno en medo texto',
pág.213.
, ) / • ) . ) ) ) t i f > ■' J }
Programación en Linux

Cuando uno vincula bibliotecas estáticas, el archivo ejecutable que se obtiene


resulta mucho más grande que cuando se utilizar, bibliotecas com partidas.
¿P ara qué utilizar una biblioteca estática, entonces? U na razón habitúa] es
p ara garantizar que los usuarios puedan utilizar el programa: en el caso de
las bibliotecas com paradas, el código que necesita un program a para poder co­
rrer se linkea al mismo dinám icam ente d u ran te su ejecución, en lu g ar de serlo
estáticam ente d u ran te su compilación. 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 fúertem onte en Motif, u n costoso toolkit de program ación
en X. La m ayoría 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 práctica in stala dos versiones de au navegador *en
su sistem a; una que linkea bibliotecas compartida», netscape -dynMotif.
y una que vincula bibliotecas estática», netscape statl/otíf. 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 estática, 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 !ibot«n&a]»s.o
Recuérdele en un parágrafo 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 línea utilizu úl comando a r pura crear una biblioteca estática denom i­
n ada l i b m e n s a j e s . a a p a rtir dol módulo objeto, lib m s g . o. El *j**mpio si­
guiente utiliza esa lúbioteca.

✓ Para jprenüor m fls SCOte el com ando v , v a r ’ B com ando ar*. p 3g- 301 .

2. Ahora el lector dispone de u n a biblioteca para poder se r linkeada. Le de­


berá inform ar a gcc dónde en co n trar el archivo de inclusión, utilizando • I.
dónd<* encontrar la biblioteca, em pleando -L, y el nombre de la biblioteca,
utilizando • i, como se ilu stra aquí:
eiEMPio
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­
tática 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 füe 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 continuación:
)

CéOÍtufO 1: Compilación da programas 17

*1 _ ; ■^ 5 V £ ja o Iá _ Iic

r Tifr-U, 5- 5CO '


íM tO s , c ^ o g rs a M c r!
SA LID A
VERIFICACIÓN DE ERRORES Y AVISOS

QCC ofrece to d a u n a gam a de opdone-s de línea de comando p a ra verifica*


c:ón ce errores y generación de avisos. É stas incluyen -ansi, -pedantic,
•oodantic - e r r e r s . y -Vía 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­
tándar. 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 estándar. N ingu­
na de esas opciones, sin em bargo, g a ra n tiz a que u n código 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 opción -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 relación al código que C9tii Siendo com pi­
lado. W all em ite avisos sobre código que la m ayoría de los program adores
consideran objetables y/o que sean sencillos de modificar para e v itar la ge­
neración de la advertencia. Un ejem plo de raain práctica de program ación es
d ecla rar una vuriablw pero no em plearla. O tro es d eclarar una v ariable sin
establecer explícitam 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 práctica de
program ador: En el mismo se d eclara m am como retornando v o ic l, cuándo
de hecho n a in retorna i n t , y u tiliza la extensión 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<S»nt.c '/
i-
• - CoaprU'- sucesivaM At* u t i l i r i r c a p r u í r o
• - « s i . Ivego p*<antic y f íM la t o t » -j«< nntie-*'Tors
■/

ro ía « in (v o ifl)
t
Icrg i233 iitt 1 - 01;
Svts ("EsTi r.o 5£ un arog.-aaa que CL¿noia con Lai re g ias de C ') ¡

)
Programación en Linux

— — 1 Primero, tra te de compilarlo utilizando verificación de no conformación.


$ gcc o*Gan».c -c peflant
sed an :.c: In funcUon M in ':
” s«dant.c:6: «am ing . raturn tyjx of ‘ naln1 la no* int*

s a lid a 2. Luego, compile utilizando el especiñcador - 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 diagnóstico requerido» por oí están d ar. No garan tiza que su código re s­
ponda a las norm as de ANSI C. El program a com pilara a posar de ia inco­
rrecta declaración 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 c doca not su p p o r: lo n g '


s a lid a p *can t e : í - warmrvg: ra tu rn typa o f n a in ' la not ín t*

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

-•* 3 4 c a n t .c :3 : A.VSI C ao<s$ not auaport lo.ng lo rg *


s a l i d a ¡}e a a n t .c :8 : .-eturn typ e o f n ain ' i í M t iftt1

E sta vez el program a no se compila, g c c se detiene después de exhibir los


diagnósticos 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 código que cu m ­
pla con las norm as ANSI/ISO. Las mi3ma3 m eram ente lo guian d u ran te la
compilación. R esulta instructivo se ñ a lar el com entario que aparece en ia do­
cum entación de g c c sobre ci uso de - p e d a n t ic :
■■Esta opción no se pretende que sea útil; existe solo p ara satisfacer a p e d a n ­
tes que de no ser asi alegarían 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 prácticas no ANSI, pero no todas; solo
-.quellas p a ra las cuales ANSI C requiere u n diagnóstico."
Caoftulo i : Compilación de programas 19

OPCIONES DE OPTIMIZACIÓN
La optimización del código es una ten tativ a de mejorar el desempeño de un pro­
grama. La desventaja consiste en m ayores tiempos de compilación, mayor om-
pleo de la memoria d u ran te la compilación y. tai vez, mayor tam año de código.
A ctualm ente, g c c tiene tres niveles de optim ización. La opción -o sin a d ita ­
m entos le indica a g c c que reduzca tanco el tam año del código como el tiem ­
po de la ejecución. Es equivalente a -01 Los tipos de optimización realiza­
dos a este nivel dependen del procesador al que se a p u n ta, pero siem pre
incluyen por lo m enos optimización 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
núm 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 ultáneam ente, en lugar de ir reto rn an d o los argum ento» de a uno por ver,,
cuando reto m a cada función 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 ­
bién 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 cntacón de e s ta optimización 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.
Según sea la cantidad de conocimiento a bajo nivel que uno tenga sobre una
fam ilia dada de CPU. podra utilizar la opción • f f Lag para requerir las opti­
mizaciones especificas q u t s* deaea llevar a cabo Tres de esos indicadores
flags merecen consideración, - 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­
máticas de punto flotante que a u m en tan la velocidad, pero violan estándares
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 compilación 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
cuál constituye una función 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 núm ero ñjo de iteraciones, siem p re y cuando dicho número de ite ra ­
ciones pueda ser determ inado d u ran te la compilación. D esenrollar un lazo
significa que cada iteración 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 código, con cada uno de ellos ejecucando las m is­
mas senter.c-.as. La ¿ g u ra 1-2 ilu stra gráficam ente un desenrollo de lazos.
Obsérvese que La üg’jr a sim plem ente m u e s tra el principio general del desen­
rollo de lazos. El método que emplee g c c puede ser drásticam ente diferente.
I / ,1 J- } l i ) J ) / > t ) / > .1
Programación 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 ejecución de u n pro­
gram a porque ev itan la acum ulación 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 ­
maño del archivo ejecutable o e l archivo objeto. Es cuestión de exp erim en tar
para determ in ar si el aum ento de velocidad de ejecución ju stifica el aum ento
del tam año del archivo. Ver las pág in as de información de g c c p a ra obtener
más 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:
prw tf{*d\ii, i l;
1 - 3;
s r l n ; r i vj'.n , i ) ;
1 • »; i - »:
< ,-9.' 1 ií;
prlnrri M\<> , .1 i - 5;
••i; prllUf< , l|¡
} t - 0;
p rl n ir < v j i n , t ) ;
i -» :
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 Oftimtíación o 2 resulta aurlclcn'.c. Aún i>n prof/amnn
OJqucrios. toles como ol do la artmoni u*cclórt ‘ Üjompio' al fiom ionio do esto capitulo,
el <Ktor ;ipr<Jciür¡) pdq-eAtw rrt(iucclOr<5s on ol tnmaiío dol código »■©ooueftos Incremt-^.
tas e r ol dosomc*<to.

E je m p lo
Esta situación utiliza el máximo nivel de optimización, 03, p a ra com pilar los
listados 1.2, 1.3, y 1.4. Comparo ul tam añ o dúl program a optim izado con el
ejemplo tamaño 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 !¿*
s gcc -00 n e . i $ a ] í s . í « s t . - s r . c -o n u d v o jio la
SAUOA
S ia l n u e vo jto la
r** r - * r - » l juirtjraU usuarios 12137 ju l :3 ¿:: 2? num_noia*
La opción -0 0 desactiva coda optimización. A unque la diferencia es peque­
ña, sólo 16 bytes, debería resu ltar sencillo com prender que program as más
grandes producirán mayores ahurros de espacio en disco.
Capitulo i : Compilación de programas 21

OPCIONES DE DEPURACIÓN '

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 información de depuración en su s program as compilados. E sta s op­
ciones facilitan :3s sesiones de depuración.

La opción -g ad m ite tres niveles. 1 .2 o 3. que especifican c u á n ta inform a­


ción de depuración incluir. El niv el predeterm inado es 2 ( -g2), que incluye
gran cantidad de tañ ías de símbolos, núm eros de líneas e información sobre
variables Iccales y externas. La inform ación p ara depuración de nivel -3 in ­
cluye toda !a información del nivel 2 y todas las definiciones de m acros p re ­
sentes. El nivel 1 genera sólo la inform ación suficiente para c rear rastreo s
h a c a a tra s y volcados de püa. No g e n e ra información de depuración para
variables locales ni p ara núm eros d e línea.

Si el lector piensa em plear el depurador GNX'. gdb -cubierto on el capítulo 20,


*L’a toolkit do depuración*i. el empleo de la opción -ggdb crea información
adicional que facilita las tareas de depuración bajo g d b . La opción •ggob
acepta el mismo nivel de especificaciones que -g. y éstas producen los mismos
afectos sobre la salid a del depurador. La utilización do cualquiera de las dos
opciones de habilitación del d epurador increm entará notablem ente, sin em ­
bargo, #1 tam año de su archivo ejecutable.

E je m p lo
Este ejemplo le m uestra cómo com pilar con información de depuración e
ilustra e! im pacto que los símbolos, que controlan la depuración, pueden te ­
ner «n tí! u m a ñ o de un archivo ejecutable U na compilación y linkeo com u­
nes d«l Listado l i produjo u n archivo binurio de -1089 bytos on mi sistem a.
Los tam años obtenidos cuando com pilé el mismo código fuente con las opcio­
nes -g y -ggdb pueden llegar a sorprenderlo:
S ;:c •; *oí*.e •« HoUjj
|T * l« 1 M i»
1 * u r t_ a ill usuario» Ju i 13 21:09 llOlSJ)*
* S jcc -59:2 n c U .c -o iola_ 5fldO
s i s - 1 s o U _ » :5
- r« « - - i * - « t ¡u irtjn ll jsuarios 3S4fló7 Jul 13 21.35 nola_3ga3*

Como se podrá apreciar. la opción -g increm entó el tam año del archivo bina­
rio re su lta n te en un cincuenta por ciento, .m ien tras que la opción -g g d b in ­
fló el mismo archivo casi un novecientos por ciento! A pesar del au m ento de
tam año, se debería proveer a los archivos ejecutables con símbolos e stá n d a r
de depuración creados utilizando -g) p a ra el caso de que alguien encuentre
algún problem a y tra te de d e p u ra r el código en lu g ar suyo.
Programación en Linux

C O N S E JO
Como .-eg:a general, depure peñero, optimice casp as. No nterprete. sin er-.Dargo. oue
‘opi.'miza? üwpuds’ signifique '^o tener en cuenta la eficiencia {Jurante el acceso de
diseño'. La optíniizaciúrt. on oslo contexto, se refiere a las testaciones Que •MroiJuce
el compilador, comentadas en esto sección. Un ¿'jen diseño y algoritmos Ociemos tu;-
non mucho mayor Impacto en CJ dftiOmoeí'O global Cu© o que pueda lograr cualquier •
PO <3c 'otlmiiación lograda por el compilatfOí. £n verdad, si uno so tona el tiempo nece­
sario raro croar un sisoño adecJBdo y utiltta algoiitmos rápidos, puedo no llegar a
.-«eslT.v optimizar, aun cuando probar oslo último nunca viene mal.

Extensiones del GNU C


La implo mentación dot GNU C extiende el ANSI C e stán d ar do dsversan m a ­
neras, Si al lector no lo im porta escribir u n código que ab io o am en te no ros-
ponda 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 póijir.aa de infor­
mación de «ce wri u»pecinlt 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 sección son Ihw que se ven
frecuentem ente on lo» encabezados del lcernol y el código fuente de Linux.

P R E C A U C IO N
£i aroaoma ccn «ti cóo>go lio csiímda* os doblo, En cxvner lug»', si uno esta utilica-v» ex-
• in-aiooas GNU. 3u código solo compilará odeojad#monto, ni oí, quo directame-te compi
H gcc, 3 otro probleno «s qy* loa códigos no estándar r.o adhieren a Us no/ma*
ANSl/iSO. Muertos usuarios utilizan on su» compiladores a menor conload posible <Jo es-
pocifcadorea <ie compilación, do meco qun loa códigos fuente cue no conforman a os os-
Mnoaros ANSI/ISO ro ampliaran La político más Inteligente, si uno desea Inouir car«te-
naticat* no ©star-dar on al cósico de su programa, es encerrarlas ontre directivas ffiíaeí
para permirr su compilación condicional. £n ei grupo de noticias Como.iang.c o pondrían
poco menos que en ra nata negra por utilizar código 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 ij parto oe! borrador del nuevo estónaar 150 para C- Esto último
os todavía un corraccr. sin srreargo, i- cu*; ttrJi pocos compiladores aceren wc aiora.

S n la plataform a x86, e sta definición da cuino resultado u n a ubicación de 6-1


bits 6ü mem oria denom inada l c n g _ i n t _ v a r . O tra extensión g cc que se e n ­
co n trará en los archivos de encabezado de Linux es el empleo ce funciones
inlíne. Siem pre que sea lo suficientem ente corta, una función inline se ex­
pande en el código compilado cas: de la m ism a forma en que io hace u n nía-
ero. elim inando así el costo de una lla m a d a a 'ana función. Las funciones in-
Une son m ejores que los raseros, sin em bargo, porque ei compilador verifica
su tipo d u ran te la compilación. P ara u tiliza r funciones inline. la s tiene
Cac a lo i : Compilación de orogramas 23

que com pilar con. por ¡o menos, u n a optim ización -0 y preceder la definición
de la función con la palabra reserv ad a i n l i n e . como se ¿lustra aquí:
UillT'* i-.t VKr&nnza 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 información


sobre su código y ayuda ol optim izador de código a roaliznr su tarea. P aro
utilizar un a trib u to do función. 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 par¿nte«?tB de cierre de la d ecla ra­
ción de la función en que se lo emplee
Por ejemplo, las funciones e stán 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 código 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 bién iuncio-
nws 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 función.
Asi, supongam os que *e tiene una función denom inada t e r m i n a r _ S l_ e -
r r o r . que nunca reto m a Su declaración ten d ría el siguiente aspecto:
roid t*r*ií%a.*_»i_*<Tor/.ciii _ i t t r l3-j?*__ ||aor«turn))¡
N orm alm ente se la definiría así:
iota t«r-»ira.*.SI_«rrorlvoií|
i
! ' «1 codujo t i aquí •/

)■

Tam bién 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 ubicación en m em oria de u n a va­
riable sobre u n lím 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 ría con propósitos de alineación.
U na extensión 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 siguiente-
YAíjW . . . v a l»
f ) J- ) ) ) ) > 1 f /■ } } * ’
Program ación en Linux

Obsérvese que se requiere de a i menos u n espacio antes y después 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 código:
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_ « iíte ra > (

case i:

císs 2 :

r «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 notación abre viuda pera
la sin tax is tradicional do la sentencia s w i t c h , pero es realm ente conve­
niente

Ejemplos
l Este ejemplo ilu stra «•! empleo do la palabra reservada m l i n e . El progra­
( IIM P I.0
m a ite ra por un lazo 10 voces, increm entando una variable con cada
iteración.
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 increneíirari Lnt *3)
C
Capítulo 1: Compilación de programas 25

C a í* * :
í

irr «jrr(void|

iflt i • » ;
■ h iie f i < i«) {
I T C T fe e flta 't ;
p riíitfC 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 año dol código, poro el ejemplo s ir­
ve par» ilu stra r cómo 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 iín cómo u tiliz a r rnngos para c a s e .
/* V3«e.** 3*1 cojraiM •« nor«t.c •/
r

• r»o_*ttorrto.c - EncUc -3*1 a tr is u to iv»r«turn


•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 9 ... 5:
p r i a r r i * t * * j\n * . l ) ;
Programación en Linux

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

i
r « u r n 0;
i
»oid t9nn.nar_Bl»ra(void>

<
putsi , :«r»manoo añora’ );
M itin j

Tenga cuidado, cuando radacto an código 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
propós:tos actuales, sin embargo, el ejemplo ilu stra perfectam ente cómo fu n ­
g ona i\ «*xT<«ru»i0n 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 extensión para la especificación del rango de case se comporta d t lu mism a


m anera en que lo h aría 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 es-
tn icru ra . El program a m eram ente im prim e el tam año 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
Capítulo 1 Compilación de programas 27

•«■«eludí <s:dío r»>

* ¡/.i» «st*uetvr« • r w s í í í M » ' •


S tn jc t CCVPiC'O k {
SAor* ¡> T i»»r_ irrts lo I3 ¡ :
loog 1;
c f ir t#svoco_«rc*slo[5J;
¡ _I t t r i t u t í __ |(P4C«rtM ;

/• 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 i«5 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 •/


*pf«ltft*t3éuT “ei t lu A o t i a u r s*$uM c,*rr«$:a{5| - W & ytW \iT,
s iio o f(c ía r) • S );
f p r i r t f ( jxuact, * *1 ta*ar.o ss ion? - se aytesi-i', si;esr(ls<\g)>¡
fp n fttf(K O O -jí, • t i ! W V « o« anort Sf uw r_i.'r* g i3 [3 ] • Vj oyt«*\r*.
í i i M f f s w r : ) • 3 ):

• rasaros ccficarativcs 2a i « 2os «itr-jc turas •!


fpriíir? * *1 taaaftc aa La estructura conpacTSfla - há aytas'.n',
s :i« ¡* oar<a-“ ) ;
•prior*(stoaut * í . rssa.ic := la astruiiT-ra sin cwoactar * :iü Dytes^n",
j n « f j'MCte<5|;

rerum a,
i
Programación en Linux

Para utilizar cualquiera de las extensiones de G NU al lenguaje C no se re­


quiere ningún comando especial de compilación. 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_arrííIal5j * 5 Cytes
el ta«,io do torg * •» fcyles
<1 tw iAo ie sftoct orifleí-.afsglaia! - 6 sytes
9i t3Mfto de la estructura cor.uactstía = 15 Dyt9$
<1 tanaón U estructura sifl jenpactar * 20 bytes
Los dos elementos fueron definidos con m iem bros idénticos. 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 3Ólo 0 bytes,
mientras quo el tamaúo di* la estru ctu ra com pactada, P es sim plem ente la
sumo de los tamaño:! de sus miembros. Aunque unos sim ples 5 bytes de m e­
moria ahorrada en este caso puede no parecer dem asiado, im agínese 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 arrojaría casi 5 megabytes di* ahorro de m em oris
RAM. 1.a memoria ahorrada no nuría poca en este cuso, evidentem ente

NOTA
Los Uytot do 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 * .
o«ctiw 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 jiríd c s «non múHipion 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.

Utilización 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 Colección de Compiladores GNU. La
cuestión clave de esta cia.se de historia es su g e n r que, en algún 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 también «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­
formación 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: Compilación 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 ­
t ocrcg.- 3. - s -jarónomo. 3 S ig u ió t e ; 5-r- 9-,w . de acuerdo con la i r fc r r & o ó r Obte-
mSie r i e s-’J o a = ó e s e g e s . se-^á ;a '.e -^ cr- 2.35 de g c 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 ién es de aplicación 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 ­
dría debería 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 ersión 2.7 2.3. El próximo punto cubre algunas
de estas m ejoras.

M e jo ra s a g c c
La m ayoría de las mejora* de e g e s respecto de g c c afecta la operación 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 bién algunos cam bios en la interfaz de linca do comandos,
los cuales se cubren en este punto.
Se añadieron varias advertencias nuevas. -Wundef y -V/no-def generan ad­
vertencias cuando una directiva *i t*de prcprocesador intoRta evaluar un uinn-
uñeador no definido. -W sig n -c o m p are hace que e g e s (y g cc) generen una
advertencia cuando el código 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 implícitamente. Do m anera
análoga, 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 declaración implícita de funcionen.
Se han efectuado tam bién m ejoras a la depuración y a la optimizurión. Por
ejemplo, adem ás de los argum entos numérico».* del wpecificador de optimiza*
aó n , -0, se puede ahora utilizar • Os p ara asignar prioridad a ius optimizacio­
nes de tam año de código sobre las optimizaciones de velocidad. La selección
entre optimiiaciones en tre tam año y velocidad depende en su m ayor p arte de
si necesita un alto desempeño o conservar espacio en disco. En estoa días, en
que tanto el costo de la m em o ra RAM y de los discos rígidos ea relativam ente
económico, resulta tarea rencilla selecdonur velocidad por sobre tamuño. El
tam año de un program a, sin em bargo, debe se r considerado en térm 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 año 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 año en lugar de au m en tar la velocidad
porque ei program a más rápido del mundo .será inútil si no llegase a caber en
el disco o no contase con m em oria RAM suficiente en la computadora.
Ei espeeiñeador - f s t a c k -ch ecK com prueba desbordes de piia en sistem as
que carecen de u n a prestación d e ese tipo. P ara m ejorar la capacidad de de­
puración ¿o h an agregado nuevos indicadores p ara reseñas de desem peñe
Las reseñ as de desem peño le p erm iten al program ador d eterm in ar con re-
30 Programación en Unux

ci3ión la rapidez con que se ejecuta su program a, a cuáles funciones llam a


m ás seguido, qué variables u tiliza cnn m ayor frecuencia e identificar seccio­
nes o variables del código que no sean em pleadas (a menudo denom inadas
código m uerto!. Con e3a información, uno puedo modificar su código fuente a
fin de lograr que s u program a sea m ás eficiente, a g e s tam bién incluye apo*
yo integrado p ara la h erram ienta de verificación de mem oria Checker. A
continuación se lista n algunos indicadores <llagad adiciónale:, 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 núm ero de veces que se
je c u ta una función.
• • f t e s t - c o v e r a g e —Crea archivos de datos p ara la herram ien ta de
análisis de cobertura de código gcov
• - f a r a n c h - o r o b a b i l i t i e s —M ejora la predicción por parto de e g e s
de las ram ificaciones de código.
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 cómo utilizar el compilador de C de
GNU. g c c . y debido a su sim ilitud con g c c , cómo utilizar e g e s. La mayoría
de los program as que uno construya, au n cuando sean programa* de archivo
único, van a necesitar do largos tiem pos de Compilación. E sta flexibilidad
puede se r por o tra parte cansadora y tediosa de tipear, do modo que el próxi­
mo capitulo le m o strará cómo au to m atizar el proceso de construcción de
softw are utilizando o tra gran h erram ien ta de UNDC/Linux, tnake. Con un
entendim iento básico de am bas h erram ien tas, el lector esta rá en condiciones
de continu ar hacia los tem as de program ación de sistem as que le perm itan
com enzar a program ar en Linux con ejemplos.
i ) ) } ) ) ) ) ) , ) ) ) ? ) ) > } ) ) ) / > > > j
2
Control del proceso de
compilación: 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 cons-
inacción y revisión de so ftw are, ma ke au to m a tiz a el tipo de softw are
crea, cómo y cuándo se lo d esa rro lla, perm itiendo al program ador concen­
tra rs e exclusivam ente en la redacción del código fuente. A dem ás perm ite
a h o rra r m uchísim o tipeo, ya que co n tien e decisiones lógicas í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:


• Cómo invocar a stake
• Las opciones de línea do com ando y los argum entos de oiako
• Creación de m akeñles
• Redacción de reglas p ara mako
• U tilización de las variables do n ak e
• A dm inistración de errores ec siake
Todas los program as de este capítulo pueden ser encontrados en el sitio Web
n t t p : //VAVf.ncp.CGiJi. m f o bajo e l núm ero de ISBN 0789722151.
Programación 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 código fuente requieren invocaciones del com pilador que sor. largas y
complejas, make simplifica esto m ediante la invocación de estas difíciles
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 sólo un único módulo, ta l como
un archivo de biblioteca, o personalizar el Upo de desarrollo que ae desee,
según las circunstancias, make resu lta tam bién conveniente p ara otra
gente que podría d esarro llar el program a. En lu g ar de crear docum entación
que explique en penoso d etalle cómo 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 entación, y los dem as
colaboradores ap reciarán la conveniencia de com andos de desarrollo que
sean simples.

✓ Pata aotsn er mayor información acerca do lo distrib ució n d e 50ftw w e, ver •OiatnbuciO'v tío
softw are" pagina 4-í 5 .

Finalm ente, amke acelera el proceso de cdición-compilación-depuración.


M inimiza los tiempos de recompilación porque es lo suficientem ente
inteligente como p ara d eterm in ar qué archivos han cambindo, y por lo tan to
sólo reconstruye los archivos cuyos componentes h an cambiado. El m akefile
tam bién constituye una base do datos de información sobre dependenaus
en tre archivos p a ra los proyectos do un program ador, perm itiéndole verificar
autom áticam ente que todos ios archivos necesarias p ara compilar un pro­
gram a estén disponibles cada vez que uno inicia u n a compilación. A m edida
que el lector vaya ganando experiencia con la program ación en Lmux. a p re ­
ciará e sta característica de make.

Utilización de make
E sta p arte explica cómo utilizar m ake. E n particular, explica cómo crear
m ake£11es, cómo invocar a tnake, cómo d esm en u zar su plétora de opciones,
argum entos y especificadores, y cómo a d m in istrar los inevitables errare-,
que ocurren por el camino.
C3Cr:-:o 2: Control del proceso de compilación: el make de GNU 35

C r e a c ió n d e m a k e flle s
Así que. ¿cómo logra realizar n ak e au s m ágicas proeza3n U tilizando un
mAkefüe que es u n a base do datos en form ato texto que contiene reglas que
le indican a “ 3ke qué construir y cómo 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 má3 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 razón, lo
mayoría 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 : ;a«o*r.s*ncu! [•••!
CSMfiCC

ICOMMO)

1 - t _________________________________________
PR E C A U C IÓ N
E yjTK* c*f»rjK - i comaodo cec« íg’ h córtate' 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'efiáo eor-»ie<?e 'vtrvlealmena' caca taouador en ocfto aspa-
o j í S; uno trata ce «ripear ssoacios en '.gar 3e taOuiadores, ird«e exívoira c! non-
sare *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 rúente con el fin de c rear targ et. Loa com andos son los diversos pasos,
tales como la invocación 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 cómo
logra sab er «aKe cuándo 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
algún 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 más 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 señal de que debe
incorporarse ai mismo algún cambio de código.
) } i ) . i . » ; ) / ) f ) > > > J
Program ación en Linux

E je m p lo
Este m akeále de m u estra perm itirá que la explicación sea m ás concreta. Seria
el m akeñle necesario p a ra desarrollar u n editor de textos ai que. haciendo
E JE M P L O iíaia de im aginación, hemos denominado e d i t o r . Los signos de num eral #)
inician la s líneas de comentarios, tal como se com enta en la página 50. g c c es
el comando que activa ol compilador, rm (ver ta b la 2.3. página 47) es u n a va*
riable predefinida que activa un program a de eliminación de archivos.
*
* wa^efü# da .muestra
#
ed;tcr e d itor.o pantalla.o teclad'J.o
ge: -o i«íJ: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 tílla .o : pantalla.c sanralla.h
gcc -c pantalla.c
•.«ciado.o : toclado.c « c la c o .n
3:c c teclado.c
o rfllija r ;
r*? id iw r *,o
Par:» com pilar e d i t o r . se debería 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, "Compilación de programas",
esta invocación del compilador constniyo un archivo ejecutable denominado
e d i t o r a p artir de los tres módulos 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 después lo mdiciui mn ak e cómo con-
-itrair cada uno de los módulos 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 línea
2, si los archivos do los cuales éste dependiera no existiesen g c c produciría
un tajan te mensajo de erro r y term in aría, m ak e, en cambio, después de
haber determ inado que e d i t o r req u iere esos archivos p ara ser compilado,
prim ero verificaría que existiesen y, si no fuera así, ejecutaría los comandos
necesarios p ara crearlos. Luego re to m a ría a la prim era regla y crearía 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 ciaría tam bién, porque no dispondría 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 pilación: 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 sólo requiere rip e a r make er. el directorio donde se encuen­
tre e; m akeñl?. Por supuesto, iguai que ls m ayoría de los program as de
GNU. ~ a k e acep ta una considerable cantidad de opciones de línea 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 línea se comandos <¡e make.____________________
Opción_________________Propósito____________________________________________________
- i^ i_ a r c h iv o L i r a el rraksf: * denominado naffl_a.-chivc en lugar de uro
■¡e ’os íe nomorc ©stár-dar {GNUmaSeflie. mokefilo o MakefTe).
n zst-'tx los comandos que ejecutaría make 3¡n en realidad fije-
cutartos. útil cara eomorobgr un makefile
I n o = < ir « _ d i r -irtaco ncr-bre^tíir 3 13 '.sta de directoros Corda bu 3 car$ nake
os makefiies incluidos.
5 Ejecución 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.
Hf i l e 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.
r Deshao»i'ta todas tas reglaa integradas en ma*e.
d Imorwre gran cant-dad de información para depuración,
i Normalmente. make so detiene 31 un comando retoma un
código de error distinto de caro. Esta opción deshabita o*te
comportamiento.
•« Seguir «¡ocutindose «un $1 uno de 103 '.argots ro su lograra
construir. Normalmente, si uno tío loa targets no ne ogrera
construir, make tomunarta.
• jn Correr N comondos on paralelo, conde N es un valor entero
pequeño 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 opción • 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 análisis del tipo “¿qué
pasaría si el archivo X cambiase?"
La opción - 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 akeñle, n ecesitaría um plear - 1 a fin de que el proceso de com­
pilación continuara.
La opción -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 continúe a u n si
uno o m ás de los targ ets no se p udiesen construir, la opción -k le perm ite a
ano ver cuále.*- targ ets se construyen sin problem as y cuáles no, perm itién ­
dole concentrar su s esfuerzos de depuración en !oa archivos con problem as.
Si se e sta fren te a una compilación m uy larga, la opción • j N instruye a
raake de que ejecute N comandos sim u ltán eam en te. Aunque esto puede
reducir el tiem po total de com pilación, tam bién puede im poner u n a pesada
carga ¿obre ei sistem a- E sto probablem ente resu lte tolerable er. un sistem a
38 Programación en Linux

autónom o o en u n a estación de trabajo Individual, perú es totalm ente in a­


ceptable en u n sistem a de producción que requiera rápidos 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 akeíüe, que es el makefile
p a ra la m ayoría de los program as dol capítulo 1. El código fuente asociado
tam bién e3ta tom ado del capitulo 1. No se preocupe ai d o com prende algunas
de las características do este m akefile, porque las m ism as se cubren más
adelante en esto capitulo. P ara ver u n a explicación de cada término,
refiérase según el caso a lu tabla 1.2 de lu página 14. a la tabla 2.2 de 1q
página -16 o a la tab la 2.3 de la página 47. Los com entarios van procedidos
en osto m akefile por el digno num eral (#). tal como se comenta en la págino
óO. Los .¡gnoj. S u tilizan p ara expandir variables de usuario y p re­
definidas (vor páginas 42 v •»?. respectivam ente). Los térm inos en letrtu.
mayúsculas corresponden todos :i nom bres de variables, on inglés las pre
definidas y en español las definidas por usuario. El signo * ropresonta asig
nación de valorea a variables de expansión simple (ver página 43). P ara
.PHONY ver “Targeta ficticion", página 40. Finním cnto, el tariret .c.o: o.^ ur.n
regla im plícita, 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 plícitas se com entan er: ls
página 48.
*
* «awofiie
*
LüfLtóS :•
* C i«oie 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

CALAOS :« -a SÍCWFLAÚS}
*0=1.405 :» -02 S(C?PFLAÍ»SJ
? ftO O A A H A 5 * \

ñola \
3«úant \
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
Cácítuic 2: Control del proceso de compilación: el make de GNU 39

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


S(CC) S (O TJC S ) S- o 5?

T.?vc_"3La i¿3: aos?r*r.c I í m í ' M ; » » . »


S(CC) iíC=U>G5> J« -c W -L. -iasr.síjes

a**»a;*í.c
S(CSi íit7-w VK ! -c -o U e w r u j M . a
S (« | ~ci Ii&ot!-»4¡#*.a iito«nai]9i.9

«c_r«tor^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 cómo sim u lar u n a compilación 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>4ié5.i -a lia a e r ía tiS -C
f rzi j Udf«nM]«3.:
•:c -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 actúe como si n o m _ a rc h i •


vo hubiese cambiado, en tan to que -n exhibe los comandos que serían ejecu­
tados. pero sin ejecutarlos. Como se puede a p reciar a p a rtir de la salida pro­
ducida, "a:<£ co nstruiría p nm ero el archivo biblioteca, i i o n e n s a j e s . a.
luego com pilaría - . 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 técnica constituye u n a excelente m an era de comprobar
las regias del makefile.
, , / I t t / ) I t t I I I ) ) t t • *

40 Programación 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 opción • 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 rc stra r.c nen3a;*?s.c -a mievoJióU
cc -g -c n*nsajes.c -o U&TWisajíS.o
ir res lit>nefl$a:t»s.a Ii3nens3jes.0
OOdart.c: I.i functiOR aatn':
a s e a n ? .c :B - ■ B rn in g : rs tu r n typ e o r •irgin* : s r.ot ' í n t '
cc -g no_rstorno.c -o oo_retomo
cc -02 L f l li p í.c -o ln iln s
cc g c c flo a c t a r .c •« conpac ta»-
c< '5 n o it r .v .c -o m u v o jio la - U Ó I. *L . - U M im fe s
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 ­
nóstico 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.

Creación de reglas
E sta sección analiza con muy or d etalle la redacción de reglas p a ra m akeñle.
En particular, com enta los targ e ts ficticios, las variable* de makefilo, las va­
riables de entorno, las variables predefinidas, las regías im plícitas y las re­
glas de patrón.

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 explicación 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.
Capítulo 2: Control del proceso de compilación: el make de GNU 41

50.p r o l i ] a r elim inaría el archivo ejecutable e d i t o r y los archivos objeto


que ie d an origen. Uno podría crear u n carnet ce este tipo ¿i se propusiera
crear un zarball (archivo la r de código fuente, que es ol archivo compactado
creado utilizando el comando tar. o si quisiese com enzar u n a compilación 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 * . uégína
ü6.

5: efectivam ente ex istiera, sin em bargo, un archivo denom inado p r o l i j a r ,


~ ake lo detectaría- Pero, como carecería de dependencias, make supondría
que el mismo se encuentra y a actualizado y no ejecutaría 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 ­
rían. utilice el :arg«?* especial de make . PHONY Todas ¡as dependencias del
objetivo (target) . PHONY sorún 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
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 tnr-
c j c m p io g C t p r o l i j a r no funcionará correctam ente.

.•••4 wwc» x o lija*


.* i a»n» oro ii: ir
• • ^ *»«♦• sroU jaf ; j wO 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
existía 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 continuación;
S M<e x e i i j i -
^ f noij 9*44itt ntnw jíols *>uevc_nola ro_rator-o mime conoactar *.o *.a *-
£1 comando especial .PHONY p r o l i ] a r obligó a make a p a sar por alto la
SAl~ A presencia del archivo denom inado p r o l i j 3 r. E n circunstancias o rd in arias.
lo mejor sería 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 edición 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
Programación en Linux

cuatro tipos de variables: variables d«fcnidas por usuano, variables de entor­


no. variables autom áticas y variables predefinidas. Su empleo es idéntico

VARIABLES DEFINIDAS POR USUARIO

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


t0U83S.0e_VARWat: » valor i . . |

Por convención, las variables de un m akefile se escriben todas en m ayúscu­


las. pero esa no es una condición 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 paréntesis precedido con un
signo S:
5. •i-ÍWOSE_CÍ _VA31A8LEI

WVBRE_0E_VARÍA81E ..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
asignación G eneralm ente las v ariables se definen ai comienzo de un m ake­
file.
La utilización de variables en un m akefile es an tea que nada una convenien­
cia Si e! valor cambia, uno debe efectuur sólo un cambio en lugar de m u­
chos. simplificándose <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­
y
rio. Utiliza e! comando e c h o de lu in terfa z a fin de dem ostrar cómo 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 bién que los comandos presentes en una regla pueden se r cualquier co­
m ando válido de interfaz o utilidad o program a de sistem a, no solam ente in ­
vocaciones de compilador. Resulta necesario u tilizar la opción -s porque ma-
ke 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
Capítu’o 2: Control del proceso de compilación: ei ^ake de GNU 43

EXPANSIÓN RECURSIVA CONTRA EXPANSIÓN 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 reíeronciadas. o sea. si la expansión contuviese
o tra referencia a u n a variable, esta ú ltim a será asim ism o expandida. La ex­
pansión continúa h a sta que no queden má 3 v ariables por expandir, a lo que
se debe el nombre de e sta m odalidad, expansión recursiva Por ejemplo, con­
sideremos las variables D¿fl_SUPEñIG9 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>.ru«n!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 definición de la siguiente variable.
CC • 3CC
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 v«‘z 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 opción fl.
A fortunadam ente, m ake detecta esto e inform a un error:
••• S n -.r u v * CC r*?ar*nc«i 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 expansión recursiva de v a ­


riables

C C - 9CC
C C -S (C O -g

1
KCCÍStCC}

1 "
*CC»S.CC>SCC <3

i
Figura 2.1. lús peligros de las .sr,dcíes d e maka e xp a n d ía s recursúamem 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 definías 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
expansión 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 expansión. Como se ve con claridad,
la variable CC nunca re su lta rá evaluada.
) ) ) ) 1; ) 1, ) . ) , ) ). ) J ) ) ) ) N.) » >
Program ación en Linux

P a ra e v ita r este problem a, n a k e cambien u tiliza variables de expansión sim ­


ple. E n lu g a r de se r expandidas cuando se las referencia, la¿ v ariables ríe ex­
pansión sim ple son exam inadas u n a vez cuando ae las ceñne; toda3 la s refe­
rencias in te rn as a variables son procesadas inm ediatam ente. L a sintaxis de
la definición es ligeram ente diferente:
CC := gcc
CC *- -g
La p rim era definición 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 definición, 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 gráficam ente cómu funcionan Sa3 v ariables de ex­
pansión .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 expansión simple.
Algunos program adores em plean sólo variables de expansión 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|][-------HÍKs Gl
CC . « C Q ® -----------------

F ig u ra 2.2. Lau variable:i de expannión «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 expansión simple, é sta rnaulta totalm ente expandida. Loa asig­
naciones de variables del iadr> izquierdo del signo igual adoptarán los valo­
res que io en cu en tran del lado derecho, y dichos valores no contendrán 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 capítulo l.
CC = 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 ) . j ) , ) ) . ) . ; / i i i > * f f j 1 * t > 1 1

Capítulo 2: Control dei proceso de compilación: 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 ^ c 0 rtlí'-s
S4Ll DA 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 c m : *’ * ^ w‘ * tirQ ít /noe«.'xyr:_#ai:jfao c - , newiad by 'foo . Stop.

rñi El mensaje de error exhibido es un tan to engañoso. 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 debía 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 pretendía, ¡ñ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, basándose 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 ­
trón. Las reglas patró n son instrucciones genéricas, taÍ£3 como u n a regla
que indique cómo com pilar un archivo . c a rb itrario a su correspondiente
46 Programación 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 críptico


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 dótate todo 'o roforido a reglas patrón, v o r "Realas patrón*, pág-ra ¿9.

Tabla 2.2. Variables automáticas__________________________________________


Variable_____________ Descripción___________________________________________
$9 Reorosenta el nombro de un archivo target presente en una re­
gla
S* Represento ra porettn béslca (o ratz) de un nomoro do archivo

S< Representa el nombre de archivo cíe la primero óopondonua do


una rogla

S* So oxeando puro dar lugar a uno lista delimitado por espacio»


do todas las dependencias do una regia

5? 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

S i <>0) 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

S (3F) 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

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 — 3CC
.c.o:
S(ÜC) 5(C?UAGS) c S-.c
inprsids: UT or pi ds . c

SíCC) 51CFLAGS) S< -C 33


íes: 103.s
S¡CC> S iC F U tá ) S< -O S í
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 lícita o p red efin id a. (L as re g la s im p lícitas
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 compilación: el make de GNU 47

vo objeto de extensión . O, utilizando el com ando $(C C ) S(CFLAGS) - c .E i


térm ino S " . c . rep resen ta cualquier archivo del directorio corriente que te n ­
ga la extensión . 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 están 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
Adem«i5 de las variables autom áticas listad as en la ta b la 2.2, oí make de
GNU pre-deftne cierta núm 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 Descripción Valor
________________________________________________________ predeterminado
AR Homtyt de nrcriívo Cel programa ae ar
mantenimiento oe arcJi.vos compactados
AS Nombre ce arcnivo oei ensamt'acor as
CC Nombra de arenivo dei comprador de C cc
CPP Nomore de arenivo del Gowocessdor de C cpp
RM programa para eliminar arcWvos rm •f
ARFLAGS [nc/cadores oera el pregrama de rv
msTtenir*entO -ie innivos compactados
ASFLAGS Especficacoíes de opciones cara el ensarrblM Cí No hay
CFLAG5 Espec»fic8dorBS ce oocores pera el compilador de C No nay
CPP^ l AGS £soecr?cacores ce cocones oara c¡ prepracesador Ge C No nay
l OF-AGS 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 ayoría de los casos su? valores predeterm inados son razonables. Redefína-
!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 3Ístem 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 ti-
ne i.s valores predeterm inados de i as variables predeúm das que provee make.
Programación en Linux

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

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

La salida que genera este m akefiie tía 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 ayoría de los sistem as de Linux, sin em brago, c c cons­
tituyo un vinculo simbólico con g c c (o s g e s ), de modo que la compilación
funcionó correctamente.

Reglas im p líc ita s


Hasta ahora, los makefiles do este capítulo h a n utilizado reglas explícitas,
reglas que redacto el propio program ador, make incluye un extenso conjunto
de rcglaa implícitas. o predefinidas, tam bién. Muchas de ellas son p ara pro­
pósitos especiales y tienen un ompleo lim itado, de modo que esto capítulo
cubre sólo unas pocas de las reglas im plícitas m ás com únm ente u tilizadas
Las reglas implícitas 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 ejecución, sin em bargo, make in tern ará en co n trar y
unüzar regias implícitas que lo p erm itan construir ios targ ets (el lector pue­
de verificar que make busca reglas im plícitas observando la .salido generada
por el depurador cuando se u tiliza la opción -d).

Ejem plo
EMa makolilú de aspecto sum am ente breve que viene a continuación creará
p rp ia s utilizando dos de las reglas im plícitas de make. La p rim era define
eje m p lo /¡fono crear un archivo objeto a p a rtir de un archivo de código fuente de C.
La segunda define cómo 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
i J t l 1

Cacítu'o 2: Control del proceso d « compilación: el make de GNU 49

S Jici
ce -e s r s ic s .c -a c«Di4 s.o
c: prrias.o -c prpidj
n ak e invoca do¿ regias im plícitas 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 regía implícita
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 plícitas. Las reglas patrón 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 vacía. Las dependencias d e u n a regla do este tipo tam bién 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 patrón tam bién re su lta s e r u n a de las reglas patrón 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
El m akeñle que viene a continuación es sim ilar al antenor, excepto que u ti­
liza una regla p atró n p ara crea r u n a regla im plícita personalizada, definida
EJEMPLO por el usuario, p a ra compilar y link-ear código fuente en C, y em plea u n a re ­
gla im plícita predefinida p ara lirJtenr el archivo objeto a fin de crear el ar-
ehivo binario ñnaL
CFUfiS :■* -8 03 -e
CC :» qcz
»
t fttdtfir» la - tc li ja tn r prtf«t«rai.irta
* va : ve
*
Programación 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
t
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
gcc in o ro td j.o o irtprpids

j a u d a La regla patró n definida por e l usuario efectuó varia» cosas:


• Cambió CC a g cc.
• Añadió »*l espeeifieador dt* depuración de g c c ' s. • g, y el cspcciñcador
de optimixución, -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, información in teg ra­
da en ol mismo sobre su depuración.

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 línea donde éste se encuentra. En un ma-
keñle los com éntanos pueden ir colocados en cualquier lado. Se debe otorgar
especial consideración a los comentarios que aparecen en los comandos, por­
que la mayoría de las interfaces tra ta n a ñ como m eraesrácter (generalm ente
como un delim itador de comentarios). Pt>r ln que concierne a make. una linea
que contiene sólo un comentario equivale, p ara toda propósito práctico, a ina
linea en blanco. £ 1 ejemplo an terior ilustró el empleo de comentarios. Tiake ig­
noró totalm ente las cuatro líneas que consistían sólo el delim i:ador de comen­
tarios y las dos líneas que contenían sólo 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 capítulo, en
los m akeñies 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 entación que pudiese existir a sus
S J J J J J J J J J J J J J ) ) ) ) J ) )

Cac'tJ^o 2: Control del proceso tíe compilación: 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 bién típicam ente compila el programa y puede, ade­
m ás. correr una sencüla comprobación 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­
tribución. Como mínimo 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­
trucción. 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 páginas 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 iío m o ro * o r muitcropósito de archivos que en
compate.'* cor a utif cao c’toc.1 de c©mprM.ó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*r«tyos «r, use

E je m p lo
El siguiente makefile ilu stra cómo 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 tíl ya sum am ente trillado programa ñ o la • c.
m n 'i o 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
) j ,) ) ) i .) i ) ) y ) ) > )> f >
52 Program ación 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 líc 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­
trucción, 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 código 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 .

Administración de errores
Si el lector llegase a ten er problema* cuando u tiliza make, lo opción -d le in ­
dica a make que im prim o g ran can tid ad de información adicional p a ra depu­
ración, adem ás do m o strar los comandos que se encuentre ejecutando. La sa ­
lida obtenida m ediante e sta opción puede se r abrum adora porque la
información volcada m o strará qué es lo que hace make in tern am en te y por
qué. La salid a generada por la opción de depuración incluye ln siguiente in ­
formación:
• Q ué archivo» evalúa make p a ra efectuar u n a reconstrucción.
• Qué archivos‘están siendo comparado» y cufilos m n los r<-<ultados do !n
comparación.
• Qué archivo» son loa que verdaderam ente necesitan ser reconstruido*
• Qué reglas im plícitas considera make que va a utilizar.
• Qué reglas im plícitas 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 cómo resolverlos P ara obte­
ner la documentación completa, referirse ul m anual de m ake o, mejor aún. a
tas páginas de información 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 reconstrucción 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 cuestión.
Capítulo 2: Control del proceso de compilación: 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 sólo
aparece cuando se utiliza la opción - 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. página 37). C uando ap a­
rece este e rro r ex¿s:en d iv e rsas soluciones posibles. El prim er paso se­
ria tr a ta r de construir sólo el ta rg et en cuestión y. basándose 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 Dágina 37.
• n<xn_progra¡r:a: Comñiand 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 invocación do maka ¡ncluiu u n a op­
ción que raake no reconoció. N o utilice la opción que ocasionó el conflic­
to o verifique su sintaxis.

Lo que viene
Este capítulo le presentó al lector d comando m ake, explicándole por quó ro-
sulta ü til y cómo 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 do-
«arrollo 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 (capítulo 3. "Acerca
del proyecto'), la P arte II le perm ite com enzar a program ar concretam ente al
enseñarle cómo 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 código fuente completo ríe 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 vínico proyecto muchas do las
técnicas que se aprenden en el libro, do modo que el lector pueda ver cuán­
tos do estos tópico*, 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*í programación de aivel bAsico os


que. aunquo realizan u n trabajo excelento ul mostrarlo *1 lector todo tipo do
técnicas, h erram ien tas y detalles, no m u estra n cómo 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. También refleja el formato del
género, q u e supone, de forma correcta, que uno quiere aprender cómo 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 programación
ofrezca una solución a ese defecto potencial.
• ; / / / / v J
56 Programación en Linux

El programa de base de datos de CD musicales


£1 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 diseño y creación módulo por módulo, a m enudo blo­
que por bloque, p ara ir ganando u n a mejor perspectiva acerca de cómo el
m aterial que va aprendiendo en e ste libro v a encajando enere si.
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 código que no fuese tran sp o rtab le en ta n pocos módulos como
me resultó posible. Además, ol código alojado en bibliotecas, ta l como el de
las ncurses y bibliotecas do base de datos, se en cu en tra rodeado por el código
de la aplicación, de modo que aunque la im plem entación varíe 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
código fuente ubiorto. tal como arg u m en ta E ric Raymond en su excelente
artículo, 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
línea de conuindi»!), c l l e n (fe_cclm. c, adecuado pura .;or empleado en guiones
de interfaz, un cliente intoraotívo do GUI, i n t e r f a z u s u a r io _ c d ir . c.
y tre s módulos 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 módulos
í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 código 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.
Capítulo 3: Acerca del proyecto 57

C iie r .íe _ c d r a . c recorre y sep ara las opciones de lín 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 diseño se h alla cen trad a en que sea
u n a utilidad de línea ce comandos adecuada p a ra su empleo en guiones de
in te rta i. No es interactiva y re to rn a códigos 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 efectúen el trabajo de acceder a la
base de datos y desplazarse por la m ism a.
Además 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 ­
bién 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 ncürses. otorgándole
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 módulos 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 internctúun
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 bá»o 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
módulo .-eparudo, la ¡mpiementaciflr. principal puede cam biar sin necesidad
do modificar el código de la aplicación Eate tipo de m edularidad re su lta CBen-
cuil pora poder escribir pro^ramna que sean fácilmente m antenibles.
El código de adm inistración de p an talln de c d m _ p a n t a ll a . c Uovn a cabo una
función 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 módulo principal de ios decalles de la respectivo biblioteca de ncurses
de adm inistración de pantalla, lo que perm ite modificar la implem cntación do
asta diurna sin afectar a la aplicación. c d n i_ p a n ta lla .c tam bién 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 propósito prim ario, en lugar de ten er que
ocuparse tam bién de redibujar la p a n ta lla o exhibir un cuadro de diálogo.

Lo que viene
Este capitulo le ha sum inistrado a l lector una breve introducción al proyecto
de program ación que en co n trará a i final de libro.
✓ S aáSgo fuerte o crtw tn sara a s a orcyeeto crogramacón. ¡unto con su uwto oxp:catM>. se
pjoOs «nexx^rar en ‘Pryjecío oe yr^arracán : 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 Sección II. "Program ación de sistem as” comienza con u n a n á ­
lisis de los procesos de Linux, seguido por u n capitulo sobre señales y su m a­
nipulación. Poca 3 aplicaciones pueden o btener algún resultado significativo
sin te n e r que adm inistr a r procesos y m an ip u la r señales, de modo que dicho
m aterial constituye una buena b a se sobre la cual construir su s conocim ien­
tos de la program ación en Linux.
4

Parte II

Programación 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 prensión 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 noción de
proceso subyace en la m ayoría de los derechos de acceso a archivos, las se ñ a ­
les y el control de tareas.
S ste capítulo cubro los siguientes tem as:
• Q ué es un proceso
• Inform ación do procesos
• IdantiCcadores de procesos
• Creación do procesos
• Supresión (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 núm ero do ISBN 0789722151

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

J.
Programación en Unux

Qué es un proceso
l'n proceso es u n a instenci¿_de l a ejecución de.uziprogram a y tam bién la
unidad básica de program ación del sistem a operativo. Un proceso se puede
i^ im iia rX u n program a en ejecución 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­
ción 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 bién la unidad bá3tcu do program ación 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 correrán en
la CPU, por cuánto tiompo y con qué características. E l fijador de tiempos
del komul distribuye lo* tiempo- ejocuchui curgü d«.- la CPU, denom ina­
dos cuotas, entro todos Ion procesos, apropiándose 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 presión do que vario!,
procesos 3e e stá n ejecutando sim u ltán eam en te. Cada proceso contiene ta m ­
bién lu .suficiente información sobre sí mismo como pora que el k em el pueda
activarlo y desactivarlo angún sea necesario.

Atributos de un proceso
lo s procesos tien en atributos o características que loa identificar, y definen
su conducta. El k em el tam bién g u a rd a in tern am en te una gran cantidad de
información acerca de cada proceso y contiene una interfaz o grupo de llam a­
das a funciones que le perm ican obtener dicha información. Las secciones si­
guientes an alizan qué es esa información 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 básicos de un proceso ann s u identificador o ID. abreviado PID,
■■ ■ ... ; : ;.o, PPID. F into el P tt) como d PPED
soñ_éñcéros"posihvo8 y disShtoscle cero. U n PID identifica a un proceso de
m anera univoca, y por lo tanto inequívoca. C uando un proceso crea un nue­
vo proceso se dice que ha creado un proceso hijo. Recíprocamente, 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 pT5g£3ó q‘-íé Liene lugar después qu¿ arráp ^a f l
kem el. i n i t pone on runcionam iento el sistem a. comienza los d aem o n sy
ejecuta lúa program as que se ceban correr.
Capítulo Procesos 63

A unque los detalles específicos 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 stán declarad a.- en el" archiv,: de éncaoezado de aísle-
nía < 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 vendría a sor el PID del pa-
d ro doi procedo que Hamo a getOÍCÍ
GPor qué razón necesita un proceso conocer su PID o el PID de su podre? Un
empleo común 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 podría 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
jiL’y Eate breve program a im prim e el PID y < P P I D del mismo:
/ • HOBCre <j»l ¿ r a g r a i j tr J n w r m •; 0<-Dt<Js.C • /
MHO
• 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_-XCC€ÍS

La salida de este program a, en el sistem a del autor, fue:


5 ./iap_proc_i3s
PIO = 15249
) ) > ) ) > ) ) } J ) ] }
Programación en Linux

Por supuesto, los valores exhibidos serán diferentes en su sistem a.

NOTA
< u r»is td . «c ia ra mochas funeiofles que son sarte del estándar 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, PÓSiX^defino solamente
e¡ estárdar inteffar'pero no nlrigunSTiPofsrrer.tación, 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 teoría, r-ace que las aplica-
cicí'es escritas para funcionar en un tipo de sistema sean sencillas oe transportar 3
ctro sistema. Al jtillzar a nterfaz POSIX estándar para obtener su 10. por 0;errpio. e<
crcgrama no tendría 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
Adpmáa rfy ans PlDs y sus PPtD s. cada proceso tiene varios otros a tn b u to s
de identificación, 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 código 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 T ip o F u n c ió n
10 do proceso p id _ t g e tp id ( v o id ) :
10 dopadre dn proceso p id _ t g e tp p id ( v o id ) ;
■Ddo usuario real uí<j_tg g e tu id ( v o id ) ;
10 do usuario afectivo u id _ l g e te u id (v o ld )¡
10 de grupo ro.V g id _ t g e tQ id (v o id );
10 do grupo ofectlvo g id _ t g w t o g id (v o id );

Cada proceso tiene tres IDs de usuario (LTIDs) y tres ID 3 do grupo GÍDs).
Los mismos son empleados principalm ente por razones de seguridad, tales
como asignar permisos de accesos a archivos y lim itar quién puede ejecutar
ciertos program as. El ID de usuario real y el ID de grupo real especifican
quién es el usuario concreto. Són leídos 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 IÍID 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-
Capítulo 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 tópico a ser comen­
tado en la próxima sección.

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 dái proceso
EJEMPLO >('>rcrj j e l en :nter''.eí’: i í s . c */
r
• • ¡ a c 't iii le s UICs y lo s GIOs

fiftClvít <JtCi3.*>
*ir-c:'»í5 <yr.i3*3.n»
#ixiv00 <>tál:0.ft>

ln t M in(vo¿« )

i
'ÍO ae usuario r « t i: v j \ o '. g « tg iá n ) ;
p r io t f {*£0 <14 usuario « fte tiv o : * }\n ‘ .
9« :« u io ());
0< -irtf(*:o Ct grupo r « í l : VJ\n*, g«Q*<3());
p r t r t * P I 0 *1j gruco « fa c íiv c : S c \ n \ go*ogid(|);
« litlfXST .SU CC ES Si;

)
La salida de este program a, en ei sistem a del autor, es la siguiente:
S ./IM nufttttortt
10 ¿ t UMéTiO r t» i : HO
10 Ce ¿luirle *f«?ivo: SW
s a lid * :o 2» gr„s« r e t í: 1 N
ÍO ¿9 q h ííc e f« c :iv o : !M
2. Como so hito notar antes, en circunstancias normales, loa UÍDn 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
EjeMPLO GIDs seguirán coincidiendo, como lo muestra el siguiente ejemplo:
. . f» 15 5U ¿B_:«CtQr
.*J@c Psss»aro:
••••• ^ $ 1C
SALIOA .n_Iaccar .;U -ia a (U lJ4 -i0 1 ) gi*0UC*=lWlU5uarÍ03>
j . / tte f ttif ic a e e r e i
Programación en Unux

10 U usuario real: 503


to es uíuario 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 ación ). 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 avía, 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 función e x s c , cu b ierta e n la secció n "M anipulación 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 í tío 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 ha-
c 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 ayoría 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 leíd o por to d o s los
u su a rio s pero escrito sólo 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/oass»o
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 ría 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 itién 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 reaüdao. 5 rrayona cc ¡es sistemas Unux m oocnos utilizar, contraseñas oe.itds
(sOacc* passworas), PC' 10 Que la contraseña se encuenda altnacenada en / e t c /
snadc-#. cuo puode ser ielaa y e$c.-'tí» sólo por les usuarios root. D campo correspon­
diente a a contraseña 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 ­


ción para el p rop ietario, cóm 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'~ 1Í /usr/ainí0a$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:
y »¿_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 d«i común 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 p«rn 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 !á iñÜnrmadón no se
encuentra disponible, getpwnam o s tííc c la ra d a ¿n <pwd. h>. Su prototipo es.
s trje t p a n e •$et9^"-s*(cor>st cr»ar • 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 róxim 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á jíuardar la in form ación
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
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-
ñ am e:
s jc m p lo * del ; - : í =i í er. : - c i - * r t : gecnsK.c •

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


*/
f .1 r / /• f y ) / / ,t t y / t ) } I J 1 1
&3 Programación en Linux

¿ in d u c e <stdi:-.n>
¿ in c lu a s <s:<Jii0.h>
ü n c lu d c <3y3¿tyc23.ri>
/ t f < [ f w d í y
«inclutís
=:nclu 06 (¿pmi.t&f

in r *aln(v£id)

(
:nar *nor._3cce30.¡
s trjc t 53S5»d •auntecojé?'

/• Obtención d e l nonbro de ceso •/


lf((rv3R.acceso * 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 pcímicgiísoI ;

)• 0Ct«nclon 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)) « n u lL ) {
p«rrorf*{¡« tp w n M i*);
4 *tt(Ex:T_FAlUüfl£);

/• 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_SÜCC8SSJ;

/oor_ronorns
5 « i 0 5 in •'«orno kwa’ l
3«cos: 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
más información)
I

Capítulo 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 ación sobre los procesos, adem ás de sencillam ente los LDs
áe proceso, de usuario y de grupo, talcojB fljiu.u: iÁi^áóiLdeJúS-rtcursiü-«dul
r.stem a y la-? ripmpfts da p j^ n ciár.. S á le s e que he puesto tiempos do ejecu­
ción 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 ediría un cronóm etro1es el tiempo transcurrido.
• El tiem po de CPU de usuario es la can tid ad de tiempo que el procesa-
dóflnvíérte"éJecut5H3o~¿I código 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
ejecución de código de Jtemel.
✓ _3 z'erene>-j «otra -ñoco usuaria y mo<Jo •a—*' se 9*¿»>ca en ‘ Qué es una llamada 3 siste­
ma*. oa* 120.
El lector puede obtener esta información 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 estadísticas do acceso a memoria. E ¿ta sección comenta primero la obtención
de información referida a tiempos, y luvijo cubre la utilización 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 lanío
09 8S0 » m o de SV*U UNIX, y aneóos cuentan cor amoas funtícoe*. POSlX. »i ostirv-
ai cuaJ Unut trata o* contornar, soto especifica tim e s . Sin embargo.
«tary-ytra a !ai y a {r y ? a < iy ti una daaenpaín m ía compteu» úe ’a utilización ríe ro­
tunos por parta o« un oroc<nc7 ir'rtW b» « n E n ».eónca porquo UftuX (n partir do
su .*er»i«n 2.2.10: rrpíementa vüo c>nce de 'o » dieciseis recursos ceíinlúos on la os
uuetua r u t i g e Rnai/nanw a información -toere tiempos que retorna tim es es más
a*t*3*3a qua la ratomaoa per g e tr u s a g e . Oe modo cuo. st e< lector sólo '•■ecesitnse
•rJormaoPn soor* oampos o aseara acnonr st estándar POSlX. üeDcrd utilizar tla a s .
S< no ’- t preocupa mantener re coníormicatí con POSlX o ai "«coürtasa la nformne-ún
atítoon# provista por g e t r u s a g e . uonce«ata Ottlma.

TIEMPOS DE PROCESO y
La ru n c ió n ¿ti‘i e s 'i e encuentra p ro tatip ad a en < 3 y s / í i m e s . h > como so in ­
dica a continuación:
cioc>t_t tiM iís trjc t tas ’auflj
tim e s re to rn a el núm 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 pág in a 71) y que alm acena lo«5 tiempos del proceso en ejecu-
ciSaTf 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. cuestión), y luego llam a a ti m e s p a ra o b ^ n e ria á R -
formación deseada.
f < ) J t ) I

70 Programación 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 sahínas 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 \ clccK _ti; H f'*'

In t MUifvoWl
/
1 * * 6 ° '
i ^ /
cloc*_t c o n u c o , fin a l, tics_lnsutildos;
'H 'i
s tr ic t tasrtic_conl#nzo, t lc .f ln a l;

V JU.
ce*i«m c • tiM s(Juc_co<»ienzoj;
/• £l prccoso o«t*rro lo constituyo on «sto c a í«'g r«p • GioDal Rojular
• c*pr«»sion 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 c»¿o ia oalübra ‘ ol* en un jrcntvo.
• la salida do gr#p jo rudirluu a f in do -'«vitar quo la aantalla ie atlttorre
c» datos /
•I _
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 f i n a l • com onzo

calcular_seoi-''dosCTioi!(>o transcurrido’ . tics_ir,suiuüos);

put3{*Tíonoos 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. t«s_C 3tino);

íxit-:E xrr_S yC C E S S !;
)
»oio :alcular_sequndoa(eftar *caoena; do ck_t *ícs_nsuriaas)
{
r OOtMti* tíos d» roloj/sepunoo '/
long tissjxsr_»eg . sysconf< SC CLX TCKJ; -)
V
M
p rin tfC V s ; w .2 í segundas\n*, escena, (flo s t! tic s insumidos ,
:ics_3or_s35.;
i
Capítulo -5: Procesos 71

E n ax. sistem a, una corrida de p rueba del pro g ram a creó la siguiénte salida:
S u t U .r -c ir jc s '
Tíetofl «■¡Mttorf'MJo: »9.9i H íU ^ J
tisescí 3# p-OCíSO pedr»
usa ds CPU(Kr«icario: a.M s*5u*ao*
ljo se C*J ocf( i s t i a : 3.08 g u r í e s
2* :.-oc»50 lítjo
jío di CPU K - ¿i-jjrip: Z.3* seguraos
■jsc á* ZP'J pori m t u : t t« seguróos

La prim era cuestión a observar es que nn parece h ab er acumulación de


tiempos en e: proceso padre Aunque esto s-e cubro con mucho m ayor detalle
en la sección ‘Creación 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­
ción 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.observación digna de mención 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 operación de ¿ r g p que tyecutó ol procedo hijo, req u irió muchos mfcTrü-
curso» de E/S que de CPU Tuyo que reco rrer 2 331 archivos dC-cncubwado.
m ás de lu mégaEytés texto, en el sistem a e n cuestión. Loa 16 segundos eos-
tantex estuvieron to fo s dedicados a leer el_d¿co rígido. Por supuesto, los
tiem pos s a r á n difcreñ tw T rt OTl S^Sm aHál 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 nú-
qjero 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 núm 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_en£fi5 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» {
clodt_t tt * .u tt* ¡; r Tlenco a* JSC oe cel procoso psore • (u-usar}/
clock_t tes s t i « ; r rieapc 3e uso ce
ls=syst«oT’ /
t= s_c-jtit«; /• *le o » <39 UM a*
(c=dulflfen) *
zlockjc /• Tieoco Ca a$0 de
¡CsefcUsraj.*/
>;
Ins¿*o. estos vs'.ores ¿on ñcs de reloj, no e l núm ero de segundo.-:. Pa ra con-
v ertir ios des de reloj a segundos se d eb erá utilizar Ja función s y s c o rrí, o.ue
convierte su s =r;^uineñtósen vsi& rssque definen lím ites de sistem a u opcio­
Programación en Linux

nes en tiempo ce ejecución. _SC_ClK_7CK (literalm ente, SEGUMPOS_~ICS-


J1E L 0J) é s u n macrp que deilne cuántos 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 cuántos 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 función 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 información de
tiem pos correspondiente a cada porte del proceso.
UTILIZACIÓN 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 bién la huella que produce el pro­
cesó en la'm em oria: cómo está e stru c tu ra d a la m em oria, los r.pos de acceso
de m em oria que efectúa 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 información, y m ucha más todavía, 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 etfcñbezado < 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 tlit«val ru_u*.:ne; r tioopo es usuario eraieaw •/
Itn íC t tinoval ru_s?iB*¡ /* tlenpo flo ustena ««pioado •/
long n »jt8 x rjt; /• na«mo ranaco ostaDloddo para roíidontca
long ru_naxlxrss; l ‘ tannfto de ««n o n a corpartlda •/
long ru_naxjorja; /• tataflo do datos no conpartidoa */
Lon-g -u.MXiarj*; I ' toiraAo do p ila 00 coapartlda V
long r u _ * l n f l t ; f rocíanos do paginai •/
Isng r u j i a j f l ; ; /• fa lla s do pagina »/
long rujmwap; /• pornutaciones •/
long ru_tr.oiock; /• operador,os oe entrada on 0103.10 •/
long •‘u jjyb lo ck ; l m operaciones co u l : o i on oloque •/
long '■u_»»g9«j; nansa jos enviados 'I
ieng r u jijg rc v j y nensajes ríjciDiaou •/
long ni_nsignaii; r iertalus rocioidas •/
.ong ru„nvc*«; r ospaciflc3dore3 voluntarios ce contexto v
long "ujUvcsw; .*• aspocifícadores involuntarios do contexto •/
V;
La estru c tu ra tim eval, a su vez, responde al siguiente modelo:
»tmct tinieval {
ieng tv_soc; /• saconas •/
lortfl tv jis o c ; /• and nlcroseconds •/
>;
L inux, lam entablem ente, scSlo efectúa seguim iento de ios recursos lisu d o s
en la ta b la 4.2.
z z / / / / / / / / ' / ^ / .* •' #' 1 1
Caaííulo 4: Procesos 73

Ta&a 4.2. -g-.-j'gc5 eré s:s:srra s c v e :c$ ave Linux >


-ranv'enc seguimienio
Recurso____________ Descripción_______________________________________
'j _ u í ¿ ~ = T e meo ¡nvertifio ejecutando código Ce mcdC usuario {no-kcrnel!
fu _ $ - i" e * e n ? o invertido ejecutarlo código de kamet (roouerimientos
por z a r e de “ócigc da usuario oor servicios ce¡ sistemo)
n j_ e ¿ n í¡* N-jr-ero de fallas menores {accesos ce memoria que no gene­
ran accesos a c^sco)
r u _ o a J 'l t Número de fallas importantes accesos da memoria q:;e Origi-
rar. accesos a d-sco)
ru^rvsirac .Vjmero de páginas de memoria leídas 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 núm ero de páginas 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 información 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 información n u ev a que getrusage le b rin d a al p ro g ra­
m ador •*: núm ero de fallas de m em oria y de accesos de disco relacionados
con failaa de m em ona. A diferencia d e la función tim e s , g e t r u s a g e debo
ser invocada dos v.-cs* -ti «e qui¿ru ubtenec información 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 *ui«ge|.
u s a g e es un puntero a una estru ctu ra de tipo ru s a g e donde la función vuelca
La información. El parám etro wfio fqu ién ) 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 algún error.
E je m p lo
Este program a es u n a segunda versión del ejemplo anterior, !a cual utiliza
getrusage en lugar de tim es. El térm in o tv_sec que aparece en el listado p e r­
tenece o U e stru c tu ra de patrón 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 Tiéfleos as orccsao y utilización ce recursos
•I
fiocluót «stíio.r»
# iaeluec < sta lia .n >
#icel«a« «Syí/tiBss -v»
Programación 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 * ) ;

y 00t « 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 • /
l f ( ( 0 0 ! r u s a ‘;a(frJS A 5c.S E L f, & re c u r-» o a _ u U lln C O s )) »■ 1}
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 ;
Capítulo 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*. ;»a«ca. v»Ioc_ofeíefllOo);

vaifl aalir_al_*rr«r(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 bnr-
go. a d e m á s do la inform ación sobro tiem pos, tam bién 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 ssür»
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
?«f»utício^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 > '3/^
♦ji v i “»
F íi'.iJ 2ü>2
’srtiT ácicres Cí sagina: •
T ai como lo d eia a z claro la ¿ alid a de ¿*ca corr-da de m uestra. la inform ación
p . s q u e g e n e ra g e t r u s a g g .. gg orecáacom 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 Programación 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 páginas, 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 bién 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 uál 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 están relacionados e n tre sí, pero no como pad re e hijo. En
cambio, son todos p arte de la m ism a sesión.
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 están 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Í
propósito dé un grupo de p r ice . , f.u- ¡ as. Suponga-
mos, 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 | WC • 1. Si, m ientras esa pipeline
está aún en ejecución, uno la aborta (utilizando Ctrl+C), la interfaz debe poder
term in ar todos los procesos. Esa acción la lleva a cobo abortando directam ente
el grupo de procesos en lugar de hacerlo con cada proceso individual

S esio n e s
LTna sesión consiste de uno o m á s grupos de proces<a,.U n líder de sesión es
- .. ....... juc croa la sesión É sta tiene un tínico idcntificadotT, a S S S S é n
ÍD de sesióiL.el cual es m eram en te el PID del líd er da sesión L as sesiones
cum plen el mismo propósito p a ra los grupos de procesos'uue estos últim os
p ara los procesos individuales.
/ / / / . / / y / / / / / / ¿ * s j .i

Capítulo 4: Procesos 77

f
Digamos que si lector ejecutase el m ism o comando de pipeline mencionado re­
cién 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 estu-
v 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 aún corriendo, el k e rre l le en viaría una
señal al proceso que tiene a su cargo el control (el líder de sesión), el cual a su
'■ez m ata a cada grupo de proceso como se lo describió en el parágrafo anterior
La m anipulación 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 inología em pleados porque los
mism os tien en im portantes repercusiones p ara las señales, que se cubren
en el capítulo 5. •Señales."

Manipulación de procesos
E ste punto an aliza la creación de procesos nuevos, la eliminación (k illin g ) de
procesos ex isten tes y la espera y supervisión 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 rácti­
cas recom endadas de d(lm inÍ3tradón de recurso.1 requieren que lo» procísoa
padres aguarden h a sta que term in e n sus hijos E ate requerim iento es imple-
m 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 títulos 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 estándar, os uno de los métodos.
Las llam adas a f o r k y e x e c , sin em bargo, constituyon el “estilo Linux". Es­
ta sección analiza las tres llam adas.

u t il iz a c ió n d e s y s te m
La función 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» iyíiwico**: snü- Mtrtrtg);
s y s t e s ejecuta el comando de in terfa z s t n n g transfiriéndoselo a / b i n / s f i
y retornando después 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
razón, s y s te m no lo ^ ara-in v o car / 5 i n / $ h , reto m a d eedigü l2 7 . Si ocu-
rrie ra éa~egmbio a l g d ^ t r o dpo ~ ?e^ffor, system ~re to m a ría -1. E l valor ñor-
ífiál dé re to rñ o ^ e s y s 1 5ir.”es“etcoargo'de salííá'derco'iñándo"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 ría 0 si / o i n / s h se encon­
trase disponible o u n valor distinto de cero en caso contrario.
Programación 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
función 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 pa-
dre. 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, ;.-x-
cepto 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 sesión, ol encorno, los lím 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 lúa 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 excepción 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 ’ /•
V V
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 ~ - i) (


p e rra p ("fo rk ‘ j;
a*itl£XIT_?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_SUCC€S8);
h s is e i
Capítulo Procesos 79

» Jts ('£ n » i proceso M áre * );


p r ir t ? ( * \ » i d = g etsid.'H ;
srincf(*\tpott * vj\s*. g e to c :á O l;

í
wi*iix"_succ€ss):
}
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 tum-
bién ilustra una cuestión critica referente n la utilización de fo rk : no so
puede prederir i i un proceso padre se ejecuta r á a n te s o después 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 líneas
provienen nuevam ente del proceso padre. E l program a ae h a ojecutado fuera
de secuencia; es deo r, asincrónicamente.
La n a tu raleza asincrona de la conducta de f o r k significa que no se debería
e*ecutar código perteneciente ol proceso hijo que dependa de la ejecución de
código del proceso padre, n: viceversa. H acerlo así crea potencialm ento una
condición de com petencia (race condilion), que tiene lugar cuando varios
procesos quieren u tilizar u n recurso com partido pero dicha acción dependa
del orden en el cual se ejecutan los m ism os Las condiciones de competencia
pueden ser difíciles de localizar porque el código que las crea funciona 'la
m ayor p a rte del tiem po.' R esulta di£cü p red ecir los resultados que arrojará
u n a condición de competencia, pero sus sín 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 caída del sistam a.
LTn a llam ada 3 f o r k puede fra ca sa r porque h a y demasiados, procesos cn-
rrien 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'. núm 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 ingún proceso hijo.
/ / / y / i > J ) / ) } ) ) ) ) ) ) ) ) )
' 80 Programación en Linux

N O TA
0 proceso de efectuar un f o r k involucra el copiado c e tc c a le imagen cíe 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 efectúa 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 p»dre. 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 furüsamental 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 característica 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 condición 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 tíe 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

UT1UZACIÓN OE exec
I-i función e x e c e3 en realidad unu íam üia-de seis funciones, en la que cada
uña 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 fruición 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|con»t cnar *path, conat char *arg,

Í
;nt e*eclo<con3t char

ln : o*od«(coi»8t char
• rile ,

*pa:h,
const char *arg, . . . j ¡

somt cnar *arg. criar «const«nvp|);


tnt 4<«cv(cor.s; char *path, char *con»t argv[||;
tnr *x*cv*(const char ‘ satn, char ’ cons: jr g v J ], char‘ conit«nvp||i;
cnt *iiacvplconsi char 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 gen«ra 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 varía.
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 i«o de execve


Caoftulo 4: Procesos 81

#¿.TCluCt «anista.fi» ^
linCigO# <sttflib.h>
•m ciüCf < 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'tAícve*);
•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 s /*»K»t
p M k if U tH * r > t g*tn«M.C s r p r i d i .c r*su» 0 2 .C
«nilfl.c « iK v t.e ils .c ''tiv tti.C
L' ° * Comoi*e p uede *preciar_de_ej¡ta 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 ¿liimét y
por lo u n to las üTtim.üs dos Línoáá d eteste program a ju n n ü ae ejecutarán.
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 continuación un análisis 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 itarán la conducta de la
interfaz y recu rrirán a SPATK p a ra localizar el archivo binario a ejecutar
Programación 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 continuación:
• « 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 función exec.
Su código sería 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 ubicación de ese enlom o se alm acena en e n v p , que ta m ­
bién 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 plícita a tr a ­
vés de u n a variable global denom inada e n v ir o n que contiene la dirección
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 código que u tiliza g e te n v y p u te n v se m ues­
tr a en el siguiente program a.
Capítulo 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 :
¿Ü* * kzecr* ;c ' orog-';n= Sn testeffv.c ■/ V
E-------
lEMPwO , . '

• zonon¿9b3j»oxomo.z - C aw rvtoa ««corno ssrg y nj v a ria b le ae er itomo


•i
*incluí* <wü»W.í'*
•inclufi* « í t i i i a . n »
«jncluo* <sW‘.o.f»>

m t M ir iw id l

<
cn»r v ir u D l* - 5».«*-tarr.oi| * {’ tlIJWTA «
/ u*va r i o/ i « 4 1/ *lg vs ¡i_J a Üc »c ion / • j «ct, t j D1«1};

if!eu:«nv(v*r:a6I*_3«_*nwma)>
e u u {* 0u t«M fallo*
c lu
put>(*pat#nv tuvo « u t a * );

i'.'5ete^vCtf!_WTA*))
prlfltf( 'MI_WTA«\s vn*. jeter.v {•UIJV 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 ejecución dei programa produce la siguiente salida:
s ./corcn»»oi_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*
Programación 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. eTprñcesó'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 creación 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 confusión, sin embargo, esta sección se concentra
sólo 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-CGndiáón.de-sai¿da_del m ismo
con wa t t o w i i t p i d . Un proceso p ad re recoge la condición 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­
dición 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 todavía 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 condición 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 tóm 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 ­
peño y obliga a volver a a rra n c a r ol sistem a, lo que obviam ente no ea una
situación desoablo en un entorno do producción con requerim ientos cntico3.
U n proceso huérfano, por o ira Ja d o . ea. u n proceso hiio.cuyo padre larm inu
a n te s (te 11 ' > : * 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 cóftdíClún do salida, evitando cr­
eo na ecueñciu Tu aparición do ¿omblos
P ara recoger la condición 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, líit ‘ita tu s, Lnt optiona).
El p a rá m e tra s t a t u s alm acena la condición 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 oíd


Valor Descripción
< -1 Aguardar por cualquier proceso nljocuya PG¡0 sea igual al va-or
30soiu;o de PIO
-1 Aguardar por cualquier proceso
0 Aguardar por cualquier proceso cuya PGID sea iguat a a del
proceso que efectuó ia Mamada
> 0 Aguardar por e¡ procesa ruja cuya PIO sea <gj.il a 2 1 2
/ í > / y y f f i s / t j t i j //

Capí-.ulo 4: Procesos 85

o p tjjsa^ esp ecifica cómo se deberá com portar la llam ada a w a i í . Puede ser •
iWCHA'íQ . que hace que waitpid retorne inm ediatam ente si ningún proceso hi-
¿o'ES^érrninado. MJNTRACED, qu* significa que deberá reto rn ar la condición de
ios procescs hijos cuyo estatus no h a sido informado, o se puede efectuar con
ambos parám etros un 0 lógico p a ra obtener ambas conducías 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 tiíp ic .
/• d«I yrcsn m er, Irrterní^: r t l t e r . c • / y
CJCMPUO
* JOwnwr.c - twiso 39rctiio ce w lt
•/

«3yi-'ty5«s.h>
*mciuo«
•ircivrt* <*tCia.n>
• t-'C lüS* « 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_9XC£SSi;

X -
*coiv3lci6rt, 0J¡T 1
lA
C~
J. . r
r-c
y-tx' •

"& jts [* E r proceso páCre:*);


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_SUCC£SS);
)
Programación 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 <J0 ¡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 añado una se n te n ­


cia w a líp i d Específicamente ag u ard a poro! proceso h i j o especificado por
hijo p ara re to m a r y tam bién exhibo la condición do solida del mismo. O bsér
veso que las salidas do los procesos pudre « hijo no están entrem ezcladas co­
mo sucedía en h i j o . c . La ejecución 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
ñnHtlíMrO ¡i se eapocíHcó 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 señal.
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 código de ker-
nel, 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 función
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 función e x i t (salida), que es p arte de la biblioteca
e stán 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 inación norm al de un program a y re to m a S ta ~ j s al


prc-ceso padre. Se ejecutan en esa ocasión todas la s funciones que se h allan
registrad as con a t e x i t (a la salida).
Capitule Procesos 87

La función _ 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 .

utiuzación de a b o rt
U tilice la función 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 ayoría de los depuradores u tilizan
pora an alizar el estado de un program a cuando 4»te 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 ­
bería :-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 bién u n a función incluida en la biblio­
teca e stá n d a r ‘declarada en < s td ll b .h > ) . S u prototipo os:
voia iscrtívoKJ};

E je m p lo
El siguiente program a m uestra el com portam iento de la función a b o r t
¿¡D * Hctizn á»l jr jjfiM «o in tí^ K f abort.c ^
CiCMfLO 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 ü c£4r •/


t«i:tE*:'_5JjCCcSS>;
>
La salid a de eyte program a se n a como sigue:
p 3 ./aso.':

’i t K r
'• • •' ^ Observe que su sistem a tal vez no genere o n vuelco de memoria (core
sabida 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)
/ / j y j. j f y .1 / ,/ \ / f i r ) \ i
8S Programación en Linux

✓Para mayor información sobro «íepuración con un archivo ce vofcaco i* -gmorta. ve' ‘ Ini­
cio 3é gdb.* pfitfna •123.

EMPLEO DE LA FUNCIÓN k í l l
Los dos parágrafos anteriores se concentraron en la m anera en que u n pro­
ceso puede elim inarse a si mÍ3mo. ¿Cómo, entonces, puede un proceso d ar
término a otro? U tilizando la función k i l l , cuyo prototipo es el que sigue
íp.t k iiilítc _ : pie, in: slgj;
Para utilizarla, ei lector deberá incluir en el código fuente de su program a ta n ­
to < s y s /ty p e s .h > como < s ig n a l.h > . El parám etro pidespecifica el proceso
que *e desea elim inar y sig es la señal que se desea enviar para ello. Como es­
ta parte cubro la eliminación de un proceso, y no tra ta sobre señales, la única
señal que consideraremos por el momento es SIGKILL Ei capitulo 5 am plía el
tratam iento de las señales. Por ahora, sólo dé lo siguiente por cierto.

E je m p lo
Este programa m uestra cómo 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_SUCC£SS|;
> *Ui í
r U t i U n r ftNOHANG w a nacer retornar a wait ínrediatajrsnta •/
; i ) t j ) ) i ) i ) )

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 »:««**«) { // ~ ~ ~~ 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
•i
puts(*iull fracasc\n*];
p « rro r|* « iir);
«aitpidí^ijo, toxxücaon, a);
) flií ^ &
5 " i n t f | 'V í i l i a i r a d o V r * , h l J o | ¡

>
\
**tt(Exir_SüCCtssj:
>
La salida de este program a d eb ería ser sim ilar a la siguiente:
S . / • l i a i n a r _ ? c >OCMO
*5T1 « liR ln rto

Luego de verificar que la función 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 actúo^obr«e! proceso hijo pero utiliza
•AYÓ ; !.-• ir:i i•í .i::::¡: >j*.u.v*.l-.xil••!•.'•“ l.uo;»o e liim -
ña el procesó'Iüjo. s i k H I Trácása. « :iu función reto m ará -L. en caso contrarío
retornara 0. Si K i l i fracasa, oí proceso padre llam a a w a ítp í d una segundu
vez, asegurándose que la ejecución 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 bién p u ra enviar cualquier señal a un proceso o
grupo de procesos. El capitulo 5 cubn* lo referente a señales en detalle.

Cuándo 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
código. Supongam os que el lector e sté creando un (otro más) ad m in istrad o r
de archivos. A unque seria ideal re d a c ta r au propia im plem entación del pro­
gram a l s , sería mucho m ás rápido en térm inos de tiem po de desarrollo u ti­
lizar ei comando l s existente y co n cen trar su s esfuerzos de program ación 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 códigos 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 debería
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
Programación on Linux

códigos de salida. La cuestión es que u n a adm inistración responsable de pro­


cesos necesita u tilizar algunas de las técnicas com entadas on este capítulo.
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 código es
el archivo de volcado de mem oria, la im agen de u n program a en ejecución
que se escribe a disco. Por lo tanto, 3Í uno puede circunscribir un problema
a una sección específica 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­
puración del mismo (la depuración se cubro en ol capítulo *20, “U n toolkit de
depuración'). 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 inistración de procesos em pleando las técnicas com entadas on este
capítulo le re su lta rá esencial.

Lo que viene
Eate capítulo hu echado una prolongada m irada sobre los procesos do Linux
El próximo capitulo cubre un tem a com plem entario, ia3 señales, y profundi­
za su comprensión de los procesos y do la pro«ram ación en Linux on general
J ) ) ) ) ) ) J J 1 /■ ) i ) i ) )

Señales
L as señales constituyen la form a m á s sim ple de comunicación 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* señales son tam bién 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
ción de cierta envergadura, n ecesitaría em plear aenaies.
Esto capítulo cubre l<» siguiente* temos;
• ¿Qué m u n a señal?
• Terminología de las señales
• Las prim eras API de señales y san problem as
• Las API de señales POSDÍ y Linux
• Envío y recepción de señales
• A dm inistración de conjuntos de señales
Tbdos les program as de este capítulo 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 núm ero de ISBN 0789722151.
94 Programación en Linux

Conceptos sobre señales


Cuando se h ab la de señales, surgen continuam ente térm inos y conceptos di­
versos- E sta porte del libro define dichos térm inos y explica tales conceptos
A e sta a ltu ra del an álisis nos b a sta rá con u n a comprensión básica de la te r ­
minología y de loa conceptos empleados, el resto del capítulo 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 análoga a una interrupción do h ard w a­
re, un suceso que tiene lugar en caaí cualquier momento duran to la ejecu­
ción de un proceso. Eata im previsibilidud significa quti las señales son asm-
crónicas. No solam ente puede ten e r lu g ar u n a wjñal oa cualquier momento,
sino que adem ás el proceso que recibe la señal no tiene ningún control sobro
el momento on que la m ism a es en riad a. Cada señal 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 núm ero de señul,
definidas en ol encabezado del archivo de sistem a < s ig n a l.h > .
L oa señales aparecen on muchas situaciones. U na excepción de hardw are,
tal como una referencia ilegal a la m em oria, genera una señal. También ge
ñora una señal (SIGPIPE) u n a excepción 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 función kiU (m atar) que
áe com enta en el capítulo 4. “Procesos", envía una señal 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 bién generan señales.
✓ Para --r.a exposición comoleta scfcre cómo escribir a ooes. ver "Pipes oe lectura y escritu­
ra*. pagina 325.
Cuan d o un proceso recibe una señal, puede hacer con olla u n a de tres cosas:
• Puede ignorar (p asar por alto) la señal.
• Puede perm itir que ocurra la acción predeterm inada asociada a la señal
• Puede_ccipturar o intercep ta r la señal, lo que hace que se ejecute una
sección especial áe codigó. denom inada handier (m anipulador) de se­
ñal. E sto se denom ina precisam ente m an ip u lar !a señal
E ste capítulo 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 señal determ inada para un proceso cada vez que ocurre algún
suceso que dé lugar a esa señal, como por ejemplo una excepción de hardw are.
A ia inversa, =e dice que una señal es entregada cuando el proceso al cual ésta
h a sido enviada toma acción sobre la misma. D urante el intervalo que transcu­
rre entre -a generación de u n a señal y su posterior entrega, se la considera pen­
diente. La entrega de una señal se puede bloquear, o sea demorar. La señal es­
ta rá demorada hasta que sea desbloqueada o hasta que el proceso receptor
C apítulo 5: S e ñ a le s 95

decida ignorarla. La m anera en que ur. procesó responde a una señal se deno­
m ina disposición de la señai. Un proceso puede altcrnacr-.-arr.ente p asar por al­
to una señal, perm itir que tenga lugar su acción predeterm inada, o m anipular­
la, donde esto último significa ejecutar, en resp u esta a la misma, un trozo de
código personalizado. U na señal bloqueada tam bién es considerada pendiente.
Un conjunto de señales 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 señales. Finalm ente, la
máscara de teñóles de u n proceso es el con;unto de señales 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 diseñado siguien­
do los especificaciones POSLX. ha incorporado liberal mente características de las
<J« r a c í í principales de su antecesora, los LTNDC de AT&T y BSD. Esta herencia
se hace evidente en las señales Lo que ocurro es que tanto en el UNIX do AT&T
coa» en el de BSD m ha adobado también u n a API de « ñ a l compatible con PO-
SCC de medo que las diíenencas entre ambas A PI no resultan demasiado significa­
tiva» i siempre y cuando todo el mundo esenba su código para la API compatible
« a POSIX. por supuesto). A continuación mostramos, luego de un rápido repodo
del desarrollo de la API do señal, como enviar, interceptar y mompulur señalas.

H is to r ia d o la s s e ñ a le s
Las señales h an sido parte de UNIX casi d«sde 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 señales
surgieron tros problema.» pr.ncipales. El prim er problema fue que los m anipula­
dores de señal tenían que volver a ser instalados cada ve.’, que su los utilizaba,
lo que daba lugar a una posible (o probable^ condición de competencia. Si se en­
tregaba una segunda señal m ientras la p rim era estaba siendo manipulada, y
ante? de que se pudiese volver a instalar el m anipulador de señales, o bien esta
íegunda señal se perd-.a u, oltéraativamunUr. ei proceso perm itía que tuviera lu­
gar la acción original de la señal, sin ningún procesamiento.
El segundo problema ocurrido con las im piem entaciones iniciales de las' se ñ a ­
les rúe que éstas no proveían una m anera sencilla de suspender tem poraria­
m ente un proceso h a sta que arribase una SéáaL Como resultado, podía darse
e! caso de que se entregase una seña: 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 señal. En consecuencia, se im­
ponía u n a enorme carga sobre los program adores Después 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 señales no confiables.
La API de seña íes POSIX que cubre este capítulo es considerada confiable
perqué h a subsanado e stas limitaciones. Bajo POSIX, los m anipuladores de
señal perm anecen instalados, evitándose a s í la condición 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 bién pro-
/ , > ( t / i I 7 ' > f ) ) » •' 1 ' 1

96 Programación 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 seña:, elim inando así el problem a de las señales perdidas.
S e ñ a le s d is p o n ib le s
La tabia 5. i enum era todas las señales que adm ite Linn*
Tabla 5.1. Señaies de Linux
Señal Descripción Acción predeterminada
S IG ABR T Generada por la runcíón Proceso termina y graba una
a b o r t deí sistema (POSlX) imagen de ¡a memor-a (core dump)
SIGALRM Una señal ce 3portad ara {títmr ^rocoso termina
signad gororada por la función
a ia rm del sistema (POSlX)
SIG8US E' proceso trató de utilizar Proceso termina y graba una
memoria mal alineada o imagon de la memona (core domp)
sin alinear (4.2 BSC)
SIGCHLO Un proceso hijo se ha detenido Ignoraría
0 terminado (POSlX)
SIGC0N7 El orocoso debe continuar 5l está Continuar (ignorar si el proceso no
detenido (POSIX) está detenido!
SIGEMT Error tío bus {HafdVraro) Proceso termina y graoa una
Imagflrt de la memono (coro dumpi
SIG FPE Excepción de punto flotante Procoso termina y graba una
(POSlX) imagen de i« mamona (core dump)
SIGHUP Proceso recibid un corto de linea Proceso tormma
on su terminal de control
o su procoso de control muñó
S IQ t L L Comnndo nogal Procoso termina y vuelca (graba) una
(POSlX) imogen ce lo memoria (cona aumo:
S IG IN F O _o mismo que SIGPWR Ignoraría
S IG IN T Ü3uario gonoró una ¡ntorrupcór. Proceso termino
de teclado (POSIXJ
S IG IG Se recibió E/S asincrónica Ignorarla
(4.2 BSD)
siGior Error de E/S. Igufll aue SIGABRT Proceso termina y groba
(4.2 BSD} imagen do la memoria (core (Junio)
S I G K IL l Terminar procaso (POSlXl Proceso termina, no se puede inter­
ceptar o Ignorar
SIG LOST Proceso perdió la eraos de Procoso termina
un arch/va
S IG P IP E Procoso trató do escribir a un Proceso termina
conducto sfn lectores (POSIXJ
SIGPOLL Ocurrió suceso encuestaole Procoso termina
(Sistema VI
SIGPROF Alarma ae contorno asignada sobre Proceso termina
un Segmento de código expiró
(4.2 3SO)
continúa
) ) ) ) ) ) ) ) j i y t ) i ) ) ) ) ) i J )

C apítulo 5: S e ñ 3 le s 97

Tabla 5.1. Se-'síes de - p j j lcortJ.-iuaciár..'


Señal -D e sc rip c ió n Acción predeterminada
SI& W R S istem a detectó un p rc^ e o -a Ignorarla
de suministro eléctrico ( S is te m a '/)
SIX U17 Usuario ge-em ung sai^a Proceso termina y graba una
ceses e tsd a d o ;P03IX) imagen de a memoria (cora dume)

SI&S5GV Proceso trató «e Proceso termina y graba ura


reíereroar memona msgen de 13 memora (core ¿ump)
msccesi&ie (POSIX)

S IG S T K -L T Proceso una falla Proceso termina


•n 13 p-'a ’ í e r n jr r ü la piia*)

S IG S TC P S e t o 00 ceteooón !.POS«? Detención, ro se puede ¡nterceotar o


ignorar

S IG S YS Argumento incorrecto pasado Proceso termina y graba una


a njtina imagen de ia memona (core 'Jamo)

S IO TEB U Proceso recibió una Proceso fermma


sertai de terminación ¡POSiX)

SIGTP.AP P'ocesc 'legó a jn ponto Ce Proceso termina y graba una


detención generalmente imagen de ia memona [cora /htnio)
Curarte una depuración
de cód'goj (POSJX)
S IG TS TP Usuano generó una detención Detención
desde ei teclado tPOSiX)
S IG T T IN Proceso trató d*'eer Detención
desde s t d i n mientras corría en
seguido >4no (POS>X)
S IG TTG U Proceso intentó eseno^r a Detención
S td O u t mientra» corría en
segundo piano (POSIX)
SIGUNUSED Sertai no utJtiaca °roceso termma

SIGUfiG Conooón de urgencia en un lgpor«rla


s ocK e t (4 2 asoi
SIGtiSfiT Se*a< I definida por ei -suano Proceso termino
(P O S «;
SIGUSA2 SV-aJ 2 dtftnála por el osuaro Proceso termina
(POSIX)
SIGVTALñM Alarma de ntarvaios expiro Proceso termina
(4.2 3S0)
S I Srt I NCM 3 tamaño de una ventana temí mal Ignoraría
cambió (4.3 3S0, Sun)
SIGXCPU Proceso excec.ó a cancdad Proceso termina y graba una
re ¿ampo ce CPU Que COtfa magen de :a memona fcore dump)
utilizar (4.2 5S0)
continúa
98 Programación en Linux

Tabla 5.1. Señales ce Unux (continuación)


S eñ al_______ D escrip ció n A cción p re d e te rm in a da
SI3XFS2 Proceso trató ce acceder o Proceso cernina y grab3 una
m a n ic u ia r u n a rch iv o m a y o r imagen de !a memoria (core dump)
q u e ei lím ite c e ta m a ñ o de
arch iv o del s is te m a ( 4 .2 BSO)

Corao se puedo ver a p a rtir de la tabla 5.1. las señales que Linux reconoce
son una mezcolanza de señales dorivadas do BSD, do Sistem a V o de AT&T
y. por supuesto, de POSIX. Varias de los señales listadas, sin embargo, in-
cluyundo 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
página 7 (señales) dol m anual constituyo un misterio!). Los siguientes pA-
rrafbs tra ta n la m ayoría de oatas señales m ás dctxdlurinmonto.
SíGABRT es generada por la función abort que se comento en ol capítulo 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 íiineación y luego continúa. SIGCHLD se envío 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 rtotaltóaamento on ‘ Esperas on procesos*, pagina 84.

SIGMUP tiene lugar cuando termina un líder de sesión o cuando se cierra una ter­
minal de control. SIGFPE se envía cuando ocurre cualquier excepción aritmética,
tal como o<.*-r?!ows (desbordes), un/lcrflows (desbordes por la derecha) o divisiones
por cero. SIGILL es generada por otra oxcepción de hardware, la ejecución de un
comando ilegal. SIGINT hace quo todos los procesos presentes en el grupo de pro­
cesos que está ejecutándose en primer plano terminen porque el usuario generó
una interrupción desde el teclado, generalmente ripeando Ctrl+C.
SIGGUIT. de m anera aimiiar. se genera cuando se ti pea desde el teclado el ca­
rácter de salida, generalm ente C trl+ \. O tra señal generada desde el teclado.
C tri-Z , genera SIGTS7P. Las funciones SIGKILL y SIGTERM son generadas
por !a función k i l l . Obsérvese que SIGKILL no puede ser interceptada ni ig­
norada; esta configuración perm ite disponer al superusuario de un método 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 ejecución del m is­
mo puede continuarse enviándole 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 año, todos ios proce­
Capitulo 5: Señales 99

sos que se e stá n ejecutando on prim er plano reciben la señal 3IGWINCH. Las
señales SIGUSfi 1 y SIGUSR2 están 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 máximo tam año permitido de
orciuvos. respectivam ente.

Envío de señales
Deaie_un program a, existen dos m anaras de e n v ia r u n a aeñal a un proceso
en ejecución utilizando el comando k i l l ( k i l l ( l ) j o emplgar.30 la función
El comando k i l l es er. realidad una interfaz de usuario hacia la
función 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.aoón 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 ejecución 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 s e r a e c io da « j- l lll )

# i r c i a i í < s y s / t y p e j.n >


♦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;
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
tsnurasion */

¿ ? U M je - fc rx (J ) < t) l
O é r r o r t f o r * . ') :
e x '.z : = X lt jA X líF £ \ ;
;• i l í * ¿f¡*.:;o == 3 í • i : srogniea » áccaentra er s i oroetse " i j c ‘
sI= 5 B (S * } ;
} sis* {
100 Programación 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 í | ‘ SLijalngnílo 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 espués 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 razón, 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 condición de -jalida, Recuérdese del capitulo a n ­
terior que las funcioncá de e x e c n u n ca reg resan un eódigo 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 ­
bién utiliza ia función 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 función e x e c l . C uando se corre ei program a, la salid a «im-
plóm 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


Por supuesto, el PID indicado sea probablem ente distin to p ara el sistem a
S A II0 4 con que cuente el lector,

E m p le o de la fu n c ió n k í l l
El empleo de la función k i l l es m ás sencillo que la ejecución 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 señal que se desea
utilizar. La razón 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 ejecución.
Se hab rá notado que ninguna señal cieñe el valor 3 La única que tiene este
valor es lev serlahtuía, que tiene un propósito especial. Si uno le tran sfiere a
k i l l la señal nula, k i l l no envía ninguna señal, sino que se rem ite a reali­
zar su verificación 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 todavía ejecutándo­
se, empleando su PID p ara buscarlo. Téngase en cuenta, sin embargo, que
los PIDs se routilizan periódicam ente, de modo que, en u n a m áquina a ta re a ­
da. éste no constituye u n método confiable de comprobar la existencia de un
determ inado proceso.
Capítulo 5: Señales 101

E je m p lo
Ei siguiente ejemplo utiliza ía función k i l l p ara enviar dos 3eñcdes 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
/•
• í4t»níja.C - =nv-.4r a- 5 itfttl ¡ir IMIO Cí k¿lU2)
*/
•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
«*itiéx:r_fA:Lvaci;
) iílh 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 ia¿il cu« i«a iSrvjrad* •/
p rln rf í'& w a f to a SICCHLD * W f t ', m jo j:

c«diío_5*_r*:crnc » k iin m jc , ^TOOaj);~~ * '


tf(codí®o_««_r«torflo < *)
p*rro r{•¡cilliSIG O tU )'j;
•i»
p r m t r f 'E l prccssa w todavía 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 ae salida 'I
«a iip id (h * ]o , JJüU, <J J;
102 Programación 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:
f i Joatitiijó
í.ivianco S:í>0<'.0 a a n
£ 1 proceso 071 toáavia í x ís h
M I____ E lin ir jn d o 871
ja u o a « ,/oatafii.)o
Enviado SIGCW.0 a 979
El {irocuso V9 todavt* <ixí»t«
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 inglés, m atar) puede sor utilizada p ara onviar sédalo» difere n te s a las
ue son nocesariáS p ara tHgTSr uñ procosoJSlGKILL, SIG7ERM. SÍGQUIT).
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 neñnl nula
para confirm ar que el proceso ni quu ai* li* unviú la nerta! todavía existía, 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 función 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 donpuós del proceso padre. Si el que term inase primero fuera el proce­
so padre, ul proceso hijo se convertiría en un huérfano adoptado por i n i t , e
i n i t obtendría la condición 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 condición 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.

Intercepción de señales
SI aspecto engorroso del envío de señales lo constituye la intercepción y la
m anipulación de las mism as. C ada proceso puede decidir cómo responder a
todas las señales 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 siro-
plT de intercep tar señales no consiste de hecho en in terceptarlas sino en
sim plem ente esp erar a que sear. enviadas. La función a la r m pone en funcio­
nam iento u n tem porizador (tim er) que envía la señal SIGALRM cuando el in ­
tervalo de tiem po a que fue ajustado este últim o expira. La función p a u s e se
comporta de m anera similar, excepto porque lo que hace es suspender lu eje­
cución de ur. proceso h a sta que el mismo reciba alguna señal.
P ro g r a m a c ió n d e u n a a la rm a
La función alarm a, cuyo prototipo se en cu en tra en <unistd.h>, activa un
:erapcrizadcr en el proceso que efectúa la llam ada. Cuando el tiem po asig­
nado al temporizado? expira, se envía SIGALRM al proceso que efectuó la lla ­
m ada y, a menos que este últim o in tercepte la señal, -a acción pred eterm in a­
d a p a ra SIGALRM consiste en d a r fin a dicho proceso.
Cao:tui0 5: Soñaies 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 tísj;

s e c c r.o s es el núm ero de segundos se reloj desp u és do los cuales el tempori-


ta d c r expira. El vaior que recom a e sta función 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 sólo una
aTnrmu. E stab ie c ec d o el núm ero de segundos en 0 se cancela cualquier
alarm a previam ente program ada

E je m p lo s
itllf 1. E ste program a establece una alarm a de cinco segundos, después de lo
cual term ina.
n rM H .0 /• s o rz'* í * i progriaa en J n t* m « tV .o y iií« 6 .í ' /
/•
* « 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 tíl’V» *» y a r » « L ir tu flr c - jfiiu - ia * ) ;
• 0* ja r írscziic t i procasc al : i w s u fic ie n te •/
!• toao par* la alarva íi p i r * •/
fli« P (3 9 );
/ • £1 p rc^ am no a » 5 * r ia Ufrga'- a c u l • /
O u zH 'íC c e a r „ a a i s f s g r u u l .s g o í q u 1 7 ‘ >;
íuméjUT.paiu**);
>
La salida de e ste program a es la siguiente:
./ a ia m
A la ra clack
^ E ste program a establece una alarm a de cinco segundos, observa si ya su ha-
SAU^ oía 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 generación de 3IGALRU y s u llegada au n q u e no 25 segundos, por supues-
:o). Cuando a rrib a La señal SIGALRM, a la r m a term in a. E l.ruensajfiJA larm
' 1' c l c ck* (.reloj despertador/ lo generó el k e m e l. no el program a a la r is a . Por
l " j,T l « a razón el mismo aparees en inglés.
-= ! 2. Este ejemplo establece dos alarm as, llam ando a a la r m una tercera vez
ejemplo p a ra cancelar la segunda alarm a.
J I ) / J

104 Programación 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 - Cancelación do alsrn3s
*/
í incluía «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 *ncu»ntra estaolecida un* a l a r m ');
/* Estaolacar una n<j«va alarma •/
Jl04p(3);
ccdlgo_d«_r«wrna • 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_d»j- eiorno>;
/• Cancalnr lu MQWIda alama •/
ll*tp<2)¡
g r in t f l- a«itan Ha laounda* «n U 3egunoa aUmaHn*, alar*(0>i:

mt(6Xir_FAII.UW);
>
La salida de este program a es la siguiente
$ ./2alaro
12 Jíg 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 razón pur la cual uno podría llegar a u tilizar alarm as e3 p a ra e sta ­
blecer un lím 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 ) ) > ) J ) )

Capítulo 5: S eñales 105

responda a ur. m ensaje. La m ay o ría do los program as que establecen a la r­


m as tam bién 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.ción 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 efectúa 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 acción 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 ó sólo si el proceso intercepta una señal.


St la señal 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 sólo espera e l arribo de u n a señal y luego finaliza.
/• \o et-» 3*1 pro ^riM «r In w rrií£ : pause.c V >* «
CJ t MPLO /•
• 0 M I .C - Efectúa ana sauia y iu*$o ter»ui*
•/
«úKluO e <w>UM.h>
• m c lu it <1t0U0.N>

tflt M lflívoid)
(
9tvSt{)¡
#*lT{GCT_syCC£SS);
>
La salid a de este pro»fnuna e* ta sig u ien te
S ./ N u «

M ____ (1 |« ítN 5 « ./p a u «


SALIDA

./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 sólo produce u n a suspensión 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)
Programación 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 señal 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 señal para la señal SIGUSR1. ésta
'.levó a cabo su acción predeterm inada de terminación

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 señal es ju sta m e n te su
acción predeterm inada. En otras, probablem ente la mayoría 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 señal 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 señal SIGCHLD.
P ara efectuar un aeguimiunto ndocundo do su s procesos hijos y supervisar su
condición de salida, el proceso pudre puede ya sea llam ar a w a i t , inm ediata­
m ente después de engendrar cada proceso hijo o. do m anera más eficiente, es­
tablecer un h andler de señal que llame a w ait (o n w a itp id ) cada vez que al
mismo le llegue SIGCHLD.
POSÍX detino un conjunto do Junciones p ara cre ar y m anipular señales. El
procedim iento general consisto en crear un conjunto de señales, establecer
las señales que se desea interceptar, re g istra r un h an d ler de señales on el
kem el y ag u a rd a r a in terceptar la señal.

LA API OE ADMINISTRACION DE SEÑALES

P ara crear, establecer e interrogar a un conjunto do señales, utilice las cinco


funciones siguientes, todas ellas definidas en < s i g n a l .h>
• i n t aigem píy36C<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 señales 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 señales s e t de modo que
queden excluidas del mismo todas las señales, s i g f i l l s e t , a la inversa, inicia-
liza s e t de m anera tal que estén incluidas en él todas las señales, s i g a c a s e t
añade a s e t la señal 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á.
Capítulo 5: Señales 107

CREACSON DE UN CONJUNTO DE SEÑALES


P a ra crear u n conjunto de señales, 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 señales. Si c rea u n conjunto de señales vacío,
necesitará em plear sigaddset p ara agregarle la s señales en las que se encuen­
tro interesado. Si por el contrario crea un conjunto que com prenda todas ias
señales, utilico s i g d e l s e t p a ra elim inar del mismo las señales que no desee.

E je m p lo s
1 E ste program a añ ad e u n a señal a un conjunto de señales vacío, 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 310QUÍ8 un co n ju n to <1#

*/
íirclvc# <sl9Ml.h>
# lrcl«4* <«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

<
^a«ro_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*i»P i l conjunta •/
l f | ¡siea63«t{JiH i«vo_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(jPo«vo_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 * ) ;
• SÍST 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 * ,.ln«eYO _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 ) 1 ) . ) ■ ) , ) ) ) . ) ) J ) ) ) ) ) 1 ) ) J
108 Programación 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

0«rror<nc*l>r9_s9ñai| ¡
*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 señales vacío, transfi­


riéndolo a s i g e n p t y s e t la dirección de una estructura s i g s e t _ t Luego añ a­
dí» SIGCHLO dicho conjunto do señales. Finalmente utilizando s ig is m e n b e r,
confirma que SIGCHLD es efectivamente parte del coryunto do señales y que
SIGTEHM no m parió del mismo.
2. Este ejemplo ilu stra el proceso do remoción de una señal 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 tíin je v o ^ o n J u n to , SÍGA;.aM:i < 0|
s a I i r _ 3 l_ e r r o r { * s lfla i3 c se t* ) ;
) i ) i i ) ) ) i ) ) ) ) ? y » t ) ) ) y > i y

C apítulo 5: S e ñ a le s 109

/* SISALA í= u « ri 3 Tacar s i í c « iin ira d a •/ *'


i* ( 5í j ;«* 9 c q .-; 4"u?vc-_corjunto, SI3ALAW)
ptií$(*SíG.»U»l 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**fc«c!fcvjevo_co<ijunto, SIGTS?H))
p u:i(*SIGTO » esta presente en a l ccnlunto de señales- );
cisc
W t i í ’ SiGtíSM -c esta c o s e r t e en e l ceflj-jflto 59 ssf-aies*);

•«ttíEXIT_S¿CCES$í;
I

i
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 ¿* a«rtal«i
3 IGTÍW « 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 señal
elim inada ha s:do efectivam ente su p rim id a y que las dem ás señales siguen
estando presentes.

REGISTRO DEL HANDLER


El mero hecho de cre a r un conjunto de señales 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 señales 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 señales corrien­
te; si no se hubiese aún establecido u n a m ascara de señales, todas las s e ñ a ­
les ¿ a ra n lu g ar a u n a acción p red eterm in ad a. U na vez que se establezca una
m áscara de señal, se deberá re g is tra r u n h an d ler p a ra la señal o señales 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);
> t ) ) ) ) ) ) ) ) >

110 Programación on Linux

sig p ro c m a sK establece o exam ina la m áscara de señales en vigencia, y lo


haco según el valor de how, el cual puede ser uno de los tres siguientes:
• SIG_BL0CK - s e t contiene señales adiciónalos a ser bloqueadas.
• SIG_UNBlOCK • s e t contiene señales quo deberán ser desbloqueadas.
• SIG^SETWASK-set contiene la nueva m áscara de señal.
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 algún error,
uu »iQíCttQ/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 señal 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 .señal.
Su definición 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 ftinción que especifica el handler, u fun­
ción. a .s«r invocados cuando sea generada la señal enpecificada en sig n u m
La función dou« do esta r definida con un valor de retorno de tipo v o id (es
decir, no re to rn a rá ningún 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 bién
SIG_OFL, lo que hace que tenga lugar la acción prodeterm inada de signuffl,
o SIG_IGN, lo que ocasionará que e sta señal sea ignorada
M ientras un h andler de señal se encuentra en ejecución, ia señal que lo activó
queda bloqueada, s a j r a s k define la m áscara de un conjunto de señales adi­
cionales que deberían quedar bloqueadas d u ran te la ejecución 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 más de las siguientes alternativas:
» SA_NOCLDSTOP. El proceso ignorará cualquier señal 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 señales personal¿ 2 ado se
ejecutará 3ólo una vez. Luego de que se ejecute, se re sta u ra rá la acción
p redeterm inada de la señal.
• 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 señal se a recibida en
el interior de su propio handler.

i
CapfvUio S«nates 111

. o e prest* atención 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 expresión s l g a c t i o r
•.orrsspocae ta n to al nom bre de una fundón como a! del patrón á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 s¡ñaies 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 (uncióa 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 hancüer d e una o m ás señale? y configura el comporta-
m 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 SíGTHflU sin proce-
er a in s ta la r un h an d ler que adopte alguna acción sspedal.
»>c«s*« Oel oroQr«B4 «n blocft.c. £ 1 »«« .iitv x ti líoírtiicla
• *! \joor- m^r-ado »: :rogrj.n „ u K f & i y ) 0* »U íítion V
r
Slco¿tir_i*Aai,,.c 8iocy«* un coo'ufl» se
*/
•ircltffl# <S43rai,.t>
*lAc!utf« <jMU6.n>
♦ircluO* <ttOiO.fi>

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 j u g o mj

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 , srariísiu <41
í i : “ - s i - * r ' 0 < "C si;aocí»t:S ÍG T c?Jtf* J;
- ' ’ ‘ * iQaóiití i i.'o«¥o_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*ai«s s¿fl 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 Programación 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 3eñales 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; réflw s ic t d o * J0 l0 q u e a r _ 3 e i\ a le s ) ]
fS K l U ¿IRW $ ( 3 id o í /b laq u ear_so A alfl# ) |
[S K l i l •OU£T S tp iflc r ./filo q u o 3 r_ 3 e A a le 3 )|
Oiiit (cor* ouiríiod}

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 acción 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 construcción
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 acción 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 •); /• función de e r r a r ')
void h a n d ie r _ u íu ir ia !( in t) ; /• lanQ lu r de señales
m t caln (vú id )
<
) ? } ) ) ) ) } ) ? ) ) 1 ) 1 ) > >

C apítulo 5: S e ñ a le s 113

s tr v c t sigaccicfl acción;

* 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 •• «aníHr •/
if({*¿SactíooiS:GU$fi1, U c t io r , MJLLl» < 9)
3a:¿r_j;_#rrof Csisactior.’ | ;
’• P*r»itir «l 3*?ici»nt« titoco c o k oari enviar una sartal •)
ílaeS 'M : .

«iit(Ex:r_5jCC€S5¡;
>

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

<
p«rrori»**»»)*);
n itiG C T M iiu K );
i
»oi3 funal«r_ujw*riol(m t »:©rtu«)
i
** SXQUSftt)
SgtíC lnw rcaptaoa U3ftt*J¡
•isa
(*Inttrc*ot»aa 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 atrón S i g a c t i o n . d eb ería 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 vacío 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:
Programación en Unux

i ./b la q u a a rjisu a rio


[•<111 -USB- S(pldo?
[■<111 $(pldo? .1 01c<j'jear_usuarío| |
tntercsotasa S10USS1

S A L ID A
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 señales den- 33$ o<y
ei yegramado' Se 183 debe emplear cuantío se desoa habitar algún Upo de comporta
miento escecial. tal cono volver 3 ee? archivo do configuración, en lugar de uti lra-*
un hartílor ío s^r.ai a fin de redofinir una « « las sortee* estándar. cuya seméntca ya
su •incuont/0 bion definida

Detección de señales pendientes


s i g p e n d in g hace posible que un proceso dotocte señales pendientes (señale»
que fueron generadas m ientras la? mtamns se encontraban bloqueadas) y
luego decidir si ignorarlas o p erm itir que lleven o cabo 8U acción. ¿ P ara que
se dobe vorificar qué señales están pendientes? Supongam os que el lector
desea escn b ir :i un archivo, y dicha operación 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 acción predeterm inada. De modo que, a n tes de d ar comienzo a la
operación 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 señales 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 señales pendientes o no os opcional. Si se desea
ejecutar un bloque especial de código si se en cu en tra presente cierta señal,
verifiquéis. En otro caso, sim plem ente desbloquéelas.
Igual que las dem ás funciones de señales, sigpending se encuentra proton-
pada 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(sigídt_t * m i;
Ei conjunto de las señales 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ó algún error. Utilice sig ism e m -
o e r a fin de d eterm in ar si las señales en las que se encuentra interesado e s­
tán pendientes, es decir, si se encuentran presentes en s e t .
E je m p lo
P ara propósitos de demostración, 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 lúa e <sys/typfts,h>
Caoi’ü c 5: Señales 115

#L xIuo* < o cist 0 .li>


#iflC¿3de < si 9 ftai.i>
»i3CÍ30f <StClO-ft>
# in cl» 3 l < S tíU D .»

m t su fl(v o t4 )
(
jiS » 9 t_ t coniurto_s»A alts, w r)un:o_M «JH t»te 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_i«i*. 4 l«B, SICTB3 I ) ;

/ • S locuair la M ñal •/
»:;proc»a»x;S;S_3L0CX, leor.Juflto.M rtalaa, V fl.li;

/• Enviar SZGrtflM nacía «1 or&oio procaw V


« lU lflitp W O . SIOftMí);

• Oo?in«r tartalea c*v 3 u n te a V


aiap*«íii»í{4eonjyf.to_pwaUfit«a>;

• Si SI5TZM 54 ancirtAtra p u d e n t e , ig n o rarla •)


i , ;jl5UB6»Cí'-(lC3'*.Jt;rTc_p«’4 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 ) ;
acción.Si_ftaft9ler - S!G_IG«; • !gr*<yrar SISTEÁI •/
s:gactiOfl{SraT£aií, laccion, mullí;

• D ew lw ear S!5TéRU •/
iigppoc«sit(SrG_lK8L0CX. 4ee.-ijunto_sirtal.as, nüll);

ixlTtüciTJtCCESS};
>
E n becef.do de ia brevedad se h a om itido ls verificación <ie errores. El códi­
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 SIGTSñM h a d a s í mismo. Como
es:¿ bloqueada, ia señal no llega a destino. Se u tiliza s ig p e n d in g y s i g i s -
> > 1 'I ) ) ) } ■) ) ) ) ) ) ) > > ) 5) 5 )
rULv» r, ro & ra m ¿ * c ió n e n u n u x

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 acción a SIG_IGN. C uando la s señales se desbloquean.
SIGTERM se ignora y el program a term in a norm alm ente.

Lo que viene
H abiendo adquirido u n conocimiento básico de la adm inistración de procesos
y el procesam iento de señales, 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­
tán ea m en te desde y hacia m últiples fuentes de en tra d a y 3alida. requiere te­
ner un buen conocimiento sobre señales. Los daem ons, procesos que corren
on segundo plano sir. intervención 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 intercepción de señales 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 próximo capítulo explica las llam adas a
.UAtema. lu in terfa z program ática en tro los program as de aplicación 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é raxón y cuándo 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 inistración 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.
I / I } - ) ' ) * - ) ' ) } ) ' ) ) ' } ) )

120 Programación 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 cuál es la razón para emplearlas.
Q u é es una Ñamada a sistem a
Obviamente, un sistema operativo Linux ostá compuesto de m uchos cientos
l de porciones do código, tales como utilidades y program as de aplicación, bi­
bliotecas, controladores de dispositivos. Iiiesy3teras, compiladores, interfaces
... . . , 1. - ^ GUI 'grsphicaí user inizrfacs), administradores de ventanas y, por supuesto,
el propio kernel. Sin embargo, codo esto código se ejecuta en sólo uno de dos
modos posibles, modo usuario o modokernsl.
A menos que el iectór se convierta en un hacker del kernel o escriba contro­
ladores de dispositivos, todo el código qjueJlegue.a^cribir_cqm ¡rá e n modo
usuario. Les probamos que corron en modo usuario sacan partido do ios ca­
racterísticas, tanto el software como el procesador p ara protegerse do otras
aplicaciones que funcionen mal: generalmente, la memoria y los recursos
asignados a la aplicación A no pueden sorem edidos por la aplicación 3 . Ai
mismo tiempo, los programas que corren en modo usuario no tienen m anera
de^
r-—
do llar aLsiatema en-.síT
El código de moda kenwl aunque so encuentra protegido de los efectos pottm-
ci 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 código en mudo líeme! iucluyon loa conUoladom; d* disp o n tivos,
ñlftsyatcmft y, natundmente, el propio kernel, Consideremos un controlador de
dispcaltlvos, por ejemplo. A fin día funcionar adecuadamente, necesita contar
con total acceso al dispositivo físico que debe controlar, tal como una un-.dnd
du di&co, lo mismo que ;»1 código y datos asociados con ese dispositivo. AI mis­
mo tiempo, sin embargo, el dispositivo tísico debe ser protegido de programas
deatructivoij que puedan potencialmente corromper el código y los dato.-» del
controlador, o induaive llegar a dañar de alguna m anera id dispositivo físico.
Por lo tanto, ios controladores de dispositivos deben correr en modo ¿em e!.
Expresado en íénniaw simples, la función del kernel do Linux consiste en
proveer ¡na serie de servicios a los programas de aplicación man teniendo al
mÍ3mo tiempo la integridad del sistema. Explicado do otra m acera, el código
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 método
. ■
■ ;i o! üádígO d<- ;íU ¡tr:0 •• t dol pmtifc.
gido que corre en modo kernel.
Por ¡a forma en que fueron disoñadas, 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 código de usuario comunicarse
con el código do modo kernel es bastante árida. P ara m origerar este proble­
ma. dicho contacto es administrado por funciones presentes en la biblioteca C
estándar. El código de usuario llama a estas funciones presentes en la biblio­
teca, que funcionan como envolturas de la verdadera llam ada a sistem a.
Capítulo 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 código 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 año 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 dirección 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 año 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 restricción 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 efectúa 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 parágrafo an terio r, la principal razón 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-ión 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 inistración 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 inistración de señales, 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 i-
te .o p e n y c ió s e
• A dm inistración 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 ación de procesos, que el común de los program adores nunca
ten d ria necesidad de llevar a cabo.
U na razón por ia cual alguien necesitaría utilizar llam adas a sistem a es para
¿mplcmentar su propio método de adm inistración de m em ona p ara su aplica-
ción. Como sab rá el lector, la biblioteca C están 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 través 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 podría tal vez rem ediar algunas de las ii-
Programación en Linux

nutaciones de la m a lio c de la biblioteca estándar, tales como ’a fragmentación


de memoria o la carencia de liberación autom ática de la memoria sin utilizar
recolección de basura I. También el lector utilizará llam adas a sistem a sin si­
quiera darse cuenta. Casi toda llam ada a sistem a cuenta con una función del
mismo nombre en la biblioteca C estándar. Además, muchas funciones do la bi­
blioteca están 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 bién llam ar a v / r i t e directamente.
✓ S i d e s e a h ailár 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.

Utilización de llamadas a sistema


La utilización do llam adas a sistem a or ta n sencilla como llam&f ¡i u n a fun-
ción. 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 irre-
levantc. La interfaz es la mi3»>a P ara em plearlas, codo lo que se requiere
lu c e r os incluir on itl código 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, parám etros y valores retom ados se encuentran docu­
m entados en las páginas del m anual correspondientes a la sección 2. Dado
quu loa Humadas a sistem a tienen fundones de biblioteca de nombres sim ila­
r e s que están docum entadas en las páginuH del m anual correspondientes a In
sección 3. resulta generalm ente aconsejable leer am bas secciones a fin de ob­
tener una comprensión 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 más de 190 llam adas a sistem a, la discusión 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 sección presenta las llamadas a sistem a máa comunes, refiriendo al
lector a los capítulos apropiados en los que se comenta cada grupo de llamadas.
ADMINISTRACIÓN OE PROCESOS
Lu adm inistración de procesos se tra ta en el capitulo 4, "Procesos". Ese gru­
po do llam adas a sistem a se encarga de la creación y m anipulación 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
Capítulo 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 condición 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 cuántos recursos del e s te rn a puede consumir, lo mismo que
otros lím 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 capítulo 7. “Administración básica de archivos en Linux", y ei capítu­
lo 3. 'Adm inistración 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 utilizarán 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 vínculo
simbólico 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­
nación de propiedad, igual que el comando de usuario de idóntico 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­
ción ¿obre un nrchivo, tal como su tamaño, fecha de creación 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 simultáneo 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 administración de mem ona extiende más allá de las rutinas m a llo c y c a -
l l o c de la biblioteca estándar de 0 . De hecho, m a llo c y su s rutinas asociadas
de asignación de memoria .son llevadas a cabo por medio de las llamadas a siste­
m a Drk y s b rk . Además 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/&nóer sor-re ¿rcr-vo s m aceñCos 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 inistración de sedales com entado en el capítulo 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 acción que adopta u n proceso cuando recibe
una señal determ inada.
• s i g s - S p e n d Reemplaza, tem p o rariam d n te la m áscara de señales de
un proceso con u n a nuev a, luego suspende la ejecución
dei proceso h a s ta q u e se reciba u n a señal.
' ) ) ) ) ) ) ) ) , )

124 Programación en Linux

• si§ o er.cin g R etorna una m áscara de señ al que contiene todas las se­
ñales que están bloqueadas, aguardando ser en treg ad as
al proceso que efectuó la llam ada.
• sígproc~ ask Establece o modifica la lista de señales que desea blo­
quear un proceso.
Códigos 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 mínimo dos m an eras de verificar el valor retornado
Ejemplos
1. Este fragmento do código com para el código de retom o de una llam ada a
sistema con 0.
IftcpOTr/ujrfsre/iinui/Makofiie*, 0 RDDnly)} ( /• 0 ^donlY: A&rir sola para
tetara V
I' Tuvo lugar un error, aiísinistrnr aquí
r *l># I
í* la »9r*.ura <fcl archivo na stda oxitasa •/
)
Ente ejemplo saca partido del hecho do que las llam adas a sistem a exitosas re-
tanunO. U condición i f evaluará a vordad<?ro si la llamada a open fraciisa, de
codo de ejecutar el código de adminiH (radón do orrores que resulto adecuado
D "• 2 Sate fragmento de código haco lo mismo que el anterior, pero evalúa espe-
T s jg ) dñcataéote si la llamada a sistem a reto rn a un valor negativo.
^ iflot»r;V uv,/irc,,lirux;u.tKo<,.Lo*, 0_PCONiv> < 0} | /* O.POCNLV: A artr jalo
pira iictura •/
tj(M p io ;• ,ir trror aecurrto, rundí* it ner® •/
t «IM {
/• op»n«d 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 notación que
es muy común 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 elección es
del lecwr (se trata de Linux, después de todo).
Tabla de cód 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á todavía 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 página del manual p ara cada uno de las llam adas a sistem a docum enta
tocos los códigos de error que genera la mism a. Además, todos ios códigos
¿«áridos en POSIX, el e stán d ar al cual adhiere m ás fielmente L inux, se en-
jj J } J 1 I 1
Capítulo 5: U a m a d a s a s is t e m a 125

cu e a tra n docum entados e a la p ág in a e r r n o de la sección 3 dei m an u ai {ti-


pee s a n 3 e rr n o ).

Tsbía 6.1. Céc-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 E: -.-cceso carece de su^c-entes permisos pa'a 'eaii23r !aoperación
cue 25-tá tratando ce i'svar a cabo
EN06NT E¡ proceso está trs:arv30 09 accederó un archivo odirectora Que no
e »ste .
ES3CH Ese jxcceso re « o s w .
SIftTfi Fue ¡ntemumoica una llamada a sistema.
EÍO Tuvo lugar aigün tice de error oe E/S ¡generalmente relacionado con el
nar¿-«areh
EUXIO B fl'soositivo o OireccOn de E/S no existe.
£ 2 5 IG La lista de argumentes transfendes a una llamada exec era demasiado
isrga.
ESCEXEC 5 formato O í un archivo binario que un proceso tratú Ce «¡acular ora In­
correcto .per eiemjxo. si so fratasa fíe correr un archivo binario SPARC
en un procesador x86) •
E3ADF a una función cuo at>ro/corra/l#«/«cfis>e un archivo se le oasó un nú-
mero incorrecto Ce areh/vo.
ECH ILO 8 proceso no tenía proceso hijo al cual espor.ir.
EAGAÍN Un proceso trató Oo realzar c/S no Oioquoante cuantío no había ningu­
na entrada disponible
ENOUEU No so cuí^ta con ta suficiente mornor n para llevar o caoo la operación
recuenca.
6ACCESS Fue denegado e< acceso a un orcnivo u otro rocurso del sistemo
EFAULT auna ¡lamada a s w o m a se * wisó un puntero mcorrocto (uno que
apunta hacia una porción ce memona que rosuita inaccesible!.
SN073LK Un orcceso Intentó montar un dispositivo que no es un dispositivo tío
wcQue.
ESUSV 'jn oroceso trato ce montar un dispositivo que ya so encontraba menta­
do o atentó desmontar un íilesystam corrientemente en uso.
E E X IS T En-or retomado cuando se yat3 de crear un archivo que ya existo.
EX9EV Retornado per la llamada l i n k si :us archivos de ongen y destino no se
encuentran en el mismo fllesystem.
ENCDEV 0 oroceso trató de utilizar un tipo ca fllesystem cue e( kernel no admite.
EVOTDO Une de 'os d<rectonos n’.egrantes de una ruta da acceso no es en reaii-
cao un directorio.
EiSOlR £ comparante no /n a re _d e _a rch ¿vc de una ruta de acceso es ur.
nomtire oe director o , no" de archivo.
EV /A l Un procaso :e transfirió un argumento nválido a una liamaoa a sistema,

co.

re
Programación en Linux

Tabla 6.1. Continuación


Error__________ Descripción_____________________________________________________
E N F IL É El sistema ha g.'canzsdo 'a máxima cantidad de archivos aciertos que
puede admitir.

5U= IL E El proceso que efectuó la llamada no ouede abnr ningún archivo m&s
aorque ya ha abierto el máximo número permitido.

ENOTTY Un procoso trató de efectuar E/S de tipo terminal on un dispositivo o ar-


ch.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*).

ETXTBSY *Jn proceso ir.tontó abrir un archivo blnuno o de biblioteca que so en­
cuentra corrientemente en uso.

E F 9 IG EJ proceso ¡lamento intentó escribir un archtvo m is que 10 que permiten


el méximo dol sistemo o 'os límites de recursos dei proceso.

ENOSPC Un fllonyutem o clsoositlvo ostA lleno.

ESP IP E Un proceso Intentó efectuar un ls e c k en un .ircnlvo no previsto para


realizar búsquedas.

EROFS Un proceso Intentó escnblr n un fílosystom de tipo &0.o4oc?ura.


6M LINK El archivo que estó siendo linkendo ha alcanzado la máxima cant-dad
de tinto permitidos.

EPIP E El extremo de lectura lie un pipo esta cerrado y SIGP1PE ostfl $¡endo
ignorada o capturada.

E004J Estableado por las funciones matemáticas cuando un argumonto exce-


ce ei dominio de la función.

ERANGE Estaoiecido por las funciones matemáticas cuando ei resunaoo de la


función 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 La llamada a sistema invocada no se encuentra implementada.


ENCTEMPTY un directcno en el cual se llamo a r m d ir no esta vacío.

ELOOP Una ruta contiene una cadena demasiado larga ce vínculos simbólicos.

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
parágrafo an terior y redactar el código que los adm inistre. La segunda es uti-
hz-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 bién dos m aneras de
utilizar ia variable e r r n o . La prim era se basa en la Llamada de fundón 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 parágrafo.

»' i E je m p lo s
1 La utilización de p s r r o r constituye la m an o ra m ás común do exhibir un
código de error
EiCMPlO • 3 * 1 orocrw u *n lnt«r-«t: «epl.C • /
f
• c r M ’MrPfif C
V
• lrci.aH
<»tauB.r>
•inel’jC* <«rrro.r»

int
(
FILÉ

'.<{¡pf t i » • fopM(*fooe«r*, *r*)) •• m u ) í


Mrror(*fop«na);
•iit(Ex:r_FAiujRE):
} (
fprírttf'itoout, *íA« qu# 9s:« *rcnivo
-c lcjtíp 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 debería 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

Como se puede aereo ar, resulta impresa topen, la cadena transferida a pe -


o* 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 administración de errores en sus programas. La mayoría de
Ies programas que se verán an este libro utilizan perror.
) ) ) )• ) . ; ; ; ; ) ) ) ) ) ) > > } }
Programación 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 código 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 en-
ta r u n a función p e r r o r propia (definida por el program ador), ta l como se
ilu stra a continuación:
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(EX¡T_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 función, 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 idéntica a la del ejem ­
plo anterior, porque a stre rro r 3e le pasó como parám etro el propio valor de
e r r n o . Si el program ador le hubiera pasado otro código do error correspon­
diente a una tab la di: m ensajes propia, el m ensaje hubiera sido diferente.
t I 1 ) ) ) ) J J ) J ) > ) } i i > )
Caoílu'io 6: Llamadas a sistem a 129

Lo que viene
r.n este capítulo el lector ha aprendido sobre llam ad as a sistem a, la in terfa z
e n tre el código 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 código propio. E n los
próximos dos capítulos -e l capiculo 7, “A dm inistración básica de archivos en
Linux* y el capitulo 3. 'A dm inistración 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 código.
7
Administración básica
de archivos en Linux
Efl Linux. casi todo es un archivo, ol monos en térm inos abatracto». E sta ca­
racterística constituye uno de los mejores detalles do diseño de Linux porque
hace posible una interfaz do proifram ación 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 unicación e n tre procesos, canales de
comunicación e n tre redes y h a sta procea*» on ejecución. En este capítulo se
com entarán las prestaciones fun d am en tales de la interfaz de Linux p ara el
manejo de archivos
E ste capítulo cubre loe siguientes tem as:
• Concepto* básicos 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
• Obtención y modificación do la inform ación 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
Administración básica
de archivos en Linux
En Linux, c a s i todo es un archivo, al meno-s en térm inos ¿batracios E sta c a ­
racterística constituyo uno de lo» mejores d etalles de diseño de Linux porque
hace posible tina interfaz de program ación 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 unicación en tre procosos, canalón d«
comunicación entro redes y h a sta proem ua en ejecución. En este capítulo se
com entaran las prestaciones fundam ental es de la interfaz do Linux p a ra el
m anejo do archivos
E ste capítulo cubro los siguientes tem as.
• Conceptos básicos 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 mcdiñcación de la inform ación 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 Programación 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 características 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 programación, e sta p arte se refiere a dichas ideas y nociones
con bastan te detalle.
Como se estableció, la m ayoría 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 incluiría los siguientes:
■ Archivos norm ales.
• Pipes con y sin nombre asignado.
• Directorios.
• Dispositivos.
• Links simbólico».
• 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 bién denom inado aleatorio. Los mismos están orientado»
a byt«*3, lo que significa que la u nidad húmica em picada p ara leer desdo un
archivo y escribir al mismo es el byto, conjunto de ocho bits que tam bién co­
rresponde a la representación de cu alq u ier ca rá cte r cuyo código num érico .se
encuentre comprendido en la tab la ASCII. Por supuesto, uno puede, y habi-
tualm ento lo hnce, leer o escribir m últiplos bytes a la ver., pero la unidad
fundam ental sigue siendo cada carác 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­
mación 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 ker-
nel) de acuerdo a las necesidades del sistem a. Además, como ae v e rá en *.*i
punto "La interfaz de adm inistración de archivos" en este mismo capítulo,
los pipes sin nom bre son referenciados siem pre por un número, 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 línea de comandos do una interfaz, tal como se m uestra a
continuación (los pipes se indican m ediante las b arras verticales [ [ ]):
S cat /«Ci'pass»a ¡ cut -Ci -d : ¡ ha3d -5
sievíPLO
Caoftu’o 7: Administración básica de archivos en Linux 133

La salida del comando an terio r seria:

--------
S A IID A lo
El comando de interfaz de dem ostración 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. Creación 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 pantaliál. 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 ación de
loa dato-? y luego envía su salid a al segundo pipe iir. nombre. E n tretan to ,
luejío 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 líneas do e n tra d a leídas desde e! pipe Luego quo
head recibe todos los datos provenientes del segundo pipe sin nombro, el
k em ei destruye tam bién este d i tim o. En ningún 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 inistración do a r ­
chivos* m as ad ela n te p ara e n c o n tra r detalles).
Loa dwectonos, tam bién conocdos como archivos de directorio, son simplemente
archivos que contienen una Lata de toa archivos almacenados en ese directorio.
Los archivos de dispositivo, tam bién denom inados archivox especíate* o cun-
troledores (d n v e n ), son archivos q u e proveen u n a interfa 2 con la m ayoría do
los dispositivos físicos Pueden ser ta n to especiales do caracteres o de blo­
ques Les archivos especiales de caracteres son escritos o leídos de a un byto
0 carácter) a ia vez. Ejemplos de dispositivos de caracteres pueden se r los
módems term inales, im presoras, ta rje ta s de sonido y rutones. Los archivos
especiales de bloque, por otro lado, d eben ser leídos o escritos en múltiplos
áe algún tam año de bloque (un bloque es u n a porción de datos de algún ta ­
maño arb itra rio pero múltiplo de u n a potencia de 2, por ejemplo 512 bytes o
1 küobyte). 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 térm inos genera-
Programación en Linux

les. los dispositivos de carácter 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 vínculos simbólicos 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 mayoría de las llam adas relacionadas con el manejo de
archivos operan directam ente con el archivo real al cual apunta un vínculo, on
liufar de hacerlo con el propio vínculo (esto se denomina seguir el vínculo).
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 convención que u ti­
liza Linux p ara el tratam ien to de loa archivos -os decir, su hábito 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, liberándolo de ten er que recordar los diferentes métodos do
escribir a los dispositivos do bloque, vínculos simbólicos 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 ejecución del comando do Linux
Chir.od, es un número compuesto de siete dígitos octales (21 biLs en total) quo
expresa el tipo de archivo, sus correspondientes permisos do acceso y la even­
tual modificación de su comportamiento predeterm inado (recordemos aquí que
el sistem a de numeración octal cuenta con ocho dígitos, del 0 al 7 inclusive, y
que cada dígito se puede representar a su vez por tros bits o dígitos binarios,
de la mism a forma que cada dígito hexadecimal se puede rep resen tar por cua­
tro bits;. Los permisos de acceso ocupan los tros dígitos octales inferiores del
modo de archivo (o sea los 9 bits de orden m ás bajo). Los tres dígitos octales (o
9 bita) de orden más alto expresan a su vez el tipo de archivo de que se trate,
m ientras que el dígito octal (3 bita) del centro representa el valor del modifica­
dor de modo de ejecución, que veremos enseguida. La figura 7-2 ilu stra la con­
figuración del modo archivo y sus elementos constituyentes.

StttanbnU
ro a i’2 2 > ? u a '» >S:«3Aí»ntaV*

f* ’rz* -cata íii

U u W Si:

F ig u r a 7.2. Los ¿¿amentos del modo archivo.


C áí*V O 7: Administración básica de archivos en Linux 135

LOS TRES DtafTOS DE ACCESO DE ARCHIVO


Los tres dígitos ocíalos 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 dígito 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 dígito lo hace pora e l propietario tratad o como usuar.o
individual. respectivam ente. Si agrupam os los tres dígitos que especifican los
respectivos modos de acceso, ta l como se lo hizo en el caso de las m áscaras du
comprobación de la tabla 7.1. vemos que u n valor 1 en el correspondiente d í­
gito octal corresponde a privilegios du ejecución: un valor de 2 correspondu a
privilegios do lectura, y u n valor de corresponde a p riv ile g ia d» uacritura
(los dígitos octaies de valor 9 dispuestos h acia la izquierda a p a rtir del dígito
central corresponden únicam ente a las m áscaras de comprobación 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 específicos sim ple­
m ente se deben ju ra a r los valores requeridos do cada columna e n tre si.
Obsérvese que la sum a de los valores posibles p ara cada columna nunca su ­
pera el dígito octal 7, es decir, nunca liega a 8. quo en el sistem a octal se re­
presenta como 10 y obligaría a un acarreo Por esta nnsuia razón, on eau* ca­
so particular tole» dígitos 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 leíble y ejecutable por e l grupo dol propietario y por cual­
qu ier otro usu an o , y leíble/escribible/ejecutable sólo 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 dígito octal (el dígito ce n tral) d el modo archivo es el dígito que
corresponde a su modo de ejecución; 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 ayúscula, por ‘ S tiC K y * , cuando se e fe c tú a u n listad o de directorio con
a opción - 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 ejecución er. pos­
teriores corrid as del p ro g ram a d u ra n te la sesión. Los valores posibles pu­
r a dicho dígito octal son los del dígito c e n tr a l de la ta b la 7-2, que provee
las m áscaras y co n stan tes sim bólicas p a ra ia d eterm inación ¿el tipo de
modo de ejecución. El dígito 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
sólo puede s e r ejacutado como lo especifican los tre s dígitos o ctaies de la
derecha.
) / ) J • } ) f J f ¡ f ) t J ) > •' 1 ' ■'
136 Programación en Linux

N O TA
les bits de moG¡rlcdC¡$rt y do permiso de un archive constituyen máscaras es bits. 0 dí­
gitos octales c -e son mánlpüSados y evaluados cor ¡as íurciones de manipulación ce
bits Ce C. tales como « : (desplazamiento a !a izquierda) y - (comptemento de bits!.
Afortunadamente. Linux provee un conjunto de ^aseares y constarles slTOólícas (ver
cotamna izquierda de taóla 7.1) que facilitan deoosiíicar oi modo de un archivo.

Tabla 7.1. Máscaras para comprobación del modo de acceso de un archivo.


Constante Represen- Modo de acceso que
simbólica tación octal permito determinar POSIX
S_IRWXV 0000703 El propietario o'al archivo cuenta con SI
permisos de lecwra/escritura/ejecución

S_IRUSR 3300400 El propietario dol archivo cuenta con pe'miso 00 lectura Sí

S_I'MJSR 000452OC 0 propietario del archivo cuenta con ©omiso de escritura st

S_£XlíSH 0000130 El prop;eíano del archivo cuenta con pemvso de e;ecvción 55


S.IRWXG 0030070 El grupo cuenta ccn permisos do S!
íectura/oscmuro/oj'ocución

S_IRGPP W 009 4H £1 grupo cuenta can permiso Cu lectura si

S_tWGRP 0000023 El grupo cuonta con oermiso de escritura s;

S_IXGRP 8000010 El grupo cuenta con permiso de ejecución Si


S_IRWXO 3300007 Otros usuarios cuontnn con ponniooo de Si
lectura/uscntura/ejecución

S_rflOTH 000000.» Otro» r u a n o s cuentan con permisoo: de lectura si


s_ í w t « 8000002 Otros usuario» cuentan con p e rn io s de asentuta si
s _ ix o r H 3000001 Otros usuarios cuentan con pormlsos de ejecudC' SI

Tabla 7.2. Máscaras de comproDaclón de la modalidad de ejecución ce arcnivo.


Coíi^tanto Represan- Modo do ejecución de archivo
simbólica ración octal quo permito determinar POSIX
s_isuro 300-1200 Eatabicco 10 de usu3r¡o (UIQ) (modo s e tu id i Si

S JS G ID 0002000 Establece iD de gruoo (CID) ímodo s e tg id » si


s_rsvrx «001 000 Modo pertinaz (sfrcí¡y). Guarda archivo en memoria No
aun cuanco ya haya sido ejecutado, ce modo ce
ganar en velocidad ce acceso la siguiente ver

El. INOICADOR DE TIPO DE ARCHIVO

El indicador de tipo de archivo (el dígito octal de la extrem a izquierda de los


siete dígitos que componen el modo de archivo) es u n simple valor numérico
que especifica el tipo de archivo. Los tipos de archivos adm itidos er. Linux
?on los siguientes:
I i ) .1 ) I ) f I ) ) /

CacxtL'O 7: Administración básica de archivos en Unux 137

• Socket
« Vínculo simbólico.
• 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 l«ctor 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 Reoresen- Modo do accoso quo
simbólica tación octal permito determinar __ POSIX
S_IFWT 0 I7 0 C 0 0 Méscara oara com probación oe cualauier tioo de No
arehrvo <Deoe activados todos los cit3 ooaajios)

SJFSOCX 0140000 Ü arenno o s un Socket NO


S_IFLNK 0120000 0 archivo e s un vínculo simeói-co No

S .'F flE G 0100000 E arcMvo e s convencional No


SXFBUC oosoocc E. arcruvo 09 un dispositivo de Oiooue No

s . zfoxr 00*0000 E «retuvo 04 un OlrectOóO No


s _ ifcm r 0020000 El archivo e s un dispositivo do caracteres No

s _ i f : fo 0010000 0 ircftivo e s jnn FIFO No

U na sección posterior de este capitulo, “Obtención de información do archi­


vos*. ilu stra cómo utilizar las constantes simbólicas 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. ¡Serénese! 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 espués quo
haya leído 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* Tac-
y Steven Burnen), te c e s estos libros p_ol, esees oor Sars.
Programación en Linux

La u m a s k
lector descubrirá en la próxim a sección, “La interfaz de adm inistración 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 serán
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 ejecución de un archivo
Se puede modificar la um ask do un proceso, pero sólo p ara hacerla máa res­
trictiva, y r.o menos restrictiva. Esto se efectúa 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 continuación.
jnaaK(noc»_t na w m h i;

E sta función 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 función umask so complete exitosam ente o no.

E je m p lo
El ¿iffuiente progrnm a de dem ostración 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 naciéndola 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 ocíales

<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: Administración básica de archivos en Unux 139

S . V«_UB*SV
U 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 desactivación 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 ién crea al mismo tiempo, on ausencia
de alguna restricción específica, 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 sean 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 administración de archivos


La m ayoría de las opciones de adm inistración do archivos vienen en dos for-
mili: una que opera con los nombres do los archivos y o tra que opera con sus
descriptores Loe descriptores de archivos son núm eros enteros positivos y
de bajo vaior que actúan 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 información 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.**#, »:at *3uf);
u it f s u t f i n ; fa, a tro cr ata:
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 pn«e
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 código 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 areñivos cubiertas en <esio «Je este capí-
r i o no 'Ciuver 33 r u t o » -e bftsfccteca estároar 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
rkoáo. vea C Prcgra>Tv- Lü^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 i ; / ) ) ,t ) } f / / ) ) ) ) ) > J J J J*

140 Program ación 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=tán proio-
tápadas en < u n i s t d . h>. pero se debe recordar adem ás de incluir en el códi­
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);
:nt 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 parám etro mode con*
deno el modo del archivo, si eg que éste va a se r creado sim ultáneam ente. Se
deben establecer los indicadores a 0_RD0NLY, OJVRONLY o Q_RDWR, quo es­
pecifican accesos do sólo lectura, sólo escritura y lectura/escritura, respecti­
vam ente. Además, 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 operación lógica 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 ospecífico, 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 código a e r r n o .

Tabla 7.4. Listado parcial de indicadores (flegs) de acceso para open y crear
Indicador Valor Descripción
o_ r o o n l y ooaa El archivo so ;ibr<9 so.o paro lectura
C_WRCNLY 0001 0 archivo so abre solo para escritura. Se escribo dosde su or-
gen fie datos
0_ROWfl 0002 £1 archivo so abre para lectura y osentura
0_APPEN0 OC08 Ut esentura de datos so reolüa siempre 3- final Cei arcnlvo
0_RAN00M « 0 10 0 drcnlvo se aore paro ser accodido de manera discrecional
(aleatoria)
o_seq ü en t:al 3020 El arcnlvo se abre para eer accedido de manera sec-jonoai
C_TSM?OHARY 0040 0 archivo es temporario
0_N Q IN H ER IT 0080 £1 archivo no hereon las varlaoles ce entorno dei programa oue
lo creo
0_CREAT 0100 Crea el archivo si este ya no existe
O^rRUNC 3200 Establece d tamaño del arcntvo en 0 by.es.
o le X C L 0-100 Empleada sólo con 0_CREAT. open no abre el archivo Si y3 :o
aühó 0_CREAT
Q _TE X T 4000 0 archivo se abre en modo texto
0 9INARY 3033 0 archivo se abre en modo oinarlo

coniinúa
/ # i ; y ) ) / } ) i ) i J ) ) 1 > )
Capítulo 7: Administración básica de archivos en Linux 141

Tsbia 7.4. Continuación


Indicador Valor Descripción

0_M3CTT7 Si e a«h-.vo en cuestión es jo disoositivo ce terminal iTTV), no se


corve'*jré en 3 terminal de control del oroceso ¡CTTY)
0_MCK3LCCK ¿ore e¡ arc^wo en rrotío no-blcqu*. de -OCO que ur.a ecturg
retomará cero bycas en lugar de un bloque
OjSYNC 'coas •:« escrituras X arcítivo cecen completarse antes de ace retorne
a liamada a sistema
LA LLAMADA A SISTEMA creat
ereat tam bién 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_CñEAT, 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 código de e rro r a e r r n o y retorna • I

LA LLAMADA A SISTEMA C l O S G
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);
do«e cierra el archivo asociado con fd (file descriptor) y reto m a 0 s» tiene
éxito o • 1 si ocurre algún error.

&
É
\ 11

fJEM ?LO
E je m p lo
El siguiente program a sim plem ente abre y cierra un archivo de nominado hola:
/ • .%3acr* ¡3«l en in t e r n e t : fo p u .c */

« r e « t e r e * .» * a t r t \ ) r * / c t e r r t í « a r e n iv o i
•/
#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_0í£AT 0 -RUNC 0 WRONLY, 6-*41 « í ) (


;* v «r ; k u 7 . i ) -
ptrror(*9fl«A*)¡

L
142 Programación 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 aólo lectura
C_CREAT h ará que ei archivo sea creado si no existiese previamente pero, si ya
existiera, 0_TRUNC pone el tam año del archivo a cero, como si hubiera sido re­
cién creado. 0 WRONLY hace que el archivo 30 abra para lectura/escritura sola-
mante. Cuando el archivo queda abierto, c i ó s e procede rápiduraante a cerrarlo.
En particular, obsérvese quo el código fuente verifica el valor de retom o de
c i ó s e Aunque comünmonto esto no ao lleva a cabo, rep resen ta en ese caso
un jerio erro r de programación 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 después, lo que significa que
una llam ada .i v/n*. e reto rn ará con éxito, puro el «¡«toma operativo diferir A
la acción efectiva de escribir a disco h asta h a lla r alguna ocasión m ás conve­
niente. Citando la página del m anual p a ra C ió s e (2):
“La coudiuúQ de error puede (llegar a ; s e r inform ada (recién) en una
operación postenor du e«enturn, 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 pérdi­
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, s¿Z8_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 leídos 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 núm ero de
bytes leídos desde ei archivo (0 indicaría u n a condición de EO F o final de a r ­
chivo, E sta cantidad puede llegar a s e r m enor que el núm 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 . Después de una lectura exitosa, el puntero de archivo será
avanzado la cantidad de bytes efectivam ente leídos, la cual no n ecesaria­
m ente será igual a c o u n t.
Capítulo T: Administración básica 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 bufíicr
señalado por ov?. U na operación exitosa de e sc ritu ra recom a el núm 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 código 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* <*ifíiitd.í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 : «1 ir « iv o /fl#v/rolí •/
tf(:c* scrio tC r_ fiu U * G e« rt(* /aeW ftu ll‘ , 0 _ * fi0 \i.v )) < 3) (
p ierzr('ct*n m V /nuil’);
c lM e {c * * c r iíM f_ f« « o ta ) ; / • C « r r a r e s : a a r c h iv o , ya $ue lo Itaoianas
a s ie r r o */
5 X lt(s .x rr_ F A !!.llR s);
)
• « 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 i=ctür3_oicrLcura.c. ’
• 1 v é 2 - ; £ - : * i s i r -.asta ? s y r e s jn l e v / n u l i •/
»r.ilí[(/iua_Dytss = *e40(C6Scripto-_íu#«ía, Cn 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 < 0)
) ) > ) ) . O } } > ) ) ■ > í > j ) > ) J

144 Programación 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 obsérvese 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 mayoría
do los dispositivos como si fuesen archivos. La terminología e stá n d a r que se
utiliza para m an ip u lar archivos convencionales se em plea tam bién p ara
adm in istrar diapoaitivoa y otros archivos especiales. O tra característica del
program a es que cuando escribe al archivo de disco denom inado /tm p / fo o •
• b a r, escribe sólo h a sta n u m _ b y te s caracteres, lo quo evito que se cucriban
bytes carentes de información 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 sólo 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 posición de! archivo, deberá po­
der canto doteransnar la posición 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 propósito 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 posición situ a d a a
offset bytes contados desde la posición especificada por w hence desde dón­
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.
• SE£K_CUR establece la n ueva ubicación del puntero a o f f s e t bytes re­
lativos a la posición 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 posición del puntero, o 3i tuvo
lugar algún 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 .
Cacítulc 7: Administración básica de archivos en Linux 145

O \ 'r . E je m p lo '
^ El siguien te ejemplo lee 10 by tes desde el archivo de ingreso de d ates des-
pués de s itu a r ei cur>cr en diversas ubicaciones del archivo.
t JC M P t O . \oozr* o e l a r e ñ ir a s r s«=>:.c
{•
• 9-o-c - Utilización 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 >
« tálese <5*dLü).i>
<fc.Ttl.h>
íio :ltí9 <vftLSW-fw
l n t zain(*o¿C)
í
c f a r a< -ctíivo _ t« 3 0 0 rir‘ o ( [ - 't s c x x x x x x \
cftif 0ufp«I;
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<*(Jl»po*ttt«0».tAf, Q_S0QNLY)) < <l) (
cwrrcrCicer. cu ooíitivcs.txt*};
» x ;t í£ iI T
>
/• C r«ar 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 función 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»?aol«cer la uoicacton I n i c U l <Jfl- puntero an *1 archivo no «ntn<in •t
¿ M « H (0 tse fS p tsr^ in trM t, 1 M , 3£5K.5£T);
/•
• 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{54scripí2r_*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); l ‘ S a lt s a r s n l e s 90 o y ts s
r e s t a n t e s Ot U s e r i a c « ~ !M ’ /
>
•::o5=(asscnptoj’_éntrss= i;
: lo s g í d es c - i c t o r _ i a i 1 « s >;
íxít{£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 código fuente de esto
capitulo. A dem ás, en lugar de asigruirlc u n nombre cualquiera al archivo de
Programación en Linux

salida e incluirlo en el código 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 específica del program a) on ol directorio corriente. Después 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 ejecución del program a, aunque siem pre
comenzará con tmp r por lo que luego de correr cada instancia dol program a
se debería 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:

El siguiente comando de interfaz noo perm ito ver el contenido do tmp


s a l ió a t j CXQN, cuya corrección podemos verificar leyendo en un editor de texto ol
program a original d e v i c e s . t x t (loa ««pación tam bién 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 sólo 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 cómo 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. Están 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. Recuérdese 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 están 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é podría una desear acortar un archivo utilizando -ana de estas llam a­
das? Una razón típica 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 más 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 trúncate 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 .
Capítulo 7: Administración básica de archivos en Unux 147

E je m p lo
El program a tru n c a r que viene a continuación es una utilidad que resulta
práctica p a ra aco rtar archivos. Acepta el nom bre do! archivo a s e r acortado
C JtM P lO 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, longítuC
•/
»toe lúa* t»tdi5.í»
« 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 ISA»t S4 tcoanoc3. n itn tra » qua **rgv es un our.:ero cufl •/
• ivA a ia •: orige-. #r> o««or: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 noaür* <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 WILÜW);
}
a*¿t(£XrT_SyCC£SS);
>
La ejecución 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 - - 1 «urr_* 2i l u S * ri 5656!J u l 2-i55:56 t a s t . t x t
\ ^ . \ r 5 tru cc t c a t . t x t 22C«
____ S iS -1 t i í t . t x t
5 A lio * r r - ! *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 fundón s t r t o l p ara convertir el texto del argum ento que es-
peeñea. la n ueva longitud de- la caden a a -on entero de tipo lo n g . Después 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 ejecución del mismo term ina
sin em itir ningún 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 válidos. L*n program a con la calidad suficiente
. y ,/ / . j I f l ) > ) > > } 1 t

148 Programación en Linux

como p a ra em plearlo sin que genere so rp resas debería 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 válido. 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 bién se puede obtener m uellísim a información in teresa n te sobre
un archivo, como lo m u estra el comando s t a t (1):

.p e : flc g u la r = ¿ le
----------- Ucda: ( 0 $ 4 í . ' - r w - r - r - ) U id : (S«a/KUrt_W 3il> G íd : | 1M / u s c r s )
SA L,D A Cc v í c í : 3 , 2 Inode: 53 4 555 U n ks: I
A c c e s s: 3 3 t J-j í 2-t 1 6 :0 2 :5 0 tW 9(W ¡M « .0 0 :1 5 :5 6 1
Wodtíy S a t J u i 24 ’.6 :« * :2 9 19 9 9 ÍW 3 3 0 .00: U : 5 7 l
CTtang# S a t Ju L 2< I6 :0 « :Z 9 i g 9 9 !3 s 1 0 0 0 .M :U :l7 )

El comando S t a t lee información de u n a serie de nodos de información de


archivos denominado? cada uno <1*! ellos inode o nodo-i. y se la exhibe al
usuario. Aunque loa detalles específicos exceden el alcance do esto libro, lo-
inodes son e stru c tu ra s do datos que el kum«l m antiene p a ra cada archivo
p resente en un filesystem . E n tre o tras cosas, los mismos contienen inform a­
ción tal como el nombro. ©1 tam año y el propietario de un archivo, la fecha y
hora en quo fue cambiado el inode, accedido y modificado el archivo, su tipo
y :uántoa vinculo» simbólicos existon hacia el. El comando s t a t del ejemplo
lista todu esa información.
Existen tre s funciono* p ara o b ten er esta información: s t a t (estadísticas).
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 código fuente. Sus prototipos son los siguientes:
inr. it a t ( c e < is t ch n r •M lín 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 información 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 código ad e­
cuado e r r n o . Lu única diferencia práctica en tre ellas es que l s t a t no si­
guen los vínculos simbólicos, 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 ; V* d i s p a s i u v o 'I
:n o _ t J t _ i n o ; / • nu.noro a a in o o o •/
w > a a _ t ic_nc-cJ; r wcJO t fa l a rcnivo •/
a lir .k ^ : s t j U i n k , / • lu n e r o d e m e o s ¡Ju ro s ’ /
■j¿d_t s t_ u ld ; /• UID aei p r o p ie t a r io col a r c n iv o •/
5 ic _ t s t j i o ; /* ¡jIO a e l p r o p ie t a r io a e l a r c n iv o " f
attv_z s~ "d e v; )• u p o ce C i s o a s i t i v c •!
s t _ s iz 5 ; I ' ta ñ a ra t o t a l sn b y tes
' ; ) i ) ) )

Cap'v-.’o T : Administración básica de archivos en Unux 149

’ 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.-; oueero i e blesues oe S12 sytes V
: ik / . * fifia /' c*e 5 * 1 u I t in o acceso c e ! a r c h iv o • /
:ice_t 3t i : i s í ; • n z " i ¡ r-ora a la uLtiaa rcdificacior del arcnivo */
:i=5_: st_ sti« e; • 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 año preferido de bloque p a ra la E/S


del filesystem . Si se u tilizaran bloque m ás pequeños podrían 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 bién cam bian la
últim a fecha de modificación, 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 vínculos c in ­
formación de modo de archivo.
M ediante la información contenida en la e stru c tu ra S t a t uno puedo imple*
m eo tar su propia Punción s t a t , como lo m u estra el program a do d em o stra­
ción de la próxim a sección.
Ei lector puede tam bién em plear v a n o s macros que le perm iten obtener in ­
formación 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 comprobación de tipo de archivo.____________________
Macro________________ Descripción
S_ISLNX(eo<J«) !>íwna verdadero ni el archivo es un incuso simbólico
S ISR£G(«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 ostración 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 >
Programación 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 línea de cc*ando;


el armero « « m propio noubr» del archivo •
o u t i(auooo oe zw ito: nstat Mowae oe aachivO ');
•*lt|B«T_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 [* ViNOíiOS: 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 | ;
HtíS_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(:ip«j3e_arcniva, 'Dispositivo ae bloques*|;
alse LÍ(S_ISPIFO(uodo))
s-rcay<t:co_de_archivd, *f : f o *|;
else if(S_i3$0CXjncía)>
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í?U¡O 7: Administración básica 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 CSLOOüeS: * 3 \n \ c u f it_2 i-5 C '.s };
:>ri»tf(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í_so¿3
AACWflfO: ItLnlli
2574*
DISPOSITIVO: 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
ACC€0:0C: Sa t J a l J 4 1 6 : 1 8 ’ 15 tW fl
UCO.'FrOCC. Tt* Mr 23 '9:34:26 :9 «
:v»e «MlfrCAOO: Jui V 16:22:29 1999
El código 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 cómo u tilizar la fam ilia de funciones s t a t D espués do hacer que l s -
t a t recorra eí archivo p a ra recoger inform ación, el program a exhibe el valor
asignado a cada miembro de la e stru c tu ra de patrón 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 debería on realidad h ab er sido
confinada a una fundón), 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 sólo los
bits correspondientes a les perm isos y a Ja m odalidad de ejecución.
El código u tiliza tam bién la función 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
fácilm ente. Como en el caso anterior, e ste program a necesitaría 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 confección de un program a m ás elaborado.
E n particular, se podrían agregar porciones de código p ara verificar que el
nom bre de archivo ingresado sea un nom bre válido.

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 í capítulo, ei lector e n co n trará u n a sería de funciones que
modifican la información 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­
/ ) ) I t .1 J
152 Programación 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 circulación.

MODIFICACIÓN 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 erécíuó
ia !iamada posean los derechos correspondientes. Sólo el usuario root y el propie­
tario del archivo pueden modificar los permisos de acceso de un archivo, cfvncti y
?Ch“Od se hallan prototipadas en < u n i s t d . h> de la siguiente manera
mt crrsdfconst char 'catnniíe, 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 código fuente del program a.

E je m p lo
Er. este program a :io eren un archivo vacío con un conjunto de perm isos y
luego 3e utiliza f chmod partí m odificar dichos permisos.
r sonore del archivo *n Int*rn«t; 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, < o; {
perron *0330*1;
exie<EXIT_FAIUIftE|;
)
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: Administración básica de archivos en Linux 153

«*ÍC(EXl7_FAllüR£|; '
>
* Zcr-^r 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 */
W t M t 'i s - i i r c ’i i v o . / a c i Q ') ;
•*1? CEXI~_3UCC£S3),
>
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 . . r . t k-j«*t_»all u s flr s 8 J u l 24 2 0 :< 7


^ M C ty .f ll*
. ' • i r - * - . * * « ijr;_ * a li u sarj j j u l 24 2 3 :4 7 « « o f / . f i l i

Se puede v er claram ente que el archivo tiene un conjunto de perm isos in m e­


diatam ente después de su creación, y otro conjunto después de la llam ad a a
f c ^ r o d . D espués de h ab er sido creado este archivo, c a m b ia r ^ p e r m is o s
emplea la función 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 función 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 capítulo,
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 decisión 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 situación yo p referiría u tilizar f chown porque re ­
quiere m enor can tid ad de tipeo.

E je m p lo
El siguiente program a crea un archivo y luego modifica su propietario. Ob­
sérvese que p a ra que el program a funcione correctam ente, debe 3er corrido
L0 por ei usuario root. Además, se d eb en reem p lazar los valores asignados er. el
código fuente a i propietario y al grupo por valores que tengan sentido p a ra
' i J ? ) i ) ) ) ) i y )

154 Programación 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 código fuente.
!• nocftrt col prograna <¡n [n-.^rnet: chgoon.c */
r
• c3oour_orooi«tario.c - Crea un írcftlvo y itodifica $o propietario y ;ruoo
V
«Wcioae <3táli0.^>
#tflcluc* <3MiO.!>>
«Liciufl» <syi/»tat.n>
#lndufl« <3y#/typ»9.n>
•toclutfe «fc n ti.h »

tnt nain(v6t<J)
(
uld_t prooletario • 56#¡
g:a_t grupo • too;
tnt d*jcriptor_archivo;

I ' Cr«ar « l archivo •/


if|< a e jm p to rj»re fU vo • opon<'nuevo.archivo’ , 0_CR£AT. a«44)) < ¡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_SUCC£SS);
}
SI resultado de u n a corrida de p rueba del program a fue e! siguiente:
5 su
P M »o n J :
s ./c¿nsiar_propietario
- r • - r - - p • - i raat ro o t 0 J u l 24 2t :n
nuevo. archivo
- r ■• f ■ c • - 1 ku rt * a ll users 3 j u l 24 21:11
nuevo.archivo
i exi:
Como se puede apreciar, el program a prim ero creó el archivo. £ n la corrida
do demostración, 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: Administración básica do archivos en Unux 155

del grupo root, respectivam ente. La función 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 cómo tra b a ja r
con las llam adas básicas de manejo de archivos en Linux. El próximo c a p ítu ­
lo extiende este tratam ien to do la adm inistración do archivos cubriendo m a ­
terial m is avanzado sobre tem as talos como el filesystcm ext2, muHáplexing.
E/S non-bloquaante. archivos m apeados en m em oria y bloquoo do archivos y
registros. Esto com pletará la discusión 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
Administración avanzada
de archivos en Linux
E ste capitulo continúa coa el trata m ien to de la interfaz de adm inistración
de archivos en Linux que comenzó «n el anterior, pero cubre características
m ás avanzadas.
E ste c ap itu lo c u b re lo» sig u ie n te s usm as:

• M anipulación de la fecha y h o ra con que se guardó ol archivo ln ú ltim a


Vét
• 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 núm ero de ISBN 0789722151
Programación en Unux

Modificación de la fecha y hora


de creación y edición de un archivo
Recuéntase del capítulo 7, “Administración básica 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 modificación (n tin e ).
y la últim a fecha y hora de modificación 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 programación 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 bién a c tim e , de
modo que dicha circunstancia no representa ningún inconveniente.
La función u t l ^ e e stá prototipadu en < u tim « . h> de la '.iffuiente m anera:
int utír»(cons: :nar •MthnBn.?, struc: utiRüuf •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 incluían
< 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. añada ei archivo de encabezado < s y s / t y p o s . h> en su código fuente, pe­
ro :iólo ai verifica previam ente que el mismo declara el tipo de datos cuya
definición no encuentra ou compilador, u tim e modifica la fecha y hora de ac­
ceso y modificación 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 algún 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 ejecutándose 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, /• nadiíicanwi tina */

ti.T ie_t es un tipo están d ar de POSEÍ, generalm ente un entero de tipo


io n g , que alm acena el núm 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-dv’sód 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 l¿7.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
Capítulo 3: Administración avanzada de archivos en Unux 159

ü<5Jestos. en C9Ú-3 arto ftsy 3c5x2£x5Cw60. o sea 31.53S.COO. segundos As' que t i -
- 0 _ t n^0O3 aJmecery máximo do yrn&taor de 63 años ’2.147 483.547 /
3 1 536.000 . Co<no ? £'= ' W i n r a ín í ¿i*o 1970. ««mándale 63 aros 3t nt:&-rrci 30
3 1-.-3 3 ) .-^0' 2038-1-3 ■
Cecra y hora exacta en 13 aue «seo-dará varia, doo<^-
s .i^ vío «Je cuántos segados existan en catía año 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 código
fuente la verificación de errores.
r Kcwrt u'u a ^ 'a * » ir íntacret: emjtu<» = V

• c*tfiLar_f*c«y?fli*i-í - Utilización 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<hl»o;

^jf-sctia* = <*•>;
Daf.ncctiac 1 no»;

S«cri;tc.-.srcnivo = 0Mn( ‘feo-oar*. 0_CSEAT, ü$4<;i;


yriMi'fo-s.Mi". íeo í );
cicii'.c=scrip’ :r_arcftt»Of:
ix ii (E*!T_$2£C€SS};
}
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 ui«i*s 0 Sa? 3 2¡»1 fco.oar
Como se puede apreciar, f 0 0 . b a r exhibe la fecha S eptS fiiber 8 , 206 \ .
Después 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 actúe sobre =i mi^mo. transfiriéndole lu dirección de la es­
truct u r a nc<üñcada y el nombre del archivo. E sto ocasiona que sean m odiü-
J , ) ) ■ ■ ) ) • ) ) ) ) ) ) ) ) } ) t ) 1 1 I
160 Programación en Linux

cadas ’t a últim a fecha y hora de acceso y ta ú ltim a fecha y hora de modifica­


ción (a c tim e y m odtim e, respectivam ente) al valor especificado (y ¿ltam en-
Le im probable p ara u n sistem a cuya fecha y h o ra estén bien configuradas
Características 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 modiñcable) - e X T 2 _ I M M U T A 8 L 6 _ F L
• Append-only (Sólo 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 (Sincrónico) - 6 X T 2 _ S Y N C _ F L
Sólo 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 párrafo;? 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 vínculos hacia «líos. 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>
sólu en modo cppcnd y no pueden ser eliminados, renombrados o vinculados
• El .itributo no-dum p haco que el comando dump, utilizado habitual-
m ente p ara croar copias de seguridad, ignore el archivo.
• El atributo sync hoce qin* el archivo sea escrito sincrónicam ente; es de­
cir, todas las operaciones de e sc ritu ra al archivo deben com plétam e a n ­
tes do ro tn m a r al proceso que efectuó la llam ad a (esto es idéntico a lla­
m ar a op8n con la opción 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 críticia. El indicador
append-unly preserva el contenido corriente dol archivo pero continúa perm itien­
do que se le agreguen datos; de nuevo, una práctica precaución 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,
práctico p a ra g a ra n tiz a r quo los archivos críticos, tales como las bases de d a ­
tes, sea n realm ente escritas cuando se lo solicite. El empleo de la opción
■■¡ync evita pérdidas 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 físicam 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 peño 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;
) ) ) i ) ) ) ) ) ) ) ) > } 1 ) y i • )

Cap-'tuio S: Administración avanzada de archivos en Unux 161

La atrib u to s están 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 estén 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 Extensión. 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 legu-
ramente 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 rodéanos con # if 3 9 f3 aarg
su tóófco co^-cmj y coenj 3O«CiOCameir.0 en 3*3térras cue ro sean Unux.

E je m p lo
El program a de dem ostración que v-.ene a continuación 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 < ltíli.í>
fl'K lv ec «cn?l.i*>

•laclad# < sy s/ia c tl.h >

UK M lfl|tflt » ^ íí. cft»r *>rgv[!l


(
ürt S6SCPio:cr_ircí'ivo;
Lm $ irtdic*ío.*u.

• S: U . I üucí ¿5 yicarreítí. enniCir U sintaxis Mecuaaa •/


l í t a l e :• 2) (
;u ts i‘iiCCO D£ iüP’.SG. activar_í*t2 {nondra la archivo}');
«»lt( EXIT_PAIUJft£J ,
}

i í | ( f c * cp e n (a r 5v ( i j , C_30C*fc.Y)) < 0 ) {
162 Programación en Linux

•xit(€x:r_fA iujR E );
>

• Estes « n los indicadores quo actlvnrenos


maleadores = =XT2_5YNC_f:'- ; EXT2_«00üW»_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«(tíftscriDtor_urcriivc):

iM io a u w o rn * \ =xr2 _sv»c_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 ostración de activar_oxt2 arrojó el siguiente


resultado:

• TCO

salida s , ac:ivar_cxt2 roo


Inctcaaor SYNG activado
Indicador \0 DiMP ictivaoo
i Is a ttr roa
. . . s - - o - roo

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 espués 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, asegurándose de c errar el archivo abierto si ¿a
llam ada falla. £1 últim o bloque de código 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 ostración vuelve a confirm ar esto.
Ca&'tuto S: Administración 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-omitíarente. c h a t t r re cerrrurs
a yno K tü ü e e tr tos ¿".nüutos «Dedales. rr>«ntr3s au« I s a t t r « r ib e 0 3 atributos
« ? K ?'»3 *>t2 que estén activa*». 31 tos fcuOtera. E - 'a corr oa de demostración 3sl
DTOgrama arorior. (a S mayúscula rtíica cuc el atributo 0CT2_SYNC_Fl. (sy«C) ha s-do
*s?vad3. y 3 tí rrarOscuia nxiica <?je » atrQuto £xr2_f«30UUP R . támtsén na sido oc-
óv*}Q. Ver man c n a t t r y !»an I s a t t " para ootener"-né3 ¿e:a7-es.

¡ ¡ E S E E S directorios
Aunque los directorías 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­
ción 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, cwdecu rrtn t w orking dirretory). declarada en
< u n i s td .h > Su prototipo es el siguiente:
cnar •g#:e»c{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 raíz, 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 ocurrir-
le eso. aum ente el tam año 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 dinám 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 fúgaa 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 cftfltrfcoftít 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 métodos re­
cién comentados, de asignación 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 */

• «ir_ M r* ’i«ftW -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 Programación en Linux

¿uvcliide <«rno.h>

« 4 f L ie *¿MU¡0_S¡JF
in t n a in ( v o i¡ll

{
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 •/

- t 'i l - ( ( g » 'c # 3 ¡ 0 u f _ s s t a t i C 0 . L * TAMAriOJUf)) = MUU| \

buf_«Jtático* 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 corríante 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* d«Dü liBora'* tiuf_nulo pura prcvonlr una fuga da nMorta *1
fr«iiX jf_ n u lo );
-U t(E X tT JS u C C £S S );

)
La salid a de este program a tieno a n aspecto sim ilar ni sigusonte:

” £1 d lrs c ío rlo corrlsnte as ,'<Jsraocai,'n**pr3lactS/lpe/«0/jrc


s a l id * N u«vM «nt«, «1 directoría 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 año asignado, h a sta
que g e tc w d retorne no-NULL. El segundo bloque de código ilu stra el empleo
del com portam iento alternativo de g e tc w d . Em pleando en g etcw d un tam a-
do (sise) de buffer de • 1 y haciendo el propio buffcr igual a NULL, la llam ada
a g etcw d seguirá teniendo éxito porque dinám 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 .
)
> ) ) ) ) ) > ) ) , \
) ) )
Cóc t j ’c 5: Administración 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 <íT2ÍO.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¿

•<ttl£x:r_SXC€SS);

)
* “ 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 bsérvese 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-in-
te ría 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
línea ¿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 códi­
go fuente tan to < f c n t l . h > como < u n i s r d .h > ; r m d ir requiere aólo
< 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 Programación 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Ü/ l El prim er program a orea un directorio cuyo nombre es transferido como
ü=X único argum ento del mismo,
ije w p u o *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: ■VjíVO_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>CC£3S>;

Esto es un program u sencülo. UtUiza perm isos e stá n d a r (lectura/escr-tura/e-


jecución 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­
pués de im prim ir un m ensaje de error. Por lo dem ás, no se efectúa verifica­
ción de errores por razones de legibilidad del código La salida del mismo,
que se ve a continuación, m u estra cómo funciona:
/- 5 ./nuevo a ir foo

\7V7- 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
SALIDA

\ I/ 2. El siguiente program a elim ina el directorio cuyo nombre le es pasado co-


1í / f 3 ) mo su ú ^ co argum ento.
/ ■=! r v in o re 25i sragraita i r interne t: d e ld ir . c */
ÍT I mT lÓ
• e lir .m a r _ ijir .c - E iin ir.a ur. d ire c to r io
•l
♦induce <cnist3. - >
Cacítij'o 3: Administración 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 •»r¡vL¡)

(
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 i- to 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 básico 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
leído 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 están declaradas en < d i r e n t . h> Sus prototipos son
los y ^ u ien tcs:
o :: •^iy¡ir{cor^z cnar «patrnuM );
st^uc? « ic e r» «rsadairiO M '<3ir|;
in t rniroúiriOlñ *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, después 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-
, , ) ) ) ■ ) ) ) ) ; ) ) ) ) ) ) > > 1 > '
168 Programación en Linux

torna 0 si tuvo éxito o -1 si tuvo lu g a r algún 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 algún error.
readdir es la que lleva a cabo la mayor parte de la determinación 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 patrón 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 señala 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 tíirtnt /• datos «atenidos <3e getdíntaO y reacdlrf| •/
(
lt»d_t d^lro; r nwero inod? oc la entrada ae directorio */
off_t /* distancia rolatlva <oífs«t) d- la entraoa ae
air«ctorio V
•C^ai-_t d _ r « li}f l; r longitud de esto registro •/
ctn r a.n 4 n (»¡'W^_LC«O_'<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* sts-
renvjs <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 conüonon pooco
.annr oc .n •••itcma i o>ro. Algunos 'llosyíKems. pa* eftmpo, oún '.'mitán los nonhrtv. de .v
c ív a » a 14 carachos, menlras une oíros. co>vo Lnux. potmtten hatía 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 línea 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 . Sintaxis: l u t a r d ir notónj
directorio

•include <stdlo.h>
♦ incli/Ue < 5 * d lib .n >
«inciudo <air«flt.n>

voia ia lir_ ji_ ir r o r(c h a r *nnnsa]eJ;


;nt oain (iüt arge. cfar •argvJI)
(
o.'fl *dir;
struct dirent « n i j U r m ;
m 1 * t¡
ifla rg c I» 2 } {
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 } ’ );
«x it'S X tT PAII.ÜR:);
>
) ) ) ) ) ) ) ) ) ) i ) ) ) > ) ) ) ) ) > > ) )

Ceofajío 3: Administración avanzada de archivos en Linux 163

i f H d i r * a c « .id ¿ r (* r g v [lJ )) = n u llj '

á ? iir _ s i_ s r r o r( ’ jM n t lir * );

• e iI = í( B i_ < J if « r tt = * í a - : c i r . ; d i r ) | 1- KVL'.I
i r 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 núcleo de oste código. El mismo llam a ropetirin-
mcnte 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 iteración imprime el nombro del archivo (m y d íre n t ->d_name)
La siguióme salida ilustra el comportam iento de l i s t a r _ d í r
S ./Li«t*r_dir
t : .
2 t ..

« IÜ da 3 ;
* : KtKtflU
i : c*aoUr_f*cftyfw».c
! : Capitulo W .n p
? • dtr_corri«rrtt.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 idúplexing 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 ultáneam 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 Programación en Linux

que abastecen a cientos de usuarios de form a sim ultánea. A unque concep-


tualm 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 opera-
dones 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
condición com ento. Su prototipo, presente en < u n i s td . h>. es el siguiente:
mt i«l«ct(lnt n, fe_set voacídj, fd^se? '■ntofds, fd_s«t 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 leídos. 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 leíbles y los archivos que presenten alguna condi
d ó n de excepdón 'ta l como un error), uno llam aría a s e i e c t como siguo:
fo_aat *writ»*Dl«_fds;
i#loct(njxfO S, NUIL, «ritífO S , NULL, 1 » |;
El parám etro tim e o u t determ ina pi>r cuánto 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 operación 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 operación 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 algún error, le deberá
tran sferir a tiw e o o t el valor NULL, em p leán d o la misma sin tax is m ostrada
en el ejemplo situado arrib a de este párrafo. 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
leído o escrito, respectivam ente, o h a s ta que se produzca u n a excepción.
El primer parámetro, n , condene el descriptor de archivo de número más alto en
cualquiera de los conjuntos que vienen siendo morútoreados. más i (el programa
de demostración 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 también invalida codos los conjuntos de descriptores y timeout, de
modo que uno tendrá que volver a asignarles valores válidos antes de reutilÍ2 a r­
les. Si ia llam ada a seiect tiene éxito, retom a ya sea el número total de descripto­
res contenidos en los conjuntos de descriptores {no-NULL) monitoreados o 0 Un
valor retomado igual a 0 signiáca 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.
Capítuío 8: Administración avanzada de archivos en Linux 171

L?. imple mentación de s e l e c t e m b ic o incluye cuatro ru tin a s de m an ip u la­


ción de los conjuntos de descriptores:
? D _ Z £ » j; * C _ S 5 T ' M t j ; .

P5>_5PfiM «_s»t «jít};


f?. 'jc ti;
F0_;S3€T(tnt ffl, #í_í«t *Mtt5
Las m ism as oporan de la siguiente m anera:
• FO ZERO vacía (tnidaliza a coros) el conjunto set.
• F0_SET aáade el descnptor fd a aet.
• FD_CLR elimina fd d i M t
• FO_ISS£T 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 acción. Si fd sigue presento
en set, su condición varió d u ran te la ünm ada a s e l e c t {su correspon­
diente archivo tiene bytes a ser leídos, 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 condición 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 leídos leí program a de dem oatración
utiliza pipes porque los mismos constituyen la m anera más 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 más sencilla de u tilizar el program a m u l t i p l e x soa cons­


truirlo utilizando el m akeñle 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 código fuente ¿e este program a es el
siguiente:
; ; j ) ) }? ) ) ) i ) i ) ) ) .) ; ) > ) ) >
1 72 Programación 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 destíe 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 ríX Trsan. U t iliz a a o con o i consentiruento
• de lo 3 autores ¿e lú iu x A a p líc 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_ * rríir(c íT a r -mensa¡n);

in t aatn(void)
(
m : d « 5 c r i_ a r c .ilv o I 2 J; / • A r r o ll o ce d c s c r ip to r e o de « rc n iv o •/
cftar b u f( ’ Aj*A«o_Büf];
: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« aeran
lo ic o j */
fd _ so t p en d ien tes de lo e tu r a ; / • C opla de c ; t o o o se rs a ara <}u# la
a c t u a lic e s e la o t •/

r 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)_S£T(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 ) ) ) ) f ) .} ) ) ) ) J > J i
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 173

• s i r* c c r-s .* 5 y o tr3 vez s i la z o o ie n trs s a g u srd a poder lw r de


lo s Í^ 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_d»3crs) 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*dlení9S_d9_lecttjra, NULL, NULL, NULL| < »|
s* llf_ sijK T 8 r ( * « • ! • « • ) ;

/ • iCaal srcAivo esta lis to para 39 .- Leído? •/


f o r a • 9: i < 2; — 1) {
:f(TO _iSS£T((jescrs_arcntvotiI, So*M ientes_de_lKtura)) (
contador etrtcztres « r«ad(d«scrs archivoft|( buf, tamaño 3U*
1)2
if'ccf»tador_caracteres * « ) l /• Se leyeron datos •/
&>."?{coi«adcr_caract9reaI ■ 'Vfl ;
orirtt*(*Letdo: < t‘ , ouf»;
} else ir|contador_caractere» *» 0> ( /• Lsctura terreino Cerrar
este sioe V
close(ce»cr>_arcnivo[ 1 1 );
FO_cm(desc.-s_arcniyofl¡, 4c’ to_descr» 1 ;
> else"
salir„si_arr9r(*read *}i /• Ocurrió algún otro error que no
concr®tar«*e» */
)
)
}
*xit|£XIT_SuX€SS);
>
í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 ip«s 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_Z£RO, 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
iteración 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 ersión 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.
> f } / ) • > ) > : ) ) ) ) ) ) ) )

17S Programación en Linux

Tabla 8.1. va/ores p o só les para el parámetro o r o t de fflnap.


Valores de prot Descripción
PROT SONE No so permiten accesos
PROT READ La región mapeada del archivo ouede ser ei(33
PROT W RITE La región rrapeada del archivo puece sar escita
PR0T_£XcC »3 región maceada tíel archivo puecíd se' ejec-taía

N O TA
En la a^ortecr-ra x85 PRO" EXEC representa también PflOT REAO. de moco cue
PR0T_EXEC equivale a especificar PRCT JEXEC ¡ PR0T_READ.

Tabla 8.2. Valores posibles para el parámetro f l a g s de mmap.


Valores de fíngs Descripción
’.IAP ANOKYMOUS Crea un mapa anónimo, igrorantío a fa
UAP FIX EO Falla 31 la dirección es ¡nvdllda o yo so encuenda en uso
UA3 PRIVATE Las ooeracior.es de escritwa a la región oo memona son priva­
tivas del proceso
UAP SHARED Las operaclooos de escritura a lo región do memoria sor, ca&ig-
das a un archivo
MAP DENYWRITE Ceso de permitir oscrUuros normales al archivo
«A ? GROVfSOOWN incrementa ln momorta en sentido desccntíonte
MAPJ.OCKED Bloquea p e in a s nn memonn
o f f s e t es habitualment© 0 . lo que indica quo todo el archivo debe ser ma-
poado en mem oria. U na rogión 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 modificación a la
región 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 actualización de ia región de m em ona ocu­
pada por la im agen del archivo, sea inm ediatam ente visible p ara todos los
demás 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 anónimos, creados
con U A P _ A N 0 N Y M 0 U S , ao involucran un archivo físico sino que sim plem ente
asignan mem oria para uso privado del proceso, ta l como u n a im plem ento-
ción 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 dirección específica de m em ona. En este caso, si
la dirección ya se encuentra en uso o no se h alla disponible por alguna otra
razón, mmap fracasa. Si M A P _ F I X E 0 no e sta especificada y la dirección 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 pnvile-
gios root bloqueen la correspondiente región de m em oria de modo que nunca
sea p erm u tad a con su contraparte en disco.
Capítulo 3: Administración avanzada de archivos en Linux 177

N O T A
- ; s pregrar - = s y t \& := r.o - c aueden u tilizar '¿A F J .C C K 5 D . E sta = s una ca ra cte rística 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 cíe s e n fc íc l.

SUPRESIÓN 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 región de m em oria al sistem a operativo. E sta fun­
ción 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 región 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 señalado por s t a r t o casionarán u n a falla de segm entación (la
señal 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 función mur.map retorna 0 si tiene todto. Si fracasa retorno • 1 y asig ­
na a e r r n o el valor adecuado.
E xtraño como p uoca renultor, munreap punde fallar por una serio do razones.
La razón m ás común es quo S t a r t no a p u n ta verdaderam ente al comienzo
de la región 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 tyc«s.n>

•laclvct «sys/stac.n»
i i x h a t «vrustc.rw
«iitcluoe <fcntl..*v>
*LT'l¿2a «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
Programación en Unux

ir ; Ge3c-ijnor_4rcf!ive:
v o ta t .j o :

3 tru c t s ta t s ta to u f;

/• A c r ir #1 arcn ivo a 3er upeado V


if<argc I* 2) {
pu:»C«OCO oé íUPtEO: r-jooar {no«jre ú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}

s»L ir_íi_irror(* op *fl*);

/* 0BT«n«r la longitud d«I 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 * . f»ROT 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_SüCCISS)¡
}

yo id i a U '‘_ i ;_ « '”'or|char *neosaje)

<
perrorinensaiej;
8xtt(Exrr_FAiLUft6i;
i
L a única salid a de mkmap es la dirección 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” cómo 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 año del archivo, quo es en­
tonces utilizada como parám etro length en la llam ada a nvnap.
) • ) I 1 )

Capítulo 8 : Administración 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­
ción - 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 función -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 ­


ción 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 reali-
ra n d o u n O lógico 'b i t a bit) de u n o o móñ d e los sig u ie n te s valores:
• US ASYNC Program a u n a operación de e«critura y reto m a
• US_SYNC Escribe datos antos de que reto m e au homónima
m syncO
• yS_ISVALIOATE Invalida otros m apas del mismo archivo de modo que
sean actualizado* con datos nuevos

MODIFICACIÓN DE LAS PROTECCIONES OE UN MAPA


La función n p r o t e c t modifica loa indicadores de protección de un m apa de
archivo en m em ona Su prototipo es «el siguiente:
in ; p r o : * c t ( c » - $ : * o :a •*<*:<■. i u * _ t Un, w x p ro t);

n p r o t e c t establece o modifica laa protecciones p ara ia región de mem uria


que comienza en a a c r al nivel de protección especificado en p r o t . Este di­
urno argum ento puedo obtenerse m ed ian te un O lógico (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 región 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 región
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 connnuación:
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: ;
) I f ). \ I ) ) ) f J ) ? ) ) ) ) > }
1 80 Programación en Linux

El comienzo de la región 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 región se debe bloquear o
desbloquear. Los valores p a ra f l a g s pueden ser uno o ambos (previo O lógi-
co bit a bit) de los siguientes:
• MCL_CURRENT especifica que todas las pág in as queden bloqueadas a n ­
tes de que la llam ad a retorna.
• UCL_FUTURE especifica que sólo sean bloqueadas to d as las páginas 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, sólo pueden bloquear o des­
bloquear regiones de memoria los procesos que corran con privilegios root.

MODIFICACIÓN DEL TAMAÑO DE UN ARCHIVO MAPEADO


O casionalm ente se necesitará m odificar ol tam año de una r«gión de memo-
riu. Utilice a tal fin la función 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 función de biblioteca r e a -
llOC. iTiramap modifica el tam año do lu región de memoria que comienza en
o ld _ a d d r, cuyo tam año original era o ld ^ le n . al nuevo tam nño new_],-?n
f Lags mdica si ln rv/pón en cuestión puede ser desplazada por lo mcunona n i
fuese necesario. MREMAP MAYMOVE perm ite que lu dirección de «u ongon vario;
si no se lo especifica, la operación de redim ensionam iento fracasa, mremap rr-
tom a la dirección de la región cuyo tam año se ha melificado o NUIL si ocurra
algún problema.

E je m p lo
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 entación
e4CMi>t.o olemuntal. m ueatru c larim en to cómo llevar a cabo E/S de archivos em plean­
do im ágenes en m em oria de loa mismos.
• Vonürn 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 );
) ) I J ) ) / > ) ) ) t > > ) * * > } ; ; j )
C a e d le 8: A dm inistración avan zad a d e arch ivos en Linux 181

in t s a in ( ir t ar^c, cía* *5rgv:j)

(
i n t :e s c r :a t o c - arc.iív©;

cftar ‘ f j íf lt * ;

3 :rv c t ara: star^ j?;

• A s rir « I ircn ivo *uer•» •/


¿ fía 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 /• S« oot«n<jra j * l .m in oro


j t a t e w f .s iz a a« a ta ta v í */

/• Vap<ir « l arcntvo 3* »ntr*ca •/


» ntaod, *ta?0uf.*:_»tr«, PWr_fi£Afl,
»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 •/
•n:*(STOOuT_F!w£íio. »tatbu# .»t_*iz*|;

/• ProLijar •/
0 9
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 ^ £ ) ;

>
Programación 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 región 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 hidráulica, Cüriuo no proveía ninguna
veníala ■en ‘érminos <<; dcscrpoño o do er.ens'ón de código. Sin e r r ó lo , en 3--k>ocio-
re 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 tomoión resultar valioso on circunstancias er.
aooce se «»uloro una aüa 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 admirtütmdor do memora do Lnux. Como resu tnao. los archivo', w t co>
'.iwcn datos cue deben ser rosgjardacos. tales como los do contraseñas o Ce nómina oe
oaitav ser an -rnr-os prodlwn a sor rnvisados. Por supuesto, en una situoc6- as¡. la « a -
pecSva región do memoria to-dría oua ser ostnbloddo a PAOTjíCNE de modo que ofos
proceson no .•Mocados no puedan leer dicha roglón.

Bloqueo da archivos
El bloqueo de archivos es un método que perm ite quo vano» procesos p u e­
dan accodor el mismo archivo sim u ltán eam en te de unn m uñera 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 razón especifi­
ca por la cual a dos procesos no se les deba p erm itir leer diíl mismo archivo
sim ultáneam ente, pero im aginem os la confusión que resultar:» si dos proce­
sos estuviesen escribiendo al mismo archivo al mismo tiempo Con toda pro­
babilidad cada uno de ello3 sobrescribiría los datos del otro o. en algunos ca­
sos. corrom pería totalm ente el archivo.
El procedimiento general s> se desea acceder a u n archivo bloqueado se lista
a continuación:
!. 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 cómo ei proceso bloquea el archivo an tes de d ar comienzo a cuxJ-
qu ier operación 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 proco-
sos 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 después de proceder a desbloquearlo, otro proceso podrís acceder el
archivo en la tracción de segundo que tran scu rre entre ¡a operación de blo-
qneo/desbioqueo y la ce apertura/cierre.
Capítulo 8: Administración 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 decisión. M u­


chas de la s operaciones de E/S dem an d an , a lo sum o, sólo un p a r de según*
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 utilizándolo.
Los bloqueos de archivos vienen en dos variantes: bloqueos inform ativos y
bloqueos compulsivos Los bloqueos inform ativos, tam bién conocidos como
bloqueos cooperativos, se basan en u n a convención 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 sólo 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 isegún 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­
sempeño. porque cada operación 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 bién 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 código que se paresca al siguiente fragm ento de pseudo-código:
'zen írc n tv o a sloq u to t*oI«arcc *1 tfloicao or 0_6XCU
li 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
tls e
tro a iS B O c lo c ^ e a o c ti arc n z v o

izr-.r irenive
lle v a * a 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

:ti“ « r e i a rc h iy o

i ’ J lf á r 3*svi-iCbl5r. a. ir c n i. c :a blOQuíO
ana i f
La utilización de 0_EXCL cuando se abre el archivo de bloqueo garan tiza que ia
llam ada a. C?9 n sea atómica, es decir, que no sea interrum pida por el kemeL
Ssto ¿s im portante porque se puede d a r una. probable condición de competencia
r o e condiíior. cuando dos procesos tr a ta n de abrir el mismo archivo. U n se-
gundo proceso podría 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-
) ) i ) ) J- J 'J ) ) ) ) ) ) ) ) ) ) } )
134 Programación en Linux

ca situación. Como se acaba de comentar, por convención, 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 ’&ífléo de ~‘ o rk ‘
Dágina 73.

E je m p lo
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 propósito
EJEMPLO de! program a es iiu stra r la lógica 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 tilización Oe archivos de Cloqueo. Sintaxis: cloquear
bloquea.-. c.Ick
•I
*include <ynistd.n>
ílnclude <*cntL.h»
einclude '«rrn o .n > r Por la posible presencia de EEXIS" •/
*inclu<l* <atdliti.h>
íincluflé <3t3¿0.h>

ínt nainlinr arge, enar ' í r j v O )


{
int descriptor jirc tu vo , nuevajjescriptor;

/• A b rir «1 archiva do olouuoo V


daicr»ptor_»rcnivo • co«n(arqv[i j , G_CRCAr ; OJXCL. flea-t;,.
i*{descriptor_arc*iivo < tí U «rriw -• EEXlSí) í /• E l archivo ya te *ftcu«ntra
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) r Ocurrió alQun otro orror que ro
conprobarenoa •)
putsCC curno un error no p rc v u to '1 ;
else i, !• V. .ircmvo oata ahora blocueaoo par noiotros*/
puts{*cíta o.-egrana procede A Bloquear al arenivo*);
/'
• A q ji tendrían lugar procesos adicionales
•/
• flepatir e l prcceso ae bloqueo, cua asta vez fracasara •/
rjsvc,3S3criccor = opaíiíargv(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'); r
si nuestro */
lióse |,iuevo_descriptor);
} *ise if| nuevo^descriptor < <!)
Capitulo 8 : Administración avanzada de archivos en Linux 185

owt*{ '0cjfi*i3 un errar no pr*ylsto*)i J


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 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*_SuCC£SS);
>
U na corrida de dem ostración de l o c k i t produce la siguiente salida:
5 ;Dlocj=a-_archivo &ioqu«ar_arcftivc.e.lcJc
SIckjuíc astailacldc :c* íí?« prograna aaor» al archivo
£1 3rcíiir3 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 línea de comandes?) cuando se ejrcute la prim era sentencia open. Después,
en la segunda sentencia acen . D lo q u e a r_ a rc ftív o trata de bloquear el mismo
archivo una segunda vez creando el mismo archivo de bloqueo. Lu especificación
de 0_Cfl£AT 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
creación 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 expresión . !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 cornwpcm-
diente 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 sólo 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 específicas de
les archivos, denom inadas registros. Los bloqueos de registros, alg u n as ve-
Programación 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 bién 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 bién com partidos porque muchos procesos pueden estab le­
cer al mismo tiem po este tipo de bloqueos sobro la mism a región de un a r ­
chivo Los bloqueos exclusivos, por otro Indo, evitan el acceso a u n a región
bloqueada m ientras que los mismos se en cu en tren un vigencia. Además, 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*»* rrnmeníi» *. 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 parám 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 bién 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 mt
snor: /• SeginnLng o* ioc* •/
o ff_t i _ s :a 't ; r Staf'ttng off$*t of lock */
off_t I_lar¡; /• Nunoer ar ¡jytss to lock */
pia_t I j í i d ; /• 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: Administración 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 dónde), 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.aúa i s-stema lseek esta cutortfta «n 'Po 3.-oooarrilento dol punteo <J* archivo',
pagír-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 es-
c 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 j»e 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 «unut0.l*>
• i/'Clw.J» « fc fltl.t»
• ir e iv o t <»talio.n»
• IflCluO# < *ttio.h*
• irclji* <irno.H>

IflX

(
y it <3e*ef!0tor_ircfttvo;
nr'jCt f l oc» 6lW_r«g;

t f ((aeter iptor_ 4rcruvo * ¡peni’test. d e t \ 0 _»CV«j) < 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 ercíUva
•I
3 loa_'ffl.l_tyc« • sjWtOC;
fcloo_r*fl.l_eneflc« ■ * S££X_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 , ?_3€Tu<. 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 ) ) f ) ) J ) i ) ) t ) / ) ) í t ) > 1
188 Programación en Linux

/* Añora 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¡
DÍoq_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_Se‘TLKH, 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 itlÉX IT 5ÜCCES5Í;
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 región del archivo, como lo ilu stra la figura 8 -2 .
) í ) > ) ) ) ) } ) ) ) ¡ ) y ) ) j ) t ) i i

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 capítulo extendió la discusión de la E/S ce archivos, concentrándose en
sus características avanzadas tales como m anipulación de directorios, m a-
peo de archivos en m eraona y bloqueo de archivos. El próximo capitulo,
T teem o n s’. an aliza la creación de procesos en segundo plano, lo que finali­
zará la sección correspondiente a program ación de ¿is te mas.
4

9
Daemons
En este capitulo, o! lector aprenderá cómo 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 algún 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 características de los daem ons
• Las reglas p a ra la creación de dae mona
• La* llam adas a fu ndones que d eben em plearse cuando se program a un
daem on
• Cómo tra b a ja r con la u tilidad s y s l o g
• Cómo deben a d m in istrar los daem oos los erro res en tiem po de ujocución
Todos los programa.? de este capítulo 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 Programación en Linux

Generalidades sobre Daemons


Típicamente, 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. Además 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 bién ciertas características 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 líderes de sesión. A m enudo hacen la s veces de
procesos en su grupo de procesos y en la sesión. 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 huérfanos heredados por i n i t
✓ Los wrétituKes d« control y ¡os IfcfenM de sesión son comentados on 'Sesiones*, óóg'ro» 76.

✓ Los rjucci do procesos y los lidoros do procesó conV.ituyon c.‘ teme do ‘Grupos tío proce
sos.* stfgine 76. . .. ...............

Creando un Daemon
Para crear un programa que se comporte como un daemon mío 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 capítulo» previos. En el caso de lo» daemons, sin embargo,
la manipulación 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 re-
sTstrodol .¡.Htemn (que a menudo en el archivo /v a r/io g .-m e s sa g e s). Este tema
so cubre en ‘‘Manipulación do errores", m ás adelanto en este mismo capítulo.
Existen unos pocos pasas sencillos a seguir para cro.'ir un daemon que al mismo
tiempo ae desempeñe 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 mayoría 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 aplicación porque no 3on interactivos: corren en segundo
plano y, como resultado de ello, no poseen u n a term inal de control. Como pri-
m er paso tendiente a desem barazarse de la term inal de control, su proceso pa­
dre efectúa 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 sesión 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 ejecutándose, por supuesto.
Capítulo 9: Daemons 193

El paso siguiente es hacer que el directorio corriente de trabajo (cwd) del pro­
ceso sea ei directorio raíz- 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
razón, 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 problemático y eliminarlo), o. en una situación 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 raíz 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 creación do archivos
y directorios. Consideremos la siguiente situación: un daemon h ered a una
u ~ a s ’< de 055. que elim ina los perm isos de lectura y ejecución 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 podría se r leído,
escrito y ejecutado por el u¿uuno. pero el grupo y el resto de ios u suarios só­
lo podría escribirlo, lo cual seria absurdo. Sem ejante situación 3e evita h a ­
c e n d ó la del daemon igual a <3 Tam bién 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 precisión 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 común No existe razón 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 configuración 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 cuestión, d e modo que re su lta difícil 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 sesión
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 sesión y u n nuevo grupo de procesos. El daem on será
entonces el líder de la nueva sesión y el líder de grupo de procesos del nuevo
grupo de procesos. La llam ada a s e t s id g aran tiza tam bién que la nueva se ­
sión no tenga un term inal de control Si ei proceso que efectúa la llam ada es
ya un líd er de grupo de procesos, sin embargo. la llam ada a s e t s i d fracasará.
Program ación en Linux

Si tiene éxito, s e t s i d retorna el [D de la nueva sesión (SID.i. Si se produce a l­


gún 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­
ción 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
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
f Jf MPLO 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 IdUflílCO “.oubro OS un»
v a ru rtfl d *l
m iao qu» i « encuentra nao adolanto en e»to niiaa capítulo •/

• 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 »
«inclüOfl «errn o .h >
• i n c l u d e < u o is td .n >
f i n c l u d * < t¿n*>
* in d u d a < « r in ^ .n >

Lnt Min<voidt
l
ptd_: pid, s id; /• pía - icentir'icador oe procesa: Jid « iden tifica-
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 * > ;
«xitisxir_FA¿LJRS);

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 u« r r a c a j o sea « 1
5 i r * c ; o r j o r a i i •/

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 • /

CÍ3t4<STOr*_F:i£N0:,
ClOM<5T9CU7_Fll£*0);

elOMlSTOBW.FJLÍHO);

/• F liu lM ftT * . r » a lu a r :* ta rta prataniHda V

loftQ iíua • * : 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 | • U oogu ye • t))l

if ( D « f “ * JU .) (
» « 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_Cfl£AT : O J « O M .Y : Í 6 M | ) « o: {

«n:{£X!T_FAlLLfl£|;

STr->c7/(Cvif, !, longitud - t );
•-ití'<J«;.*;pror_ircf’i»0 , Oüf, longitud - t);
cicíeísesrru-o^arc-nivci ;
JiitpiM J;
}
é t í t >£XIT_3UCCcSS);
i j ) j ; • ) i ) l ) ) ) > f ) > > > } }
196 Programación en Linux

* ecr¡a_ n cr a utiliza las llam adas a sistem a o p e n y w r i t e con el propósito 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á después de que fracase en abrir
su archivo de registro. Después 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 * 1999
*«0 J u l 29 0 1 : 3 6 :4 1 '999
$ A ~~— J u l 23 3 1 : 3 7 ; 4 |
WflO J o l 28 9 l : 3 8 : * i >999
vre-J J u l 28 o : : 3 9 : 4 l I9S3
Obsérvese 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
después 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 ría donde ir. El lazo infinito «vhile
efectúa 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 propósito 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 continuación;
v o id sp d fU o j'c r.a r m t opu on , ln t f a c l l l t y i ;
voiO c lo se lQ Q (v o id );
vota syslog(u«c p r w n t y , c*ur ’ farnat,

o p e n lo g da comienzo a una conexión 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 típicam 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 lógico 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 conexión in m ediatam ente. N'ormaimente, la co­
nexión no so ab re h a sta que se envíe ei prim er m ensaje.
Capítulo 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 íaciüty del administrador de ingre•
se a- s:s‘erra___________________________________________________________
Valor de facility Descripción
log_ auth» r : v M e rm e s de seg'jndad/autonzaciOn

LOG_CRON D a e m c ^ s ce reiG»; c r o n •/ a t
LOG_DA£MOí J Otros daemons Oe sistema

L<X5_K£RN T e n ía is <a«i kome<


LOG_LOCAL{3-7J Reservado oara -js o local

LOG_L?B Scosisterra de imoresora en rinea

tOG_UAIt Suraistcmo do correo

L0G_NcWS SuOaistoma do nofcelaa de Usenet

LOG_SYSLOG Mensajes s e rra d o s por sy slo g d


LCG_USER Usuarto predeterminado

LOGJJUCP Sistema 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. va¡ores postales para el argumento onenty del administrador de in-
xreso ai sjstem a
Valor de prionty Descripción
LOG_EU£RG Q sistema no se ercuenwa utllteaoie

LOG_AL=RT Temar acción ir.meclatamer.M

lo g _ c « :- Conciclón crítica

LOG_ER3 Conoicón de error

L0G _«A3SIM G CorvJfuón de advenenc'S

LO O .S O TIC E Carxjidon normal cero significativa

LO G .IN F C Mensaje informativo

L0G_D=SüG Mensaje de depurac-ón

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
Programación en Linux

E je m p lo
El 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 :
EJEMPLO /• .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 itamívoia)

<
310 t pía, j ia ; oíd * icuntificaaar do procoso; sic - iden tm ca
dor de saaion •/

int £m criptor_arcnivo, longitud;


tli9 _ t tlítábuT;

r A C rir *1 registro <1«I sistema •!


openloG{'fecha_nora2*, lQGJ’ IO, LOC5 OAEMCfl);
pid ■ ^orkí >;
i?<pia < fli {
s ysio g iL G a _ e fla , * fo rK *>;
«xitíEXIT.FAILUREJi
)
if(pid » si
En ei orocesc ojora. Añora, 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 sesión ’ 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_FA¡LUB=J;

}
' * cerstín¿4cíO0, M c * f cwi O ir e c W lo so rris a te de trsoaja sea e l a irs c -
t o r io r * u •;
lf((c*ttir{*/*}) < *> {
*7*IcqíICG _£«, -vs\r»*, ’ c n d lr* !j
cxit:EXlT_FA2LURS);

• lU x n tc U l U K iO f l C »l 9C«3o ! t « r c M v o */

« tu tu :

./ • U r r t r i M l n , itflo a t y it<3«rr •/
ClO Jf(ST0tH ,r:L£W ):
c io M ts rw M r.F itÉ » » ):
elC«t(ST06!W .FXUM» i

• F ir.U M rt?*. ' « « l i u r la t»r«» pr«t#r\(3tdí V


lo n g itu d «
■nU«|i) {
z t-ir •5u< » *4i:o< {»Lí«J?(cnír) • {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 oo*fl{’h » r log/lpadat«l.loQ\
0_CR£*T 0 J» G M U 0_AP?EN0, 0 6 M II < «) 1

syíiog(LO O JSA , *op«''‘ >;

>
U a*(& t¿aeouf | ;
*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>;
Programación en Linux

Una vez añadida 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. Refiriéndose luego
al código fuente de fecha_hora 2 . uno e sta ría en condiciones de d eterm in ar
dónde 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 continuación, tom ada dei registro del sistem a, fue generada porque
quien intentó correr ol programa no «ra un usuario root. El núm 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:** capítulo explicó la creación do dacmonn, qui’ «on program as do ejecu­
ción «n segundo plano que oatón aiem pro funcionando y que. habitualxnentc,
proveon algún 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 ación de sistem an. Con su co­
nocimiento actual d« las h erram ientas básicas de desarrollos, cu b iertas en
Id Porte l, "El entorno de program ación de Linux", y unn sólida comprensión
de la programación di* bijjo nivel de sistem as (cubierta en la P arte II. "Pro­
gramación 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*. programación de
aplicaciones) más comunes de Linux, en la P a rte III, "La* A PI (Interfaces de
programación de aplicaciones de Linux)".
} * ' > > > ) ) i ) \ ,1 ; ,

í Parte

Las API (Interfaces de programación


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
\ ) > ^ ) ■ ) ) > ) ^ > V ^
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 dósear 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 enseña al lector cómo 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 versión quo se com enta en este capitulo es la 2.7 7. pero la que
se m u estre es válido tam bión p ara cualtjuier o tra vorsión 2.x. O bsérvese que
la API 2 x incorpora todas las características de la API L.X. pero añude asi­
mismo mucho» elem entos
E ste capitulo cubre los siguientes tem aá:
• Creación de u n a nueva base de datoa
• A pertu ra de u n a base de datos ex isten te
• Cómo agregar y su p rim ir registros
• Recuperación .obtención) dtí registros
• B úsqueda de u n registro
• N avegación 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.
; ; ,i i ) r i } ) ) ) ? / ) > ) J >
204 Programación en Linux

NOTA
£r. *' sitio Weo que eerrescc-'-de a este loro se encuentra disponible una Estribación
completa de¡ código fuente ce 'a ver$i<^ 2.7.5 Ce a Dase ce oatos Berkeley. Tc-dos los
eiemc’os ce 53*e irero fueron ccr’st'uicos err>p¡eando 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 práctica­
m ente ilim itada, a condición do que cualquier valor pueda caber en la m e­
m oria disponible del sistem a (m oraona RAM física).
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 podrían ten e r el siguiente aspecto:
C la v e ________ Valor_________________ __ ______________________
Uno Compilación do program as
003 Control del proceso do compilación: el siako do GNU

Tres Acerca del proyecto


Cuatro Procesos
Cinco Sartales

y así siguiendo.
Las bases de dato s DB aceptan tres tipos do método 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 se-
cuencial; 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 búsqueda rá p i­
da. La función 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 ordenación
está determ inado por u n a función su m in istra d a por e! program ador o por
una función p redeterm inada quo clasifica las claves de m anera lexicográfica
La figura 10-i m u estra cómo están 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.8T7ÍSB

2 3 U S S -I

! -*=»y tArtU»J
2 - *«*_a‘Va>v»_2
J-* * * _ 3 v o íu * JJ
i■ »9co»*3 NumíMf Datacaia
;D8.flECNOi
S • ’*cy_SiVa>v*_S
S • »*¥_5vb »v »_3
7 «*»_7,v»x*_r
i - *9Y_lViKO

F ig u ra 10. í. Cómo ton alm acenados loa registros en ¡as bases de datos DB o
Berkeley.
La verdadera iroplementación de loa métodos de alm acenam iento y acceso que
adm ite D 3 exceden los alcances de este libro (en verdad, muchos científicos
especializados en informática dedican toda su carrera a estu d iar algoritmos <lo
ordenam iento y de búsqueda), pero Los principios básicos son simples. La fin i­
rá 1 0 - 1 m uestra una base de datoa q;ue contiene ocho registros, indicados por
los núm 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^aárbo!!. tal como se m uestra en la figura 10*1. E sta disposición logra que
ubicar un registro especifico sea extrem adam ente rápido y eficiente. Las basca
de datos de tipo h ash alm acenan los datos en una tabla. La ubicación de un
registro individual en la tabla depende de un valor arbitrario que se computa
basándose ¿n la clave del registro. L as bases de datos orientadas a núm ero de
reg u tro alm acenan estos últimos en orden secuenciaJ. Loa registros son acce­
dido* y m anipulados por su correspondiente núm ero de registro.

Creación, apertura y cierre de una base de datos


P ara em plear u n a DB se debe incluir en el código fuente del program a el a r ­
chivo de encabezado <flC.h> y vin cu lar a l código objeto del mismo l i b d b . a
( - l a b ). C ada función DB recom a cero si tiene éxito y un valor distinto de
cero si se produce algún error. En el caso de un e rro r de sistem a, tal como un
argum ento no lícito 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 función o e r r o r . O tros códigos de re ­
tom o irá n siendo docum entados a m edida que se vayan explicando las fu n ­
dones que los generan.
- f ) i ) ) J ) />) J ) ) ) )
204 Programación en Linux

NOTA
En =: sitio Web cue rc re s íC ^ C í 3 este libro se encuentra disponible una cástribuclón
contera del código rúente de ¡a versión 2.7.5 de ia Mse de datos Berkeley, ledos los
eiemeíos do este ibro fueron construidos empleando una cco'3 del archivo de e^c-x»-
Sodo y ds la biblioteca presentes « n ai directorio corresccrdiente al código 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 ráctica­
m ente ilim itada, a condición do que cualquier valor pueda caber en la m e­
moria disponible del sistem a (m em oria RAM tísica).
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 podrían ten e r ni siguiente aspecto
Clavo__________ Valor_____________________________________
U'X) Compilación d e programa»
Oos Controí del txoccao ce compilación: ol make do GNU

Tros Acerca del proyecto

Cual/o Procesos
Onco Sertaios

y asi siguiendo.
Las bases ce datos DB aceptan tres tipos de método do alm acenam iento y
acceso: B -ire«a, 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 búsqueda rá p i­
da. La función 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 ordenación
está determ inado por u n a función su m in istrad a por el program ador o por
u n a función p red eterm in ad a quo clasifica las claves de m anera lexicográfica.
La figura 10-1 m u e stra cómo escan relacionados e n tre si los tres tipos de al­
m acenam iento y acceso.
1 i I f ) } f ) ¡ I
Capítulo 10: La API de base de datos 2 0 5

5 - t ío
< 0 6 _ B T *E B

3 3 *5 37 3

\ \ \ ; i ///
ríT í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.B€CNO ?
5
4 -«e]fJVvafcjg^S
7 *vy_7*W j
9■

F ig u ra 10.1. Cómo son alm acenado* los rehuiros er. las bases do dalos DB o
Berkeley.

La verdadera implemcntac-.ón de los métodos de alm acenam iento y acceso quo


admit.’ DB « « d o n los alcances de este libro (en verdad, muchos científico*
especializado* en informática dedican toda su carrera a estu d iar algoritmos de
ordenam iento y de búsqueda), pero los principios básicos 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 números 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
ír«e»árbol), tal como se m uestra en ta figura 10-1. E sta disposición logra quo
ubicar un registro especifico sea extrem adam ente rápido y oficionto. Los bases
de datos de tipo h ash alm acenan !oa datos en una tabla. La ubicación do un
reg u tro individual en la tabla depende de un valor arbitrario que se com puta
basándose en la d a v e del reg atro . L as bases de datos onontadas a núm ero du
reg a tro alm acenan estos últim os en orden secuenrial. Los registros son acce-
didos y m anipulados por su correspondiente num ero de registro

Creación, apertura y cierre de una base de datos


P ara em plear u n a DB se debe in d u ir en el código fuente del program a el a r ­
chivo de encabezado <db .h > y vin cu lar al código 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 algún error. E n ei caso de un e rro r de sistem a, ta l como un
argum ento no lía 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 función p e r r o r . Otros códigos de re ­
torno irán siendo docum entados a m edida que se vayan explicando la s fun­
do n es que los generan.
206 Programación 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 fundón 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, D8 _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; és-
te ya no exiaCittru; DB_RDONLY, que ab re la base de datos nólo p ara lec­
tu ra (cualquier intento de escribir a olla fracasará), y DS_TRUNCATE.
que m iciaüzará lo» datoa a 0 ai la boye de dato s ya exiütiern
• 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 están cubiertos en *£i motío de un ar


cnivo', p&fcina 134.

• Loa parám 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 serán 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 patrón DB (base de datos). Si la base de datos
debiera ser previam ente creada, dbpp será inicializado por la función
db_open al valor adecuado o a NULL en caso de que ocurra algún error.
El handle o descriptor de base de datos que inicializa d b_open es la clave-
p 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 función cióse. 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
>

Capítulo 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 msfcü opción! .3 8«»Jtc t jr 03 mantiene infarmac-ón er. su propio
zxf-? y ' a -racribc a o'-scc •rcBOCí’ Cienr^-ner'.? c e lo c j í ¿ntíicuo ol kem el. Si ^o so 3in-
z-'ce :z í3 ¡otarr-aciór c- -e^o>-a cc-- ’a ■se deseo » obrenará una oase je datos no
ccrf.afe. ircoc^steírey/o ccm.0' 3 .

)!» E je m p lo
i l ’f E ste program a. a b r i r _ db. abre y c ie rra uno base de datos en el directorto
¿H> com ento de trabajo.
CifMfto tí-aer» 3*1 srograii *a iru«rr.«: opípcc.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>
<**5ío.n>
t l M ’. r t* <*rrno.R>
• lA C li X ! » * « . « *

W5 M ir ( » 3 ia i
<
33 /• H.t/iaiír o aascriotor J« base di oacoi */
un rilor_r«tcm flo;

v ilc r _ r * to r i* » c « * 3 6 j J 0 í r ( '* e 5 t .3 0 * , Ca_3T'R£c.


0Q_C«£ATC, MJU.. H iJU. Síün cb ro_03);

£ S ir - a r i '3 S _ íc e n , l;
«KÍt{6xrr_FAlüW £S;
}

ob->clds*<0ufl:eroab, «);
«.itíO C!T_3üCCBS);
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. Después 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 rápido 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 información de tipo adm i­
nistrativo. Uno no debe preocuparse pe r ello, sin embargo, porque se tr a ta
de información que =ólo es em pleada por la A PI de ba¿e de datos.
; / / / / /

208 Program ación en U n u x

Para a ñ ad ir registros a u n a base de d ato s se debe u tilizar ia función 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 transacción, u n a característica 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_APP£MD. que se utiliza
sólo con bases de datos del tipo DB_fl£CN0. p u t retorna D8_KEYEXIST si la
clavo ya ¿e encuentra presente; tam bién tienen lugar los códigos e stán 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
más 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 progru-
rna una clave denom inada d b k e y . A ntea de utilizarla, inicialícela 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
£1 program a del ejemplo siguiente añ ad e u n registro a la base de dato s c reá­
is A da por opendb:
cjímplo mcabra (la! Drognuta an rn to w t: ocidüii.s */
/•
• aftioir^iJD iJtro .c Artatío un registro a una D3se ce dttO l 3or«ceIay 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, w jl l . NUU,


S p u n ta ra jío i ;
} J ) t I } f / ) ) j j i i y ) i

Capítu 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, túecfíelav#));
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/vaior •/


v a lo r_ r» tc rn a tío • 5u it»ro _C 6 -» o u tlC t). NULL, 4k«y, A v alu é . Cfl_NO0V€JWRITS);
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_3UX£SSl;
)
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 operación 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:

itesu lta de especia: im portancia o b serv ar que, en este ejemplo, los caracte-
jIlT o* res n u i l 0; de term inación de la s cadenas uno y C o n p ila c io n d e p r o ­
g ram as quedan tam bién 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 inación.
210 Programación en Unux

Esto explica por qué razón el código 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
estático», o sea estos compilados con ol programa. En cambio. >os registros se van
agregarlo dinámicarrento en tiempo do ciccuciün. El programa Oe Cemcstracón utilizó
s ix e o f porque esta 'unción ooera tjiftn con datos estáticos (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 uti¡l:ar llamadas a lo fynciór
s t r ie n y añadirte 1 al valor retomaco a fln de tone*- en cuenta «i cero binario de ferm»-
-.ac!ón Almacenar el ce.*o do terminación junto o su ro*poct¡va coseno no es una coo-
cxr.ó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 estantía' de C. tn es como p uts
y p r l n t f . que •equiere'* eí cero Binarlo do terminación (\C! para funcionar correcto-
niente ¡o .l'rectamente para funcionar!.

Supresión de registros de una base de datos


P a ra su p rim ir registras do una base do datos D13, utilice la función 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 idéntico qua en ei caso de la fun­
ción p u t. Como no 30 está interesado on esto coso an los datos, sino que sólo le
interesa la clave, no existe razón alguna p ara especificar el valor quo se quiero
eliminar. La supresión 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 códigos retom ados son los habituales.

E je m p lo
El siguiente program a suprim o un registro de una base de datos:
/ • señare 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 ;
Capítulo 10: La API de base de datos 211

.3:< r rsto-nsas - « o _ : o « f - a e \ C8 C»&ats, su.1 . « j a .


io-.r»«<-o_5ü};
tflv4lo<*_r«torcado) {
perrcr('tí&_oo«»*J;
?*í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 ííi <5v* 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 • « CÍJiOrfCUKO) { / • l a c la v a ro a*l»l» ’ >
#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 curría alflun o tro tip o ¿o
•rro r •
G ^rrcrrcs!’};
• Hti£XIT_FA!LLflE);

23->ci3it¡ecrtrerc_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 espués 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 bsérvese tam bién que el programa utilizó
s t r i e n (* u n o ' ) - T para d e te rm in a r el tam año de la clave, en lugar dei
operador s - z s c f dei ejemplo anterior.
• » / / / / / J ] J t
212 P ro g ra m a c ió n e n Linux

Obtención de registros desde una base de datos


La fundón 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 *Jt«y, DQT -d a ta . u _ in :3 2 _ t r i a s s ) ;

El significado y el empleo de todos los parám 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 in-
form adón 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_G£T_80TH. en cuyo caso g e t recu p erará el p a r clave/valor sólo 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.
/ • Norbre c e l prc<jr3na «n I n t o r r a t : fls td b .c V
IlíM P tO
/*
• o b :« n * r_ r» g is T ro .G - OEtflnar un r o g ü t r o d ® unB b«9e 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, n u il ,


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 *);
e«t|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 •/
MOSatÜClave, 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 ) ;
) J .* ) J .i > t I ' .1 > .»

Capítulo 10: La API de base de datos 213

/• Asignarlas valores a clave y valar •/ ^


CU ve. sata = ’u«o’ ;
clave.size = 5Trlfir(*uno*l - t ;
v a lc -.c a tí = ’ Cc«cilatiort «* 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 it«rojfl6, NUIL, 4clava, iv a lo r . 8);


l? (YalG.-_r8 icrr .350 ~ CSJ'CTrOUC)
f o r in tf ( 5 tc » r .- , '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 ) ;

e ls 9 i f 'v a l B ^ - e t c r n a d o )

0«rf#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_SÜQCÍ55)¡
»
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* ^ r« «

_____ P ara aseg u rarse que la operación que vaya a realizar g e t tenga éxito, el
i a l io a program a prim ero añade 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 algún 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 información.

Navegación de una base de datos


Er. el ejemplo an terio r ge vio la m an era de en co n trar un registro específico,
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 lógico, 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 Programación 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 baóe de datos, excepto que en este caso se lo em plea sólo 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 códigos DB e stan d ar
de error com entados al comienzo de este capítulo.
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é señalando, s e debe utilizar la llam ada a c _ g e t.
cuyo prototipo es el siguionte:
Oa.;u-iOr->c_3«t<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 habitúalos para Flags en c jt e t_________________________
Valor do flags_______ Significado_________________________________________
D B _ F IR S T Retorna do la baso do datoa «I primor regíntro
DB_l_A$T Rotorna do la baso do dato& ol último registro
DB_ n £XT Reterna do lo base de datos el siguionte registro {o el efímero,
si ol cursor acaba de ser notorio)
DB_NEXT_OUP Retorna ol siguiente registro quo oon un duplicado do¡ reg s;ro
corriente
Dfl_PREV Retorna de la base de natos ei registro previo
08_CURHENT Retorna do la oaso ue datos ol registro corriente
DB J 3 E T Retoma oe la oaso de datos e! regisvo que coincida con le c a ­
ve surrvmstrada
Ü3_SET_RANGE Retorna el registro 06 menor orden que sea mayor o igual quo
la clave suministrada
Tam bién so puedo u tilizar el cursor p ara a ñ a d ir pares clave/valor a un base
de datos por medio do la función c _ p u t, cuyo prototipo es el siguiente:
08cursor->c_p-t(0SC 'cursar, D3T *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 ubicación de la base de datos señalada 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 después dol registro corriente, DB_8EF0RE, que lo añade 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 arám etro f l a g s puede tam bién 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 configuración 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.
Caoiíuio 10: La API de base de datos 215

Como sería 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_d€HO0C *«ur»or, -J_:nt32_: ’ U ^ s j;
c _ d e i elim ina do la base de datos el reg istro corriente, retom ando loa códi­
gos e stá n d a r ¿e e rro r o 06_<EYEMPTY s i ei registro ya ha sido suprim ido.
D espués 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 espués de h ab er llamado a c _ c ! o s e . ya no se puede volver a utilizar el
hendie del cursor

Sincronización de una base de datos


Cuando se cierra una base de datos, todos los dutoa de la m ism a alrnucona-
doa 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 propósito 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 hanále de base de datoa retornado por una llamada previa a db_open,
El parám etro f la g s no se Utili&a en esta ocasión y debe ser p u u « a a 0.
¿Por qué razón se debe utdixar sy n c? Supongam os que so h ayan añadido y
supnm :do una g ran canudad de registres. En un sistem a muy recargado,
uno debería llam ar a sy n c periódicam ente con oí fin do asegurarse que la ba­
se de datos en cuestión 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 bién u n a excelente m anera de prevenir las pérdidas du datos o la
corrupción de la base de datos en el caso, poco probable pero posible, de una
caída dei sistem a o u n a súbita falta de -energía eléctrica. De m anera similar,
si u n program a ha .nstaiado un h análer (adm inistrador.' de señal para
5I3TERM. se debería llama r a sy n c (y probablem ente tam bién 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 bién ei proceso de utilización de la llam a­
da a sy n c .
• xotere -el prograu m Ir.Tgrp«t: 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 » «ítíliS-f1»

iineli^s <str¿rs.K>
? L - c l.:* ‘ a a.b *
) ) I ) ) I ) ) ) } ) ) ) ) ) ) ) ) ) ) ) ) ) J

216 Programación en Unux

Lit «inivoidí
f
03 *0u^t«ro_«í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 jóp #n (’ t t t t . 4 b * , D3_3THEE,

06_CR£ATC, « 0 0 , NUIL, WJLL, 4 C 'jn tero _ d a );


l* (v a Io r/a to rra d o ) {
0e r-cr<, ctcD«n, }¡

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*(|vai«r_r®tornaao • cursor_dO*>c_gat{cursor_aa, ¿clave, Avalar,
Ce.NÉXÍ)) I- OB_MOrF(XlNO| {
priotf|*E1 oar d ,w * / v «lo r en V»/*s\n\ {cnar ‘ icla va -d a ti,
leñar ’ Jv a lo r.d a ta );

f 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 •/


?unt«ro_db->close(P'jnt8ro_oa, 8|;
■ixiti£xrr_succ£ssi ¡
i

_______ ________ _ ^
) ) ) ) ) ) > ) ) >. ) } ) ) ? ) )
Capítulo 10: La API de base de datos 217

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 2»L Proyecto
£1 z i- c la v e /v a lo r es jnoíCo*c;U<Lcn fl# Prc^-snas

Como se puede ver. al recorrer sécuencialm ente la base de datos. SU3 regis­
tros están, en realidad, alm acenados según 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 ningún dato, pero se la incluye p ara ilu s tra r 3U empleo. Ob­
sérvese tam bién 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 hábito p ara so r desarrollado.

NOTA
no m io r-a com«mjco eo tste caostuio. «n ti i¡Uo 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 0U«K>} 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 irán aprendiendo. Loa dos capítulos s i­
guiente? le m o strarán cómo 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 bién a in te ra c tu a r
con el ratón, a cre a r m enús y a d is e ñ a r form ularios.
Á

Manipulación de
pantalla con ncurses
Este capitulo le p re se n ta al lector las ncurses (pronunciadas “ene-curse."' ■
unu iraplom entaaón libre de la clásica biblioteca de m anipulación 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 anipulación de la p a n talla T am bién contiene potentes rutinos
p ara m an ip u lar el ingreso de datos desde el teclado y el ratón, crear y ad m i­
n is tra r m últiples ven tan as y u tilizar m «nóa, formularios y paneles
Este capitulo cubre los siguientes terna*.
• Prestaciones de las ncurses
• Terminología y conceptos relacionados
• R utin as p a ra im cialización y term inación
• 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.
> ; ; ; • ) J ) ' » J > > > > > 1
Programación en Linux

Prestaciones de las ncurses


Las ncurses. cuyo nombre es en realidad u n a abreviatura áe “nuevas curses"
son clones de libre redistribución 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 título de dato anecdótico, significa
en inglés ‘"maldiciones") se deriva de la expresión "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 aplicación 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 características 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 anipulación de p antalla. En lu g ar de verse obligados a red actar una
gran cantidad do código 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 características que se en cu en tran on las aplicaciones gráficas de X
Window: múltiple» ventanas, form ularios, m enús 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 exhibición de loa datos, simplificando asi lo que habí-
tualm onte constituyo u n a ta rea de program ación difícil y especifica de la
aplicación 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 ación de m enús de las ncurses. La
versión utilizada en este libro es la 4.2, au n q u e a la fecha de publicación de!
mismo se encuentra en su e tap a b eta la versión 5.0.

Compilación 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 código 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 simbólico 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-
) ) ; t ) j ) i ) ) ) 7 ) ? ) J ) ) ) ) )

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 aplicación, utilice «curses.h> p erq u é, créase o no. ncurses no se encuen­
tr a disponible er. todas las p ista form as UNIX y afines a UNIX. Tam bién 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 opción - 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 opción predeterm inada, el seguim iento de errores, P a ra h a b ilitar la
depuración h a rá falta lin k ear la biblioteca de depuración de ncurses,
n c u r s e s _ g . y ya sea llam ar a t r a c e (N) en el código 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 depuración 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. má3 detallada, y per lo tanto m ás volum inosa, ¿erá la salid a de d e p u ra ­
ción. Los valores ú tiles p a ra N e stán docum entados en < n c u r s o s . h>. Por
ejemplo, el nivel de seguimiento están d ar. TRACE_OROENARY. es de 31.

li
r j r m i*i.o
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« o«L 3r>jrjju ««
/•
sm ola.e •/

• M n e tllo .e - m i* n c lU 9 can tKur»os


•/
#;r:i.C9 <curt«iid>
irt uin{*oid)
(

r«tum «;
>
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 próximo program a utiliza la biblioteca de depuración y recurre a un


par de otra.; llam adas adicionales a funciones a fin de g en erar u n a salida:
-• Moabr* d«I 3'ojraaa i<- IflTercíi: 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 Programación en Linux

W ltscr();

t ^ c t itracs. cau.sk
arirtirCEstibiecB'- nivel de daouracion para TRAC=_CALlS‘ );

«n * rtn U ;
rcturn 0 ;

>
Las lincas de comandos necesarias para com pilar y ejecutar este program a
son las siguientes:
J 3 CC Qíouracor.s -o «tpundor -lncursesj
S ,/dtpurador

Si uno es verdaderam ente rápido, 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 funaón do ncurses seo escrita al archivo t r a c e que m crea en el di­
rectora com ente A continuación se reproduce un Iranmuato de dicho archivo
. . . <4 r~ ’WCING MCUftSES v«riten 4.2 (952213»
prirw<*Em6Uc«r nival aa dapurtciee par# TftACE.CALLS*, . . > caii*ú
^ callad *a<Jdn»:r|a«0M?srB,*S»ta0 l«cer mvol de oepjracion para TfWC£_CAUS*. •i)
* A t i OA ... c u rr * d t (AJWRVALJ

^*:urn «
callea *r*frein{a<Mfl75r8|
clsarm j and uadatir-g tror 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^Quéts ae ncwttes viene con jn ¿u¡ón, tracem unch, que comprime y .-esurr^ ¡a ¡n-
formación de depuración ar un •'om’ atc más legiijie y amigable.
Capítulo 11 Manipulación de pantalla con ncurses 223

Terminología y Conceptos
E sta p a rte explica algunos de los térm 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 tísico 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 emulación 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 mía reo tam aüo que la pantalla.
La programación con ncuree'. w apoya en doa punteros a estructura* de datos
do patrón 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 reprft-
ser.ta lo que uno ve en la pantalla Puede se r sólo 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 año 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 función de ncursen ( r a í re s tti como a un
proceso lógico. La función r e í r e s h com para c u r s c r , la noción de ncurse3
sobre cómo 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 bién se r« fiera al proceso lógico 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 ubicación sea ésta *n la pantalla o en u n a v en tan a ; donde
será exhibido ei siguiente carácter En u n a p a n ta lla (la p an talla física de un
m onitor), cursor se refiere a la ubicación del cursor tísico. En u n a v en tan a
u n a v en tan a de ncurses ¡. cursor se refiero a la ubicación lógica donde sera
exhibido el siguiente carácter. En este capítulo, 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 disposición 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 LiÑE-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 núm ero de filas y colum nas, respectiva­
m ente, que corresponde al tam año 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.
)

’ 1 1 > > > > > > > > j j , ,

224 Programación en Linux

F ig u ra 11.1. Disposición 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 líneas y
colum nas tieno la v en tan a corriente.
r Ncitors <iai progr.iita «fl tnw n gt: co b ,c *f
r
• *:lü9ycolJnr.is.c ¿CuántM 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 )¡
prtntwf“Cantidad de linoas • W \n ', yj ; '
o rirtf»(‘ Cantioad do coluwas - W \ n \ x|¡
r * fr a « n ( ) ;
sleep(3);
4/id«inl);
rotum »;
J
La v en tan a que craa este program a ae encuentra ilu strad a en 13 figura 11-2.
> ) ) i ) )
) ) )
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’ están definidos de modo de utili­
zar s t d s c r como opción predeterm inada, exisrpn muchas 3Ítuacione» 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 ruünaa una convención sobrw nombres .-latemática y consisten­
tem ente aplicada que pueda 5er utilizado coa cualquier ventana. Laa funciones
que pueden operar en una v entana de tam año arbitrario llevan como prefijo «1
carácter 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
específica.

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 oeflrntíos ccn <-ra ckectlva «dof Lno quo en laa ilnmoflaa a ’a s
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 cabüxaca oa ncunas. Emtianoo desda la linca oe comnrdoa in
nss’jcoóngrep ‘« afin e* /usr/incluJ«/ncur3es.fiief*.aiarfloigfttWenQual.ia
rexsej utsuan macres y < sartr* tamo*én como un tx«n *«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 operación de E/S en una
dnica llam ada. E sto s ñm aonea propenden concatenan al comienzo en vez
de al final) la expresión 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 bién 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:-
ción es simple y contribuye a p od er u tilizar menos lin eas de program :
) ) ) ) ■ ) ' ) J ) J
228 Programación en Unux

éos«»io();

S . / in ic y tín in ^ c u rsB S

». i ----
í-------
SALI DA

Figura 11.3. Ventana obtenida con ncurses lucffo de ser tnictalizada.

Lía 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, ini-
cialico las ostructuras de datos de ncurses con la llam ada a i n i t s c r . (N or­
malmente uno guardaría ei puntero WINDOW " que retorna C3ta función
para uso posterior.) Por medio do la función p r í n t w (cubierta ».*n m ayor de­
tallo er. i.i próxima sección), «1 program a exhibe alguna salid a en la v entana
después 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 próximo titulo, “Term inación d«* ncurses", finaliza
el programa y libera les rucursos asignndoa por i n i t s c r

Term inación de n cu rses


Aates de salir de una aplicación 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 ini-
daüzación 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 terminación 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 patrón SCREEN, y ancos de que ningún 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 : Manipulación 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 gráfico 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
El siguiente program a de dem ostración, n u e v o t e n n i r a l , ilu stra la ¿niciaii-
ración y term inación de las ncurses por medio de new term y d e l s c r e e n .
M* L0 /• Noeíra 4ai 2 ros<-iaa «n £r,tem«t: 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, •• M JU } (
parr»r( ••Mwtirn*);
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;
sle«o{3);
3.-int»(, "5r*tA*r a n c n U varrtanaVn*);

rsíre sa o j
Programación en Linux

3 la e p ( 3 ) ;
•fld»ir.();
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 inte-
mctuando 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 convertiría
«n rI term inal corriente: de ahí In llam ada a s e t _ t e r n Si la llam ada iraca-
3», 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
código añadido 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 están
dnr de C np funcionan con las ventanas gen eradas por ucurses porque ncur-
ses 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 piaña. A los propósitos do é s­
te análisis, !».-< ru tin a s de salid a de las ncurses h an sido divididas en tres ca­
tegorías caracteres, cadenas y m isceláneas. Las secciones que siguen a con­
tinuación com entan cada una de dichas categorías en detalle.

S a lid a d e c a r a c t e r e s
La principal función do salid a de caracteres de ncurses es a d d c h , protocipa-
da en < n c u r s e s . h> como sigue:
iíit aadchícnt’/pe cr>|;
Casi tedas las demás funciones de salida de caracteres realizan su tarea m e­
diante llam adas a add ch . La función ad d ch exhibe e! carácter ch en la v en ta­
na corriente {habitualm ente s t d s c r ) a la a ltu ra de la posición corriente del
cursor y avanza este último hacia la posición siguiente. Si dicha acción fuese ?.
colocar el cursor m ás allá del m argen derecho, esta función lo desplaza auto­
m áticam ente h a d a el comienzo de la línea siguiente. S i el cursor estuviera
ubicado en !a últim a linea de la ventana, aparecerá autom áticam ente ia línea
siguiente. Si c f fuera un carácter de tabulación, ¿o nueva línea o de retroceso,
el cursor se desplazará acordemente. Los demás caracteres de control son
exhibidos empleando la notación -'X , donde X el carácter de que se tra te y ei
acento circunflejo (A) indica que el mismo es u n carácter de control. Si se nece­
Capsule 11: Manipulación de pantalla con ncurses 231

sita que si carácter ce control Heve efectivam ente a cabo su función 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-nefjoór ce las '■curses í? refera a 'as caracteres •peados en formato c h ty •


ce c<xt\) *5 $ewjocy->s»f*s* las ¡ x u r v » declaran .3 íes oseudoca-acteres canjo vaío-
•?í enteros s-'- s j r o m too lo .-g .. emo¡«a os &its superiores de ios rrismoa para orv
atfcíon*. taf con-o occ ejemplo sus gtnbutos de video. Esta cust'ncfOn
t m t 2 se-.*»c«ae:e'es y ca rá c te r nórmeles de C lef tco cftar) uon>senta sutiles dl-
V?>-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 dontío resulto adaejodo

Corno se mencionó anteriorm ente, m vaddch añude un caracter a la ventana


que se le especifique después de d esp lazar el c u n c r hacia la ubicación desea­
da; sw rad d c h combina un desplazam iento y una operación de salida hacia
una v en tan a especifica waddch exhibe u n carácter en una v en tan a especifica-
da por el usuario. La función 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 re-
tresh o a w re^resH . E sta combinación perm ite obtener im portantes mejoras
de desempeño cuando se la utiliza con caracteres que no sean do control.
U na característica particularm ente útil (que se discute a continuación) do las
rutinas de ncurses que utilizan la función 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 operación 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 Modo norm al de exhibición de caracteres
• A_STANDOüT U tiliza el mejor modo do resaltado dol term inal
• AJUNDERLINE Subrayado
• A_fi£VERSE Video inverso
• A_8LINK Texto parpadeante
• A_DIU Medio brillo
• A_80LD C aracteres en le tra n eg rita
• A _rwis Texto invisible
• A_CKARTEXT C rea una m áscara p ersonalizada de salid a del carácter
Sin em bargo, y ;-egún sean La capacidad ¿ e em ulación 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 página c u r s _ a t t r ( 3 ) del m anual p ara
obtener m ayor información al respecto.
Además de les caracteres de control y de los caracteres realzados con a trib u ­
tos de vídeo, las funciones de salida de caracteres tam bién pueden exhibir
caracteres gráneos de líneas 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
página c j r s _ 2 ascr- <3 1 dei m anual o en los apéndices de la m ayoría de los
} )■ ) i > ) ) • ) . ^ ) > ) ) > > > > > > > ) 1 *
232 Programación en Linux

libros de programación. Los nom bres de ¿as constantes em pleadas en Linux


para designarlos em piezan todos con ACS <Ascii Character Set). A contigua­
ción se listan algunos de los caracteres gráficos 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 (+ ) U L=Upper Left
• ACS_LLCORN£R E squina inferior izquierda (+ LL= Lower Left
• AC3JJRC0RNER E squina su p erio r derecha { +) ü B = U p p er Right
• ACS_LRCORNER Esquina inferior derecha ( +) LR=Lower Right
• ACS_HLINE Línea horizontal (—)
• ACS_VLINE Línea vertical ( | )
• ACS_8L0CK Signo de nu m eral W
Las funciones doscriptas h a sta a h o ra “artuden" efectivam ente caracteres t
una ventanu sin incidir sobre la ubicación de los dem ás caracteres que y a se
encuentran presentes. Existe otro grupo de n itin a3 quo in serta caracteres en
ubicacíonos 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 convención de nom bres com untada an terio rm en te en e s­
to mismo capítulo, cada una do e sta s funciono* insoria un carácter d elan te
(antea) dol carácter quo tic encuentre debajo do! cursor, desplazando los de
más caracteres una posición hacia la derecho Si el últim o carácter se e n ­
cu en tra sobre ol nuirgon derecho, so perderá. Obsérvese, sin em bargo, que la
posición del cursor no .10 modifica luogo de una operación de inserción. Las
inserciones e stá n totalm entedocum ontadas en la página 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 íivadtícnuiu y, int a , chtvfl« ChJ¡
int nv-»iaacR|»:N!>»/ *wui. in t y, int x, cíitypo ch),
int ecíiocharfcntypo ch);
lrtt *»cfcocn«r|*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 indicación 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 están 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 carácter, las
coordenadas (y. X) on las cuales se ubicarán el cursor y el carácter a se r ex­
hibidos ' incluyendo los atrib u to s opcionales).
> ), )

Cac.T-¡o 11: Manipulación 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 operación c e d e sp la z a m ie n to h a c ia ia ubicación (y, x) con u n a
o peración d e sa lid a

píos 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


¿ül ru tin a s c o m e n tad a s e n e s ta sección. P a ra lo g ra r a c o rta r e n a lg u n a m edida
í T cmTT o ¡os ejem plos, ei código 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 bién 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 ncurs«s cara ; a l i d a de car«ct*r«s */
•I

t in c ió n <ct»rsti.ft>
•incide* « irrso .ü »
I-J K lwfl* ••Jtlifcr.J.n*

; r t ¡uW(<ot<l)
(
ipp_lM t<|;

i fl Oí ftCX' i ;

IfliícnC*’ . A.SEVcftSÉH
av«accnt2. l , Z' . A_9X2);

e l« r();
«ifiaccíjtajcf, X‘ J;
• ijc c n u tís c r , Y A_?EV=RSéj;
■v««3ecn{*:s3cr, 2, ?. 2‘ A_3CU3¡;
rs frts n O ;
slt« p (3 |;
ip p _ e* ltn ;
>
Programación 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 carácter deseado y av an za el cursor. Li»í> dos


llam adas a w addch ilu stran cómo com binar los atributos de video con el ca ­
rácter a exhibir. El program a tam bién 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 cómo 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 diseñadores de las ncurses crearon una notación están 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 sólo S t r operan sobre cadenas e stán d ar de estilo C (term ina-
das 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 * , COnít 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: Manipulación de pantalla con ncurses 235

Todas ias fundones listadas copian c h s ' r a la v entana deseada comenzando


per la ubicación 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 línea 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 tíd c n r .s 'r y -rv w ad d cn n str- copian h a sta la cantidad de n caracteres, de­
teniéndose 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. Además, la cadena a la que 3e esté dando salida co ntinua­
rá desde el m argen izquierdo ds la lín ea siguiente, en lugar tío ser truncada.
En todo lo demái>, estas funciones se com portan igual que sus contrapar ton
c h ty p e de nom bres «emoiantes.
ir : MCítncofl*: 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 trt«tH 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 . Iftt « . ic o » ; c n a r * » : r ; r | ;
ir.: y, :n : x, con*? :nar * jír. tn t n |;

in i « v m c fiH rn iN O a tó * * tn , w t y in t *. ío n * t cn a r
m *vwtfO0i*r(«twOO«S •«ia. u>t y, tu: *„ eonst «Mr * itr, me n};
Recuerde s t r en estas rutinas es un arreglo e stán 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 ••jtilíc.'Ví.v

int
í
ir t n a , yt=x;
«IV »
i ) ) ) ) ) . ) ) ) ) ) ) ) ) ) ) ) ) }
Programación en Linux

E p a _ lr ir (};

• g etn ax yxístd 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 ’ s t r (> \ n ‘ ) ;

« l i n e (A C S J R .IH E , x n a x );

n v a c c jti* ( 3 , o , * 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 tru rc 3 d a > , n * , 2 0 > :

r e fr e s íif) ;

s io * D ( 3 ) ;

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(*!ie»iw ijr); / • 9r e qutt, on l a versión cruente en


Internet */

J5vwadd5tr(v9ntana to n o , 1 , I , ‘ Esta ner.su]o oo fioria apa re cer on una nu*va


víntara*);
«jnJ«J(venT.ina_:onpl 0, i, O, <1, 0. 8, 9, í | ;
toucnw.n|v.*ntana- te(tpl;

» r » ? r «a íH v o « t a n a _ :e n p | ¡

s l««P (3 J .

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 núm 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 ma-
cro. 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.


J ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) - ) > ) ' ) ' > )

Capftu o 11: Manipulación 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 isceláneas’ com prenden una extensa v ariedad de funcio­
nes. E n e sta p arte se com entarán 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 »níi Llamada a la función Dkgd (abreviatura de background,
fondo o segundo plano), cuyo prototipo es el siguiente:
m t skjciccns: cfltyp* caj;
c h es u n a combinación obtenida m ediante un 0 lógico del carácter 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:
cíkym set5«í0{«TS0C» *wín);
238 Programación en Linux

En este prototipo w in es la v en tan a e a cuestión. 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 página 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­
rácter 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-carácter 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 carácter correspondiente a laá líneas verticales.
L i función box os on realidnd un raacro, y ea u n a simplificación de la fun­
ción mito gonernl w b o rd e r, cuyo prototipo es:
w t bord<*-iwíNOW '« 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 función non loa siguientes, que son sencillos de re ­
cordar teniendo en cuenta que corresponden a las inicíalos de su descripción
en inglés:
• lS Coatado izquierdo Ueft aide)
• rs Costado derecho [right side)
• ts P arte superior (“ludo de arriba'* o top side)
• bs P a rte inferior ("lado de abajo" o bottom side)
• ti Esquina superior izquierda (top-left comer)
• tu E squina superior derecha (íop-right córner)
• bl E squina inferior izquierda (bottom-lcft. comer)
• b»* 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 perímetro.
Utilice la función h l i n e p ara tra z a r en la v en tan a corriente una línea hori­
zontal de longitud arb itra ria, v l i n e , análogam ente, tra za en la m ism a una
línea vertical de longitud arb itra ria.
n;¡.r«{cn’ ype e n , :n: n}¡
ín t vl¿na<chType en, n|¡

Siguiendo la convención de nom bres p ara las funciones de ncurses, se puede


tam bién especificar una v entana en la cual tra z a r lineas utilizando las fun­
ciones que se lista n a continuación:
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 anipulación do pantalla con ncurses 239

Si ur.o lo deseara, antes de dibujar la? co rresp o n d ien te líneas puede desplazar
ei cursor hacia una ubicación específica por medio de las siguientes funciones:
ir .-. T í h l i ^ 'i n t i. i3 t X, cftíyo< 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 operación de desplazam iento:
¿o; ■■/■nLl.sílWWOO» Ufin, ir? y, mt «, cñíyp» :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 línea, que
puede alca n zar ei máximo de la v en tan a U n to vertical como hor.zontalm en-
t*. Las funcionen de trazado de bordea L in e . oox y b o rd e a no modifican ia
posición 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 específicam ente la ubicación 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 posición co
m e n te del m iso » . La página 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 página o u r s _ o u t o p t s (3 ) contiene asim ism o infor­
mación relevante sobre el tem a
£1 ultimo conjunto de funciones m isceláneas 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:
mt ent«|voio);
mt •»!«);
mt citar(«oía);
mt «cieirí»!*»» *»mj;
mt clrto&otivow);
mt •cIrtoüot(«I>eOü •n o ):
mt cl.-towMvoio);
mt •cirtcM lííIK »* *»m);
El p a r de funciones e ~ a s e escribe espacios en blanco a cada posición 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
ubicación 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 posición 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 'rendición* er. la docum entación de las ncurses) es aplicado a cada
uno de ios espacios en blanco creados, l a correspondiente página del m a­
nual p a ra e sta ; punciones es c u r s _ c l e a r ( 3 ) .
) } ) ) ) ) ) ) • ) , ) ) ) ) ) ) ) ) ) } ) ) } ) }
240 Programación en Linux

E je m p lo
Este program a ilu stra el empleo de caracteres gráficos de líneas 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­
E JE M P L O zan el cursor u n 3 vez que tiene tu g ar la salida, y o tra s no. O bsérvese tam ­
bién que la fam ilia de funciones trazad o ras de líneas, 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 ubicación 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:SÉR);
hUn«<ACS_HLI.SE, xnax - 2>;
*vadacti{y.fitx I , 0 , ACS_Ll.COR.Scfl);

n l¿rn i¿C S_m .:N E , «»ax 2);

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 ) ;
) ) ) > ) ) } ) ) ) ) ) ) ) ) ) ) . ) ) ) ) ) > )

Capítulo 11: Manipulación de pantalla con ncurses 241

• y r.z t 3 - 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 ;


-2 f-ssn();
í 1?í s (3);

:l53r();
A C S.V '-ífS A_3C'-0. ACS_VU?<E ¡ A _ 30 10 , ACS_HLIKE A _ 30 10 ,
ACS r t i n e i 3 0 0 ), ACS UtCOWEfl ; A 301.0, ACS UBC0RN6H A 301.0,
Acs_acofW£f« : aJ b l d .
*cs.uíccfi.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 ¿unción m v v lm e mueve el cursor an tea do tra z a r


una lin ea vertical. D espués de to d as las complicaciones necesarias p a ra d i­
bu jar u n sim ple borde, la función 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 carácter predeterm inado que se em plea con cada argum ento, pero
cualquier carácter (y sus atrib u to s opcionales de video) tam bién servirá,
siem pre y cuando el mismo sea aceptado por el correspondiente em ulador de
term inal o el hard w are de video.
) ) ) } 1 1 1 1 } I

----------------------------------------- "

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 ütiíuartdo Uibordcr.

Rutinas de ingreso de datos


I-ia rutinas de ingreso de datos, tal como sucedía con las rutinas de «olida, com­
prenden diversos grupoc?. Este capítulo so concentra, sin embargo, sólo on entra­
da rencilla de caracteres y de cadenas por dos razonas. Primero y principal, las
rutinas que se comentarán en esta sección 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 mínimas 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 carácter por vez, retornando dicho carácter si
la operadón resulta exitosa o ERR si fracasa. Puede o no euviar el carácter obte­
nido a s t d s c r , segúr. sea que dicha operatoria se encuentre o no habilitada on
el term inal (por la misma razón, w getcn y sus variantes tam bién 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 envío se deberá llam ar a
n o e c h o . Se debe tener en cuenta que. con el envío de caracteres a s t d s c r ha­
bilitado, loa mismos son exhibidos por waddch er. una ventana er. la ubicación
corriente del cursor, que luego es desplazado una posición hacia !a derecha
La cuestión se complica aún m ás por el modo de en trad a de caracteres que se
encuentre vigente, eí cual determ ina la cantidad de procesamiento que efectúa
el kernel sobre dicha entrada an tes de que el programa reciba finalm ente el
carácter. Er. un programa que utiliza ncurses, uno generalm ente desea proce­
sa r por si mismo la mayoría 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 envía 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 oría, donde los va acumulando m ie n tras espera recibir un carácter 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 envía 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 “carácter siguiente*. AVf puedo req u erir se r repetida. Se­
gur, sean las necesidades de la aplicación, erm ode debería bastar. En uno de
loe s i l e n t e s program as de dem ostración, se utiliza erm otie y el envío do
caracteres a s t d s c r es habilitado y luego deshabilitado con ol fin de sim u ­
la r obtención oculta de contraseñas.

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 «/• C«r»m cn.c •/
/•
• ncvn_:> i-«vxtr.z - ^ukíOMí 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 • C;

in t 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{{puBT«ro ««ntSiU suOñfl(ttáser, 2, *0, y-ux / 3, (xmx • 4 3 )/ 2 )) "
>U_|
s * lir_ s ¿ _ * rro rfJu b »w * | ; I* e r r j j u i t , sn la v « r * U « presente en
Inte.*''*: •)
& 5 x ( p » m , A C S .W IH g , *CS_ h l : \ c ) ;
»vjrt0Mtr(p<irv:«ro_v*fltafU, ■. t , •C ao triseá s: *|¡
r.MCi*:!);
■r¿:s{(c = ?*::n{)) !• ‘\n- U i < W*) {
C32«rj¡ir-] = c;
«3 dCcü|purcero_vefftana, ” );
•.-€frssn{0«rtXiro_/«»tsKa);
> ) ) ) ) ) ) ) - ) ) ) > . ) ) ) ) ) ) ; ) ; > >
244 P ro g ra m a c ió n e n Linux

*
«cftoo;
caden3{i] = *\0 ;
•rr*fciísn<oi;rtero_veitar3);

nvw3rin:w<pumero_vsntar.a, I, I , 'Ss tiío o : cadena);


scxlauntarojíentana, *CS_VIINE, ACS_HL£>«£);
•i*«fr9sr í:unt«ro_ventana|;

s lM p {3 );
delwtn{punt«ro_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 contraseña y modo noecho.

F ig u ra 11.10. Exhibición de contraseña.


; ) í ) ) » j .* / t j " j i / / / t

Capitulo i i : Manipulación de pantalla con ncurses 245

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 declaración 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 línea
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 efectúa verifi­
cación de lim ites. se debería em plear en su reemplazo g e t n s t r , que acepta
un armamento adicional que especifica el número máximo 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 terminación, 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 máximo 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 carácter q u e q u iera se r ingresado después 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 lóS ca­
racteres que no se correspondan con los argum entos disponible» en ol campo
de form ato serán 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 rías precedidas por aw">.
Además, 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 páginas 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. cursgstr.c •/
r
• ftcv.“s_os::j-3«ni.c • Funciares ae icu riej pira ingreso úe cadenas. •/
/• Slt: íx ii -v;«rj_cotCiC9«ii cadena */
•t
»ircluíe ««olí».»»»
<Cj : ü í .1»
«i^clt-de <írno.P>
t ineljó* <»t'ing.“>
h -tcI.:* •jtilfc.’S.í»*

fCafiTB tAMAÁO.SLf 20
246 Programación en Unux

ln ; nain^ int argc, cnar *3f3v[])

(
Lie c, i * 3;
cnar ca<J«na(23];
cftar ♦pvat«ro_caoera;

a o o _ lo it ( » ¡
crnouelj;

prirtf*('Archivo para a b rir: *l¡

r * fr»s n (};
3«tn»:r(ea4«fla, rAVAíioeuF);
prifltw l’ 3* tlpao: xsln’ , endona);
r»fr*ah||;
»Uep(3|i

ir<(p»int«ro_ead#na - M lluclsi/oo f (citar) • rA*wto_8üF • i ) ) •• n u il }


ia U r _ n _ « r ro r| • nalloc'}; r *rr_q uit, « 1 :a v#ralon proíentf *n
tncarne» •/

p rm t* ( *lityrese su nc<iori>: *);


r«rr#sn<);
5 t:nítr{puniBro_cac«r>a1 2 0 } ¡
prin rW U ítfrfl ingrato: x s w , puntaro_cad«na);
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 envío 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 ría 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­
tación y el envío 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 carácter.
Capítulo 11: Manipulación de pantalla con ncurses 247

F ig u ra U A L Utilización 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 diseñada 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. aún poseo muchas
aplicaciones en modo texto (no-CUI) q u e son muy populares, do modo que
resu lta im portante com prender cómo re d a c ta r aplicaciones que m anipulen
la p an talla un modo texto El próximo cap itu lo continúa con la exploración
de las funciones de ncurses concentrándose en las qun son utilizadas para
em plear color, crear m enús, acep tar ingreso de datoa desde el ratón y tra za r
form ularios y paneles.
f ' i ) > • ) ! ) r ) ) ? t / ) ) ) ) ) ) )
Programación
avanzada con ncurses
E ste capítulo continúa con lo iniciado en el capítulo anterior. Explora m u ­
chas de laa características 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»:
• Utilización del 9ub3istema de color de las ncurses
• Creación y m anipulación av a n za d a de ventaniw
• Cómo in te ra ctu ar con el ratón
• Trabajo con m tn ú s
• U tilización 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 Programación en Linux

Utilización de color
Ya se ha visto que las ncurses aceptan varios modos de resaltado. Como dato
interesante, tam bién adm ite color de la "misma m anera; es dedr. uno puede
efectuar un 0 lógico del valor deseado de color con los argum entos que corres­
pondan al carácter en un3 función addch o cualquier otra ra tin a de salida
(c h ty p e ) que acepto pseudo-caracteres como argum entos. Este método resulta
tedioso, sin embargo, de modo que las ncurses tam bién disponen de un conjun­
to de rutinas p ara establecer los atributas de pantalla ventana por ventana.
También para utilizar las prestaciones p ara color do laa ncurses, uno debe ase­
gurarse de que el term inal corriente adm ita color. La fundón 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 n»t_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 numérico 2)
• COLOR GREEN (verde, valor num érico 3)
• COLOR_YELLOW ¡.amarillo, valor num érico 4)
• C0L0R_8LUE (azul, valor numérico ¿)
• COLQR_\IAGENTA (m agenta o p ú rp u ra, valor numérico 6 )
• COLOR_CYAM (cian o azul verdoso, valor num érico 7)
• COLORJVHITE (blanco, valor num érico 8 )
D espués de haber determ inado que el term in al efectivam ente adm ite color
se deberá llam ar a la función 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*j¡lzan 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 acción asocia los p ares de colores a ios colores
de la lista anterior. La función 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 función 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: Programación 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 y a t t r o f f . Los
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 ) ;

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 lógico
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 lín e a s do colorea
•0*'. »rogr*B« *« Int«rn«t: c o lo r .c . */
(¿IMPLO • fcít* prog-*aaa m junto cor. ; o j d * l C a p itu lo t t v
r
• s o le r .c - AC*líU*tr»eio« 3*1 c o lo r con ncunjt»
•;
íir c lu d # *-»tello.n>
ilfC lu O * <cyr»t».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 , *a«y,
y it .£SC€ \fOJ»G- 2, 3, Cl>.N_*EOAO- «,
BLAttOJtfOM)* 5. S. t í lí. N B f lO - 7, AUASt'.I.O.SEGPO* 8
tftir • s y r» tíra _ t4 0 s ra ;

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 t e r a i u l *e a a n t a c c l c r 'n * ) ;
ra fre in f);

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 — íflfi
s a l i r 5i _ r r r o r ( • 3 T í r t _ c o l o r , t ; • « rrjjy it, in .a v e rs ió n p re s e n ta 9n
In te rn e t V

• 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, CCLCPáLAOO;
i r i : _ : i . - vSPCS.NéSftO, Cet©P_Gft€3<. CCL0RJ3LACK);
.. / > / / ¡ t .1 j t ) ) i ) y f ) j 1 } 1
252 Programación en Linux

in i t j)aLr(ROJO_HEGRQ, COLORJ c O . CO LO fljW CX);

lflit_D4ir(CíAM _NE0a0, COLOlNr'AV, CC:- 0R_5W CK};


in it.Falr(gU N C O _N E5aO , C a O R JíH IT S , cr,LCfl_3'-ACK):

iritjjairlW AG EN TA JtEG R í), CCLCTJÍAGEVrA, COlCa_BLAC<,1 ;


L«it_f¡air(A2ÜL_NEGfiO, CO tO RJUJE, CCCÓR.BLACK?;
l.-u:_paÍrfAJMfln.LO_NE(iHOt CCt.OR_r=LLO(», COtORJLACK} ¡

•;atnaxyx(3td$cr, naxv xaxx};


ií{(w ntoro_cadera - «allocfsizeofí«nar> • nsxxj) == SULLI
s a ilr s i e r n } r (’ *ali</C'); !• g rr q u it, on la versión nr esente on Internet

fcrtr. = i ; (i <• 3; i**l { /• Estos sor lo í códigos de los colores »n ;a


lista de la o«Q. 250 •/
-enaítiourtero c n d ^ i, ACS 0LOCX, naxxl; /* Ver *ibla de ACS en Cíp. 11.
oaj. 232 •;

»ffrcn(CüLOR_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>;

4PP„«XI«()¡
*»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 aplica-
d in de colore» ei programa tcrminu. Luego do micializar los pares de colores,
oíectila algunas asignaciones simples de color utilizando m i t j : a i r Después,
d programa dibuja lineas en el term inal, compuestas por el carácter
9 :.ACS_8 LOCK). utilizando nem sat y a t t r o n para establecer los atributos co-
rreapondientes do exhibición 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 manipulación de los atrib u to s de la exhibición en ventanas. Los mismos
están totalm ente docum entados en la página del m an u al correspondiente a
c u rs _ 2 t t . '\ Las páginas del m anual que corresponden a C u r s _ c o lo r co­
mentan con aumo detalle la interfaz de m anipulación 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 sólo como tonalidades de gris.
) ) } J ) J J . I J t ) )

C apíraio 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 253

F ig u r e 12.1. ncurses usa color en u n a term inal de coloras apta.

Administración 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 anipulación do v e n ta n a s que se com entan en e sta se c ­
ción 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 «*(wrífleamenw, a» -c u n o » mano|.in les códigos tic
wsrro f rr.»r*ra r*jy cástrente: 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 función 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 patrón WINDOW ya existente.
E ste subconjunto puede incluir toda ia v e n tan a o sólo parte de ella Los sub-
ventan as. tam bién 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 autónom a* o independientes se crean m ediante la fun­
ción nemmin. E sta ¿unción reto m a u n puntero a una nueva estru ctu ra de p a ­
trón «INCOtf que nu tiene ninguna relación 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 explícitam ente. La función newrtin añade al re p er­
torio de programación potentes prestaciones de manipulación de pan talla pe­
ro. como resu lta frecuentem ente el caso con el poder añadido, 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 explícitam ente su exhibición en
la pantalla, en tan to que la actualización de las sub-ventanas es autom ática.

254 Programación 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 :
WIWí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 referencia-
da 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 raúxna 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 » para gestión ae
»uB-v*nt<m* •/
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>
«incluís •uulfcns.ft,

in : nain(void)
(
WlíitJCW *ventana_ni]a;
in t y w x , xa¿x, n = 0;

wbjcgd(5tascr, X > ;
w re fr3 s n (s ta s c rj;
= si;Ewini3W scr, v i, 10, z, 3)) w ll)
s a i i r ^ á i j í r r o f ^ 's u t r n i n ') ; I ' « r r q m t , en la v e rs ió n p re se n te en
in te rn e t ' /
■tokgdfventanajtija, 1 •};
«p rin tw ív tn ta n a j’. i j a , *\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 : - y*at , 133»J,


• P llíf n < t r « - !») {

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 ayúsculas, y luego so croa una
sub-vontana on blanco de 10 filos por 10 colum nas. D espués de im prim ir on
ella ia palab ra SUB - VENTANA, la ultim a p a rte del program a mueve la aub-
v en ta n a dentro de su v en tan a m adre O bsérvese quo como el contenido do la
ñub-vent-ana nunca cam bia, sólo re su lta necesario refrescar la v entana m a­
dre. Debido a la n aturale^.i dinám ica de la salida de este program a, on la fi­
gu ra 1 2 - 2 sólo 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 relación 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 ) ;
Programación 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 función
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 hüCk •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
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
IOMrn«c •!
n vv«jrim w {puft:ero.,ven tana1 5 , 1 , ‘ NúSV* V E N W W |;
s o m p u rts r o v ír it w a . AC3 V L I í í , AC3 HUME}; /* v e r TaDla an A'JS en Cap 11
•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: Programación avanzada con ncurses 257

;5tci*yxí£tc3cr, yvax, xnax); v


s-.Tníi(*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 código pero al mismo tiem po le
b n n d a al lector algo más 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 ejecución, por lo que
la figura 12-3 representa m solo estado de la m ism a d u ran te ln ejecución.

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 ratón


La capacidad de responder ai ra tó n constituye estrictam ente u n a extensión
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­
ción, e s ta p arte m ostrará cómo 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.
Programación 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 cód'gc relacionado con o: ratón cor. una ex
presión < * ifd e f/ «e ls e / ^ e rd if, de modo que e< programa r>o soa comprado en un si?,
tema que no utíüce ncurses. Ce hecto, el mejor diseño es o! Que aísle las secciones del
cótf&o fuerte relacionadas con e< ratón en tan pocos módulos de corr^> nación coroclonaI
ccrra restfte pcs&e (prefooO¡emento sóio uno). Por ejenp-'o. para compilar de manera
condicional cótfga para el ratón, v.T';ice una construociór que so asemejo a la siguiente;
XC(JflS£S_WUSE_VERSlCN
r
• 51 te aan Lis conciciones para ¡tcoptar ol ratan
• ei cotíigo que involucra al ratón l * u aquí
*I
«ola*
r
• Si el ratón no sudta&e ior aceptado
• Colocar aqui algún rotoío alternativo
•I
«endif
St el sistemo admito «I uno dol ratón, m « I f d o f ev.iiuiKft n 1 (vrroncero) y v¡ ejecuta
ra la sección do código quo vwrne despuós de M tfd o f, En coso contrate 'o auo so 0J0-
cutará sera «1 blequo Oe código que viore denpuéa 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 básico a seguir pitra u tilizar la interfaz de ratón es razona­
blem ente simple. P ara h abilitar la detección de las acciones dul ratón se debe­
rá llam ar a la función inousemasfc. Con el ratón activo, los lazos presentes en
el program a deberán e sta r atentos al valor retom ado KEY_M0US6 de w g etcn ,
que indica quo so encuentra en cola de espera una ucción del ratón. P ara ex­
tra e r la ucción de dicha cola de espera, utilice la función 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, según sea el e n ­
torno de programación, 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 Ma-
yús, A lt y Ctrl. P a ra ingresar acciones del ratón, se debe esta r ejecutando ya
sea gpn ( 1 ) , ol servidor p a ra ratón 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 través del servidor X.

PRECAUCIÓN
-ámen'ao.eíT’ente. la mayoría ae las versiones do gpm, el controí&dor ce consola psra
■atón. oue nace funcionar el contrcíacior de ratón de ;bs ncurses. están íinK.eadas con la
biblioteca de clises BSD (li b c u r s e s . [ a. s o ¡ ). Como resultado de olio, o! código di-
ser seo oara administrare ratón 00 funciona adecuadamente fuera del c^Mro. Psra lo­
g re aue óircicre cor-sctamente. se ceoe descargar y recompiiar el cóc.-go fuente oe
as ncurses que viene cor a correspondiente distribución y luego reconstruir ei caer-on
y a Oibiioteca (lib g p a ) del gp>n. Unkeéndoia con las ncurses asi reoonstruicas.
Capítulo 12: Programación avanzada con ncurses 259

DETECCION OE ACCIONES DEL RATÓN


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 página del m anual
curs_ -!cuse (3 ).

Tabia 12.1. ¡nfcrrrg de tas -curses scQn¡ a c c c n e s de! ratón.__________ _


Nombre descriptivo Acción que es Informada ________________________
BUTTON1..PPESSEO Botón * leal ratón oprimido
3UTT0N: _RELE>$60 Botón *l<3e» ratón iieoraco
BUTTOW..CLICKcO 3 otór * ld o i ratón efectuó clic
SU TTON1_00C8L£ _CLICXEO Botan a m e : ratón efectuó doote cifc
91TT0N1._Tfl[PL£_CLICK£9 Botón •lfifll ratón ífectuó tnpie clic
9UTT0N2_PRESSc0 3ot*n *2del ratón oprimido
8u r r o s 2 ..RELEASEO Botón «2¿0l 'a tó n liberado
3UTT0N2._CLICXEO Botón *2 gc< ratón ofectuó elle
3UTT0N2_00UBLE_Cl. IC<£0 Botón «20o» ratón efectuó dco<e clic
5vTT0N2._ ? R IP L 6 _ a ICXEO Botón *2del ratón efectuó tnpfe cl«c
8UTT0N3_RRESSE0 Botón •3del ratón opnm<jo
8 u tto n 3..RELEASEO Botón •3o«i ratón liberado
3JJTT0N3._CLICXEO Betón *3cei ratón ofectuó cilc
3UTTON3_OX.-8t.E_Cl. ICXEO Betón »3ooi ratón efectuó doble clic
8UTT0N3._TR¡PLE_aiC X EO Botón *3ú«» ratón ofectuó tnpíe ctic
SUTTON_S h I F T Durarte el cam&.o de estado del {jaron estaoa oprimida
ia :ecia Mayús
3UTT0 n _C TR L Durante ei cambio oe es:aoo cei botón estaba oprimida
13 tecla Ctrl
3UTTC'N_ALT Durarte el cambie oe estado de( ootóa estabn oprimías
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 ratón
£1 botón de ratón =1 es el botón de la izquierda; el botón #2 es el botón del m e­
dio en un ratón de eres botones o el botón de la derecha en u n ratón de dos bo­
lones. e! botón de rató n *3 es el botón de la derecha en ambos tipos de ratón.

3 JJ j . E je m p lo
- :. i y Este program a d em u estra el procedim iento básico de intercepción o inter-
,- ^ 1 pret¿ción de acciones de ratón en un p ro g ram a ncurses.
ejIM Pio ' -.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 - s e n c i llo 25 -in te rc o c c ic ? 3= ic n o n a s da •joüsc
2=-2t5Tts : c . r i í i

L
> ) ) ) ) ) ) ) ) ) > ) > >
260 Programación 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? aám(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 •/
/* cSt-JO lecer 3tdSCr •/
k 9 y o a d |* M s c r. rnuE); /* 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
ü 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 1' o 5 * /


• n il« ( 't o u p p o r ic o d ig o _ a 3 c i: • Q etclM ))) I - *S ' l { S a l i r •/
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 :
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 botón 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 {) ; D s sa c tiv a « d o cb roak */
a p p _ e x ltO ;
) J ) ) ) ) ) ) ) ) ) ) > ) ) ) ) . ) ) J ) } ) )

Caoítuio 12: Programación avanzada con ncurses 281

9X¿t{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 ayoría 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 ratón, lo que e v ita que tenga que decodificarlas el propio
p ro sram ad er v su código fuente se llene de montones de símbolos sim ilares
a * [ (U# 1 ).
D espués 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 acción del
ratón p a ra interceptarla. La m era acción de oprim ir uno de I03 tres botones
del rató n g en era el m ensaje correspondiente; si la acción 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 . Ti-
oeando ’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 botón del
ratón 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. Intercepción de acciones de ratón con la interfaz para ratón de.


ncurses.

DETECCIÓN DE LA UBICACIÓN DEL RATÓN


Adem as de poder in te rp re ta r acciones individuales del ratón tales como clics
y dobles clics, la API de ncurses p a ra rató n tam bién le perm ite a uno d e te r­
m in ar sobre en cuál de las ventar-as e stá ubicado e! ratón y las coordenadas
c o m e n te s de su cursor.
La función « a n c ló s e le perm ite al Lector d eterm in ar en qué v en tan a tuvo
lugar la acción 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 v£RCAOERO 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.
Programación en Linux

P ara determ in ar las coordenadas en donde se ha llevado a cabo u n a acción


del ratón, exam ine los miembros x, y y z de la e stru c tu ra de patrón
MEVENT La estru c tu ra completa está definida como sigue:
tysac*' struct <
jfxsrt ta; f ¡0 áíttinguisfiing itultío ls «ice •/
i 1'? *. yi i ; /* evw t coaroinates */
w733H_t ostate: /• button stat9 b its */
) WEVéMT;

Do acuerdo con la docum entación de las ncurses (específicamente. 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 trackbaihc 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
Est«* ejemplo crea dos ven tan as sensibles a la presencia de un ratón. C uando
uno hace clic en una de los ventanua, el program a exhibe en qué ventuna tu ­
t J t M P lO vo lu g ar dicha acción y m u estra las coordenadas correspondientes en In ven­
ta n a adecuada.
/• Vc«cr* ¿el proflrtni» en Internet: ua«HWa#.C 'I
r
/•
• icu rstjM ta n 2 .c • Progran* sencillo de intercepción 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
<
nnóSK.t «aseara;
ygvéNT accion_raton;
WIKOOW •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; '• in te rp re t a n p u lsa c io n e s Je t e c l a s y


c c T e r*$ a * r a t a o v

* v o r im s ( 2 , t , ' V c k 'ía j • • • \ i r t n ’ ) ;

& © *<st4 sc-. * c s * c s _ - i . t r < c > :

/ • Csts&lKtr l a «u»»a 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 /• *pr q u it, en la v*rsxo« pasante en
lr t * r n » t • /

♦ « itíE x r r ^ A t u JK ) :

} « ln {
■« y3*31 Ccmt» ra_v ent ana, ffiUgl;
«vwprmt«(p^'*.:*ra_4*ntana, 2, l , •••• V&TANA 2

a0i(p^it*f0_v«nt«fU, 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 op ^ i a i i a S •/

* 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 ) ) ) * -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 , ‘ A cción s a t e e t a c a «n


v e r* a r a 2 \n * ):

» / « r iP t» ( 0 w ftte r 3 va n tan a , -i. i ,


*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 » ( '* , ’ 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 ,


5 s c io o _ - a t s r .il;

}
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é);
J ) ! I > ! ) f ) l } ) ) ) > ) > •

264 Programación en Linux

re fre s n (J;
*refresh(pontero_yéptana);
slesp<2>;

>
aocDí’íi'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 Ubicación de la ventana y »u$ cw rdenadas donde w encuentra,


el ratón,

Corno se puede ver dol program a de domoatraciófl, p ara utilizar el rató n so


requiere un poco m ás do acciones prelim inares quo lo habitual, pero ol códi­
go do detección 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 diferenciación do los
miembro* de la estru ctu ra p ara o btener la acción del ratón es muy sencilla,
tal como 3e aprecia en las dos llam adas a woncloHo.
Nótese que ei programa tam bién utiliza las abreviaturas de fundón com enta­
da anteriorm ente, m v p rin tw y m vv/pnntw , pura reducir el numero de lineas
de código a itsr tipeadas. O b sérv en quo las coordenadas listadas en la segun­
da ventana son relativas a la pantalla original, denominada VENTANA1 en e!
programa.

Utilización de menús
La biblioteca de menús de las ncurses provee prestariones independientes de
term inal para crear sistem as de m enús en term inales de modo texto. Las mas-
mas incluyen funciones para crear y modificar ítem s de menú y para agrupar
ítems en menús. exhibir ios menús 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 código correspondientes a
j > ) j ? f ) ) } 1 ) ) J . » i ) i > ))
Capítulo 12: Programación avanzada con ncurses 265

los m enús se debe llam ar prim ero a L n i t s c r . P a ra poder utilizar la bibliote­


ca de m enús se debe incluir en el código 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 enús son presentaciones de p a n ta lla que perm iten a los u suarios o p ta r
por alg u n a acción o ¡te n - n tre un conjunto de acciones o ítem s posibles. La
biblioteca de m enús de las ncurses o p era creando conjuntos de ítem s que son
luego agrupados y añadidos 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 bién 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 enús se asem eja a lo siguiente:
1. Inicializar las ncurses.
2. U tilizar la función n ew _ item p u ra crear ítem s de menú.
3. U tilizar la función n e w jn en u p a ra c rear el menú en sf.
•i. U tilizar la fu ndón 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 continuación se listan las funciones y m acros necesarios p a ra crea r m e­
aús. Las n-mm<v< se explican en d eta lle en los párrafos posteriores.
ITEM • n * B _ i: « e ( c e 'm e r a r • « « # • . :o n j * cnar •a « s « r:e tlo n } ;
i*: fr«o_tt«*i:TQi •»*■);
nemj ’.'lu
in t *r*«_wny|tÉMj
int iMEXj •««<.. ifltin: coI j )¡
ir t
int ‘«nu);
m t wj^criverfUEJiil • m n , in t c);
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
parám 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 algún 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.GüMENT si se detectó algún argum en-
266 Programación en Unux

to que era Inválido por alguna razón, 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_n»nu crea un menú nuevo que contiene ei m enú transferido en itetns.
O b sérv en que ítem s debe e sta r term inado en NULL (ver el program a de de­
mostración que viene después). La función retorna un puntero hacia la es­
tru ctu ra de menú recién 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 todavía 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 función 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 Deacripclén
£_6A D _S T a T£ La función fue llamada desde una rutina 3c mc.aiuaoón o do
terminación

E.NO.ftOOM El menú es demasiado grande para su ventana

£_N 0 T_P 0 S TE0 La función u n p o s t jn e n u fue llamada desee ura ventana don­
de ya se haoia quitado el menú

E_N 0T CONNECTSO No hay ítems conectados al menú

se t_ m e n u _ fo rm á t establece el máximo tam año de exhibición 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 función retom a
E_0K si tiene éxito o uno de los valores E_SYSTEM_ERROR, E_BAD_ARGUMENT
o E_P0STED si ocurre algún error.
’ie n u _ d r iv e r , el verdadero núcleo de la biblioteca de m enús de las n cu r­
ses. adm in istra toda en trad a al m enú basándose en el valor de c. Es respon­
sabilidad del program ador canalizar todas las e n tra d a s asociadas con los
menús a m e n j_ d r iv e r El p arám etro c alm acena la acción o requerim iento
asociados enn dicha en trad a. Los requerim ientos a menu_ariver caen en
una de las siguientes tres categorías:
• R equerim iento de navegación por el m enú.
• C arácter especial KEY_M0ÚSE generado por u n a acción del ratón.
• C arácter ASCII imprimible.
U n requerim iento de navegación corresponde a las pulsaciones de iss teciss
de- movimiento del cursor, tales como ñocha arrib a o flecha abajo. Los reque-
>

Capítulo 12: Programación avanzada con ncursos 267

rim ientos de K£Y_UOUSS son las acciones de ratón 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 búsqueda 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 página m e n u _ d riv e r del
m anuaL En ei siguiente program a de dem ostración 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 #r Intem eir uj**#mj.c */
/•
• w a jM ^ a .e - u t l l i í í c u n at le* i«ny* provisto» 00*“ neurita
•I
< cu m i.it>
#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*, ’MGO', ‘Ccorj'.
•S M r« r\ * ? M r r , ’ LCfl# S t a r ’ , *Aair.t»r*, ‘ C a rla o n ’ , « r . l

i;
co*5t : m r •*pcfltír<j_cervMss;
m : c>3i$o_3sc:i:
■Tai (c*rr«i*s)];
rríll '•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 * /
Ííy2»3ís-:cíc.', T31S;; /* i t s m terprsTar pulsaciones 3e te d a s y
M t - y ü 3e ratón ‘

’ '-t i~ ;* t» 3 2 i ZSKJ '

* ; r '- . - : r - : _ : r r . = : a s = cervezas; •D^t«ro_ca*vei¿s: ou.-nero.cervszas - - )


) } ) \ t ¡ y ) / 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_n«nu(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* I {

lf{ c c < íig o _ a s c ii =* k é y jx w n ; ; 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, fi£0_UP_ l TEM);

>

/* 3 # tlra r «1 nitmj •/

un poi:_n«flu(nijM nu|;

/• L ib e rar r« c u n o j ujigrtiiíios n nonu y a Uc.t* do sunu 'I


frÉ»c_,T«nu|ni_n«nü) ;

foripuntaro ttons * xtuns; *punr.i>ro_lc«»B; puntcro_::onn**)


frM _ L títi( *pu/i:ero_lto»a);

r F i/ ia lt ia r la s ncur9es •/
k«ypac(stOscr, FAlSE};

a p p _ « x it ( J¡

♦xitl=X IT_FA ILU fiE};

>
La salida generada por u n a corrida de dem ostración de este program a ¿e
m uestra en la figura 12-6.
) ) ) ) ! ? ) J ) ¡ ) i > > ? ) ) 1 ) ) ) ) ) \
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 269

F ig u ra 12.6. Utilización de la biblioteca de m enús de la s ncurses.


La prim era cosa que realiza este p ro g ram a os crear un arreglo estático de
texto que se convertirá luego en el m en ú , lo mismo que o tras variables que
serán utilizadas. U tiliza la fu ndón k e y p ad p ara in te rp re ta r ias teclas alfa-
num éricas y las teclas de cu rso r Luego, recorre el arreglo estático de texto,
extrayendo cada una de las cadenas contunidaa en el arreglo y añadiéndola
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 cúmo 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 inifitraaón
de todas las tareas de refrescado y cié actualización 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 núcleo 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 función
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
señal KSY_DCV»N 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_ r¡en 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 .

Utilización 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 diseño de e sta biblioteca es análogo
270 Programación en Unux

al de la biblioteca de menús: la s ru tin a s p a ra diseño 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 ha-
cea 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 enús. 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¡ código fuente
el archivo de encabezado < fo rm . h> y vin cu lar li b f o r m al código objeto, co­
mo lo m u estra e sta invocación de gcc:
S 5^- B pi'og^fornulartc.c -O <5ro3_forwlari.o lío 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 función new f ie Id p a ra crear Ion diveraoa campos.
3. U tilizar la función new _f orm para cre ar el formulario,
4. U tilizar la función p o s t_ fo rm paro ubicar el form ulario en posición
5. Riíñvscnr 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 enús. 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 más tareas que ei que fue
empleado con la biblioteca de menúg. La complicación adicional vale sin em ­
bargo la pena, en comparación con ten er que escribir uno mismo su bibliote­
ca de manejo de formularios.
Las ru tin a s listad as a continuación, y explicadas en los párrafos siguientes,
resu ltan suficientes p ara que el lector pueda com enzar a realizar form ula­
rios sim ples pero funcionales:
?:EL0 '.•ItfUftt Héiont, tnt mdtn. í i t toprcw, int lo 'tc o l, :n : oífscreer,
i n : m u ffe rs ).
in t *rre__»leio(F;=!.0 ‘ f iíf 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(FÍSL0 m* opxs);
inr set^UeifljiserptriFTEUl jqíú •üssrptr);
•/ais »fi.dlO _i> ser3tr(FIE L O Ff i 8 l d J ;
FOMI v.*w_fomíPIELD " f ia lt ís ) ;
C^pftuio 12: Programación 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 núm ero do buífors 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 función retom a E_OK
tiene éxito y E^SYSTEM^ERROR o £_SAC_ARGUMENT ai w produce algún 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 señala la ubicación 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 algún, 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 , después du una llam ada a
r e f re 5 h o alguna fu ndón similar.
u n p o s t _ 'o r'"! re tira el formulario de la ventana. E sta función retorna.E_OK
s: tiene éxito. Si ocurre algún 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 buñer 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 demás 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
válidas p a ra * i e i d e stán activadas como opción 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 señalados 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 cíe ñe-'d que se ouecen desactivar._________________________ _
Opción_________ Descripción_______________________________________ _____________
0 _ V !S I3 L E 3 campo es e*riC*dO.
C _ * C TIV E 3 campo será visitado d u a nte el precesam-ento. Un ;amco invisible
re puede Se' visitaGo.
continúa
272 Programación en Unux

Tabla 12.3 . Continuación


O pción D escripción
0 _P U 8 LIC Ei contenido c‘e¡ campo es exhibido durante te entrada de 33tcs.
0 _ E D íT El c3mpo puede ser editado.
OjVRAP Las palacras que no quepan en una línea pasan 3 la linea Siguióte.
0_8LANK El campo será borrado Cuando so ingrese un carácter en su orrners
posición.
0_AUT0SKiP Cusrvdo un campo so llor.a. pasar automáticamente al siguiente.
O.NULLOK =>ermitir campos en blanco.
0_S"ATIC Los buffers para cada campo se fijan al tamaño origina; del mismo.
C_PASSOK Valida la fech3 sólo $< ésta resulta modificada.
E je m p lo
La m ayoría 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 i»o de 'o r a u la r lo s
■/
* ireludo <curs«*.h>
»:rclud» <fonn.h>
#tnclu<J# <$Wli8.h>
»:rciud» <ctyco.n> r »ara tsprinc<) */
nrc'.ufle 'utllícn»,l>*

: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 •/
'xaypacistascr, rsuE}; /* f'ernitB íntararotar polsacionas de :a c ia í y
natcfl«s da ratón •/

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{canposí3], a, ’ Prinar noaare: ’ ) ;
set_íiai3_Gpt3!C3BC03¡8], t leld^optsícaapflsM ) 4 -0_ACTlVÉ);

c a T c c s [t | = new _fi9id(I, 23, 1 , ia , 0. 3);


f ' t * * t / f } f y y J J / >• . J J ) ) ) i
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 273

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, *¿0«IUO9 : *):
í 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 :

t9«C 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*fca«pM | ;
p o i? í » “ B |c a c o G 3 ;, * =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
H ftt llil "
r* fr* s r(); • é 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
p a n t a lla •/

/• 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 — x£ y _ ppa 66>

? o r * _ a r i v e r | f o r m l a r t o , REOJ>REV_FIElO);
e lt « if(cooigo a ic ll — \n‘ ¡ ¡ cofligo M C I! •• KEYJXNM ; j codlgo^jocU
• * <EY_*«PACé|

• c r s j n - í t r f c r i u l a n c . KEOjl©CT_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 , a£a.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_CCft«MO),

.:% < 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, fíls 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 código fíjente de este program a,
observe la figura 12-7, que m u estra a este p rogram a en acción. O btendrá as;
u n a mucho mejor apreciación de la m anora en que óste trabaja, tal vez. a\
construye ei program a. Utilice las teclas flecha ahajo o Av Pág p ara a v an zar
al campo siguiente, las teclas flecha arrib a o Re Pág 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 inicialización 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 mayoría de las pulsaciones de teclas hacia la
aplicación sin previam ente procesarlas. El fragm ento de código fuente que
viene luego crea cinco campos, o sea dos rótulos 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 aplicación procesa todas las
pulsaciones de teclas que reabe. La pulsación de las teclas flecha arrib a o Re
Pág (interpretadas como KEYJ J P o KEY_PPAGE) es redirigida a un pedida de
desplazamiento hacia el campo anterior •;REQ_PREV_FIELD). Análogamente, la
pulsación de las teclas de flecha abajo y Av Pág conduce a ur. pedido de avance
hacia ei campo .siguiente tREQ_NEXT_FIELD). £1 program a también perm ite ei
empleo de la cecla de retroceso, redirigiendo su pulsación hacia REG_CE'_ -
_PREV, que borra el carácter 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: Programación 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 próxim o capitulo, “L a API de sonido:
O SS’T ree". continúa con tíl recorrido de la s interfaces de program ación 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 podían obtener sólo como dispositivos com plem entarios o accesorios
add-ons) que se instalaban después 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) algún tipo de h ard w a re de sonido. E ste capítulo enseña loa
fundam entos de la programación de u n a ta rje ta de sonido. El miamo ofrece
un breve panoram a general de la tecnología de ias tarjetas de sonido y luego
comienza con el análisis de la API d« sonido de Linux OSS/Free (Opcn Sourcc
Sound/F nre ®n español Sonido da código fuente abierto/Gratis):
E ste capítulo cubro los siguientes tom as:
• Descripción 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 anipulación de dispositivos m ezcladores
• Program ación del hard w are p a ra MIDI
• Redacción de program as de reproducción de sonido
• Presentación 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 núm ero de ISBN' 0789722161.
278 Programación en Unux

Generalidades
Las tarjetas de sonido no son dispositivos de hardw are monolíticos. Por el
contrario, 3e hallan formados por varios componentes. Aunque existe u n a con­
siderable variedad de diseños entre los distintos fabricantes, y h a sta en las
tarjetas producidas por un mismo fabricante, la mayoría de ellas cuenta con
una interfaz MIDI, un digitalizador de voz, un dispositivo mezclador o ntixer y
un sintotizador La comunicación 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 bién «quipos do iluminación y otros acceso­
rio» de empleo en espectáculos.
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 micrófonos 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 según 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 sinteti-
zadores com prenden dos categorías. Uno de loa grupos esta basado en Jos
chips Yamaha OPL2 y OPL3, que son los empleados en la mayoría 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 núm ero N. general­
m ente Z, 1 o 2. al cual es vinculado simbólicam ente el nombre de dispositivo.
Por ejemplo, en mi sistem a, /d e v /m ix e r es un vinculo simbólico a
/ íe v /m ix e rfl. El resto de este capítulo, excepto cuando sea necesario alu d ir
a archivos .específicos de dispositivo, hace referencia a vínculos simbólicos,
/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
opción predeterm inada la codificación 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 codificación lineal sin signo de 8 bits. El dispositivo utili­
zado p ara a d m in istrar 1a m úsica electrónica y los sonidos em itidos por ios
juegos electrónicos es / d e v / s e q u e n c e r . E s la interfaz a los chips del sinte-
Csoítulo 13: La API de sonido: OSS/Free 279

tira d o r p resen te en la ta rje ta de sonido y tam bién 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 ación 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á diseñada 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/souncícard.h> Aunque la implernuntación hn cambiado y
continu ará modificándose a medida que el controlador de sonido se vaya de-
?arrollando. los macros siguen siendo coherentes. Además, no redacte en sus
aplicaciones código que empleo los archivos num erados de dispositivo. E n su
lugar, utilice los vínculos simbólicos 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 tiliín r númoros do dispositivo d i­
ferentes. pero los vínculos simbólicos a p u n ta rá n uiemprc hacia los
dispositivos que los mismos deseen e m p lear para un propósito determ inado.
Evite sobrecargar su aplicación do prestaciones glamoroaas pero de poca im ­
portancia p ara el propósito 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 mínimo común denominador, 13 tarjeta Sound Blaster, y luego
agregúele código que detecte otras ta rje tas de sonido específicas y utilice con
ellas determ inadas prestaciones avanzadas o especiales (ver el título "Progra­
mación avanzada de audio' para obtener información sobre cómo hacerlo).

Utilización 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 opción 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 :n-
p 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 -isposiúvo 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­
vención. a menudo condene un argum ento es pacificador de tan: año. i o c t l e3
u n a fundón 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 . típicam ente concddas como ioctls,
/ , ) ) ) ) I \) ) > ) i } > ) ) ) ) ^
2S0 P ro g ra m a c ió n e n Linux

puede ser encontrado en ia página 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 categorías: control de volum en,
fuente de ingreso de datos de sonido y funciones de Interrogación. 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 debería u tilizar prim ero los raacros de in terro g a­
ción 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 cuántos 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/.cletíores 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
SíX¡N0_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_MÍXER_PCM Njvol de saüdíi 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_MtX£fl_irNE Nivol de volumen partí el canectot de entrado de linea
SOUNO y IXÉR MIC Nivel do volumen para 1.1 orvada do micrófono
S<XJN0J4IXER_,CD Nivel de volumon pura la entrado de CD do audlo
S0UN0_MIX5R_-LTPCMNivel do volumen para dispositivo nltemtitívo do .v.;d:o (tal co
mo las plaquetas PAS16 dé omulación do Sound 8iast<srj
SOl.ND_VllxEfl_RECL£V Control do nivel do volumen maestro de ¿rri&aci&n
SOUND_.\IIXER_NRDEVCCES e3 un m.icro que inform a sobro «1 máximo núm 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!
núm ero de dispositivos de grabación disponibles.
SOUND_.MIXER_READ_STEREQDEVS establece unu m áscara de bits que indica
qué canales pueden aceptar salida estereofónica. E sta información le brinda
a uno la posibilidad de establecer el volumen de cada canal independiente­
mente. proveyendo asi cierto control del balance.
SOUND_MIXER_R£AD_CAPS establece u n a m áscara de bits que describe las
capacidades o prestaciones globales que brinda un mixer.

m
i ) ) ) ) ) ) . ) ) } ) * ) ) ) i y ) )
C aoítulc 1 3 : La API d e so nido: O S S /F re e 281

La porción de la A PI de sonido correspondiente a l mixer tam bién prosee dos


macros. 3CüN0_DSVIC£_LA8£L$ 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 rótulos presentes en SOUND_D£VICE_NA-
’.’ES no cu en tan con espacios en blanco o le tra s e:i mayúscula.
P a ra o btener y fijar el volumen del mixer, finalm ente, se deben u tiliz a r Los
rr.seres SOL'N13_NÍIXER_REAEKcar.al) y SOUNT>_NfrXER_v^-RITE(canal).
E'. siguiente rragmer.to de código, p o r ejemplo, fija el volum en corriente del
dispositivo m ezclador ai cincuenta p o r ciento de su rango máximo:
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 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 */
«Ljb
'• 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. Después de la llam ada a
ICC t i el parám 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 caracterís­
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 • 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
• Copyri;R: (c i l99-»-3S
• SuJiw.t» eocificaao por Xurt ifait (<»aU>x.Tiijílor.coei
*/
•ireluce

«í.’Klwae <s:o:o.ft>
t i r c l ' - c t <s>»ríoc: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
Programación en Linux Capítulo 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 - / prr._5 U t.'( ! « 1) i fuM t# _g nO aciW M : /• 45e encuentra


c h a r ' d i s p o s i t i v o ■= " /d e v y .n ix e r - ; a c tiv o ? • /

son»? char *rotU lO S[| - SC^JíJO DEVÍCE -ABELS; I ' Xonbres de lo s c a í a lo s -Jal
M íe la t ío r » t
pm _s?a tl(t « 1 1 i d i5 c o s it lv o _ « t t r ío ); I ' ¿P';»de ooerar on
in t l ; M M e s t«r«> ’ *7
/* 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 tíe s; i* ((1 « l ) i :ispo3itivo_ast9r90) { Si ■»! dispositivo «S «sto
r*o, acstrar los mvelss de 1 « fie» d ía le 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 •/ : f (d e < t l(í* s c r ‘ pí*r_3rcíilvc. MÍX£R_S£AO(l|, in iv u lM < 0)
i * ' { 3 e s c r íp t a r _ ir c h l v o - o p H n < d iso o sltív o , 0_RDONIY)) < 0 ) f p e - ro r r s a w j.w lx s flje A O * >;
e r r o r jf 'o p o n ’ ) ¡
p r ir t -r VJCÍVS v j d W , n i v « l 4 0 « f f . {n ive l 4 Sx'fOO! » B|;
e x itis x r r jA iu u B c ) ;
>
) 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 •/
Ifd lc c tK d o s c rip to r jrcR iva , wtXSa_RÉAC{ 1), & .H v«i)) < ai
i * ( ( i o c t l ( a o s c rlp to r_ irc r» iv o , SWKO_MIX£a_REAÜ_RECSRC, S íu n m a jjr o b s c ic fl) ¡ < 3 |
pa.'r.jrf •S0UN0_MtXSa_a£4a-);
[w rr?r< * SOUSO.U I X€B_n 0 ,0 _R£CS«C * ) ;
^ ^ i r i ; io c t U d u ic r io t 3 r ,.ir c n iv a , 3IXjN0_UIX£R_flf-AQ_C€VMASK, « M $ c a r u jils i» s í.t iv o » > ) V f lS V , m v « : i « « f f >;

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)
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 KXirojítXERJtEAbjiTEflÉCaEVS, M ls p p B ltiv O jíS te r s p ) ) /• LSon ix c iv > « n m U » fy«n:«s para grabación? mi
p r y i* f(‘ -r.Ate<v:icfl: -.as opcicr-ti d* fuente para grabación ion *).
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 , SOüNO_MIX£R_REAO_CAP$. ¿ c a p a e id a o iis l) < i | i f | iicasacidadas 4 ia JHQ¿¿?_ZXCA._:Wl))
psrrO(‘ ('SCUND_U!XEfl_READ_CAPS"¡ ¡ príntf(*!>o •);
v ir .’t ( ‘ í*riuy*'-t»s. vn* l ;
[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 Fuento F ia n te O is p o s itiv o * Cérrar e l dispositivo «eíciacor •/
w iv « l\ n * ) ¡
clossídescriptor ze archivo),
p r iflt Y ( ’ Uo£claO cr ü.-aaacion A c t iv a £ s t ir& c
returfl i ;
C«*intí( * ----------------------------------------
--------------------------- \n-);

ron ; i = a t < SOUKOJUIXGR.NROEVICES ; * -i¡ t f Racorrer todos los roía iaprixir_3staoos{int co ^ic io n
a is o o s it iv o s ’ i

i* ;< i « i ) i fl33Cara_dispositivos) ( /* Sois interesan les {


dispositivos sispomblas *,•
coodicioo ? prifltfl* Si ’ l : p r ir .t r C MO ') í
pn ntf|'S2 c V 8s*, i , r o t u io s (il); /• In c rin ir nontre y nunars oe
C3n3— /
• jr n _ s :a t ( ( 1 « 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
ruer.ta p ara g rs c a c io r.? •/
; / ) ) ) )■ ) ) t ) ) ) ) \ ) ) f f > 1 ' 1
284 Programación 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 :.
Después de im prim ir dos líneas de títulos 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 información disponible para ese canal.
Obsérvese 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 expresión e n tre paréntesis d esplaza a la izquierda una posición, Jos bits


del núm ero de cana! y luego efectúa u n a operación lógica bit a bit. de Y entre
el valor resu ltan te y .a m áscara de bits. Si dicho canal existe, ia correspon­
diente expresión lógica evalúa a 1. Si el canal nu 3e encuentra disponible, le
expresión ev alúa a 0. De modo que, por ejemplo, si algún canal, digamos
S0UN0_MIXER_V0LUME, ofrece prestaciones ostereofómeas. (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 taíJO jtiG Z C lador
produjo la siguiente salida (la información que brin d an todas las A Pls os on
inglés):
i ..'« m a d o ji u jc l í d o r
cscatto <J<j / d e v / « u « r :
C a n il Putntfl Fjon to D is p o s it iv o N ival
5ALIOA « •z e la d o r Qraoacion A c tiv a E sto re o C o rrio n t*

» VOL NO NO VE3 90* 90*<


t Qaaa NO NO VES 7 5* 75*
2 rr«Q i NO NC YES 75* 75*
3 Synrn VES .so ves 7S* 75*
■» ?cn W NO ves I00S 1WH
5 SOHr SO NO NO 75*
8 Lina yes NO VES 75* 75*
7 <ÁLí ves VES w 3*
3 CO VES NO YES 75* 75*
9 ttix «0 NO NO ff*
i 2 ig a in WJ NO YES 75% 7 5*
13 OgaLn NO NO VES 75* 7 5*
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 ).
V J ) I I )

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 .tír {j8 ff_ tra n te rfe ite l.C 0 B )
• SuM Kflts notificado per Kart * a ll (»r»aUSxni$$loo.COT]
•/
tincltitf* <ünUW.r*>
# í p c 1 w¿ * « iic lif i.r »

•ir c lu c e otdLo.it>
•incl¡jd« < 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 ; /• Que dispositivo* configurar •/
U t l;
in t descriptor ard u vo ; /• Qoscriptor ce arcnivo ael d is c o iltlv o
Mxciaoor •/
t.*!t « K i r i dispositivos, d iip c s itiv o esteroo; r «asearas do Q lt» para
ajuste so lo»
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 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


e * jc ü c o r p a ra
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 *tx£B ° £ « OSVVASX. l.aascara aispositivosi)
< «I
perror(*50U>0_MlX5a_ftEAC_0€vltASK‘ ) ¡

•J l o c t i í j e i c 'i p t c * a rch ivo s, 3C0W M'XcF STSFíOCCVS, 4 d :s p c s itiv O ji9 t e r e c )|


< •)
S * " tr! -SiX«_MtXEa_?&i0_STE3€00EV3* J;
Programación en Linux

• Sstaolece- ?1 sanal s i que desoa#»s f ija r ti voijner. *•


dispositivo « SOuáOjKXÉRVOUJWE;

/• Especificar el nutvo nivel de volunto ‘ l


do <
fprifltf(Stdoot, 'Sjuvo nivel da -/alunen *);
fC «:i(b o * , 5. Jtd ln );

ca^al^oerscno * a to i(b u f);

} 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 síos «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 tl¡d e s c rlí) to r_ a r c n iv o , «:XEB_ARITE|diJposm vo|, ( n iv e l) ) < 0! {


3«rrcr{'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 •/


can al_ U 5 uiero c • n iv e l ¿ i a x ff;

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 / H ctV in ',
c is p o s i? iv o , can al_ i2 3 u ier:3 , can3l_2eracno|;

■* C írra r « 1 dispositivo aezolacor y s a lir •/


Cacítuio 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
i-ie v c .-¿v» 1 á» * o lu * tn ?5
* i « « I í « veluacu Ce d * W »H «r astaalecido *n 75S t ?5H
Después 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 Obsérvese que el lazo do •w h iie
conUnúa h asta que se ingrese un nivel do volum en válido (entro 8 y 100).
La fijación 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 expresión requerida es:
m v*l • ic»naX_d*r«cfto « S) • e«/>»l_Uqui*ft»o;
La expresión en tre p arén 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á cómo llevar a cabo u n a programación sencilla de audio
concentrándose en ia reproducción d* sonido y dejando de lado la grabación,
principalm ente debido a limitaciones d a espacio (bueno, y tam bién 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 técnicas de grabación, sin embargo, son esencial­
m ente las m ism as. Donde la reproducción requiere u n a llam ada a w r i t e
que incluya el descriptor de archivo del dispositivo de audio, la grabación 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 raoúere -oce-' rS vaertss’ un m-cnifano 8 13 eotrsaa óe a misn-a rotulaos MIC y
z& rer¿ x i ffT A ü _as taretas za Oup<c» cieno. o *uiicuc<ex. an carrea, son irás com
^eíss a este 'esoeco xnzue uno Jueoe granar y rsproajar ai mismo tiempo. Zo moflo
3j6. acedas ae Jacor uc&ardo ja micrófono». una ta«Jeta '-¡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 ooísnsr más infirmación soore - prcgramacicn w a ^cirimecia. osoeciaimenja
so-co. en Linux. ver anta V u r-s¿ 3 Guido. de -H‘‘ 'ranter.
J J ) ) t- ) ) ) ) > ) ) ) J > J ) }

2S8 Programación en Unux

EN QUÉ CONSISTE LA PROGRAMACIÓN DE SONIDO


A ntes de sum ergim os en la program ación de reproductores de sonido, se ne­
cesitará ad q u irir alguna base técnica q ’i e perm ita com prender los conceptos
y la term inología empicados.
Las computadoras representan el sonido como u n a secuencia de m uestras de
u n a señal de audio, tom adas a intervalos de tiempo precisam ente controlados.
Una m uestra es ol volumen de ia señal 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 más bytes. El audio comprimido, a su vez, codifica N'
bits de u n a señal de audio en N-x bits do modo de ah o rrar espacio en disco.
Existen varios tipos do formatos de m u estras, 3Íendo los m ás com unes los de
8 bits. 16 bits y Ley p íun form ato logarítmico). E ste formato de la m u estra,
combinado con ol núm ero de canales -q u e puedo se r 1 p 2 según que la señal
sea m onoaural o cstereofónica- d eterm in a la frecuencia de m uístreo, 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 típicas 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 física, existe algunas ¡im itaciones con
loa que uno dobe confróntam 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. fenómeno analógico y por lo tan to de d esarro ­
llo continuo, las tarjetas de sonido cuo n tan con convorsores do señales a n a ­
lógicas a digitales y viceversa (AJDCs y DACa, respectivam ente) p a ra conver­
tir en tro am bas form as de señal. La eficiencia de 1a conversión afecta la
calidad do la señal Existen tam bién o tras propiedades físicas que pueden
incidir negativam ente sobre la calidad del sonido.
L i limitación m ás básica es quo la frecuencia más 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 kíl¿. la frecuencia más alta que ne puede grabar no
puede ser mayor do 8 kHz. Antes do que la señal pueda ser enviada a un DAC o
un ADC deben por lo tanto eliminarse las frecuencias más 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 también aum entar la frecuencia de muestreo, lo que
trae aparejado que se eleve el intervalo de transmisión y disminuya 3 su vez la
duración de la señal, o sea por cuánto tiempo la misma se ejecuta.
FIJACIÓN DE LOS PARÁMETROS OE LOS DISPOSITIVOS DE SONIDO
Para lograr producir sonidos, el flujo básico 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 núm ero de canales (1 o 2, mono o estéreo).
5. E stablecer la frecuencia de m uostreo p ara reproducción.
6. Leer un bloque de! archivo que se quiere ejecutar.
) I ) ) ) * } ) ) ) f >

Cacüuic 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 reproducción 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 tísp: p ara ley u. em p lear / d e v / a u d i o . C uando se ab ra el
dispositivo de reproducción se tiene que u tiliz a r 0 JVRONLY a menos que se
deba, sim u ltáneam 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 parám 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 estéreo) y la frecuencia «del m aestreo. E ste orden resu lta menos
im portante p ara reproducción que p a ra grabación, 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______________ Descripción________________________________________
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> Codificación logarítmica Ley u
AFMT_A_LA1N CoOJflcactfn logarUmlca loy u
AFVT lU A A G P C U Codificación ADPCM estándar (incomont-tole con el formato utlli
rado por Crontjwe Laos en su Sound Blaster ce L6 Óltsí
A F u r_ u a Codificación « l i n d a r oe 8 oits sin signo
A F V T _ S J6 _ L E 'ormsto de l& tx t con s>gno Httle «ndlan (x86)sin signo
AFUT_S‘ 5 _3 t Formato de con signo Org andlan (M68k, PPC. Sparci 5¡n
xgno
A FV T_S 8 Formato ae S ü<ts con Signo
A f u r _ u i6 _ L E Formato de 16 b«ts s»n signo nroe endlan
a f m t j j i 6_8 E Formato ae 16 oits un signo c-g ardían
A FU T_yP £G formato de 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 código:
ia t forw to;
;o c tl(o e s c r ip to r _ ir c n iv o , SWC7^_OSíM3€T?irrS, ifc r n a to i ¡
Programación en Linux

'■nata * afvit_-jisj_E;
loctl|<jescri3:or_ari:hivo, SMJCTIJJSP.SETFVT iío 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 núm 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 ; /• o»t«riw » 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_SP£eO:
tnt fp«cuoncn • 11025;
ioctl|<3«<criptor_ircntvo, SN0Cr._0SP_$PE£0. 4frecu*ncia);

Como asempre. se debe verificar el código 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.

ate ejemplo es un program a largo y relativam ente completo que


ilu stra el m aterial provisto en e sta sección respecto de la m anera de progra-
i j é m p l o m ar la reproducción 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 >
i*ircluae <stdio.n>
íin c l u o * <5t(*t«3.n > / • P 3r3 s t n r r o r */
#¿r>cluce <4rrno.ft> /• Para »rrno */
r d íf t f ie TA1WM0,3UF 4396
:n t t a m iv o io }
i
I

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 ; / • V alo r r*torna<fc por i**aa •/

ir t íc r * a :a , f r * a .« r c ia . w te re o : / • A rgw tantos para i a s i& c r i s •/

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 ¡; / • S u f '« r p a rs la n u a st-a V

.* Fijar a ly .r « i p a raM tro i •/


• fW .
» e e « «:
f e - s a t o • tfV rj3U C IN ¡

r * 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 < 0> (

C « r r o r ( •SHOCT!.j5S P _3fTFVTS * j ;

♦ 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. •/


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 c e v /c sa s o n :* ) ;

i ? ( f a r * « 0 i Js F V T jC ^ x p u t S | l, , -tA?VT_«<U_LAJi, J ;
iT iT c ~ * a t5 & AfMT A p t i t s { * \ t AW_ A_ ! _ A#• ] ;

i í fo r r á is i i r V - . n a . A C í a í l C-J-SS’ tAFW T^IllAjW PCtr) ;

¿ f(f o r m o i a?v_u8» p u t a r M fw r jja * ) ;


i * i i 3 r « J it í S A?WT_Sle_L£) 9 u t i í ’ \ z A F V T _ S ló j£ ’ l ;

if{ * ;.iu t o s A fy r _ s is _ 9 € ) 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^v»r_sa*);

i
) } ) ) ] ) ■ ) . ) ) ) ) ) ) ) ) > > J > )
2 92 Programación en Unux

i f ( f o rn a to h AFH7Jjt6_LE} p u t s { , , .tAFN7_Uí5__E, >;


i l ■fo rn a to & AFwr_ui6_3E| p u t s ( , \tAPVT_UIS_BE, >;
i? < f o r ; 3 t o i ¿rNT_VPS0| puW (*\tAPM r_H ?EG*};

. • E sta b le :» * - * ’ n u a e ra cíe 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_STtRÉO, 4nado)| < 0) {
p e r r o r ( •SS©C7L_0SP_STcaE0‘ I ;

e m ( £ X ;r _ ? A I iijR E ) ;

*
arirt#C\:Moclo «stablacico: , notía ? ’ ESTíREO' : ‘ 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('Vcfrecu«ftcta 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 8«W.«V}¡
•xlt|€XtT_FA!UlMF);
*

/* L « « r un bloque, Iuíqo e s c rib irlo ‘l


( 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. TAMAÑO_BUF sim plem ente establece el tam año que ten d rá el baf f er don­
de se alm acenarán loa hinques que serán leídos, que por lo tan to se rá ta m ­
bién ol de los bloques escritos. D espués 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 características. 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 podría elegir
cualquier formato retornado, pero uno de los formatos disponibles,
Cacítulo 13: La A P I de sonido: O S S /F re e 293

ArMT_S16_SE, se rá ¿unciente. El bloque '.argo de código sim plem ente'exbi-


be 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 núm 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 Hz). 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 ostración en s u sistem a debería parecerse a
la siguiente, seguida por un p a r de segundos de sonido:
ti ./C0«fi5_í-Jíí0
Las :o r r l V t ;í t í « * m : r a ««o ta d o s ccr /den/dsp son:
A f íT J U J M I
A fV T jj«

AFVT_S:9_lE
« e c o «S T JO ltcK Jo: WNO

<3* *u»st.-*o: 8469 « r

NOTA
En *« V j c W«o do *atc ¡-fero se enemntr*c C'spomales vanos s o o c muestro entro
*rs <¡ut te f-afi* 8COC.v»ov 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.

PROCRAMACIÓN AVANZADA DE AUDIO


La m ayor p arte de las características 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 específica.
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 características av an zad as del hardw are de sonido:
SNCTL_0SP_GGTCAPS. La m ism a se utiliza do la siguiente m anera:
ú : uracuJáces;
toct:(swcr*.pwr_areniw, 5N0CTL_BS?_G€TCAPS, 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 cuáles 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 Programación en Unux

Tabla 13.3. Máscaras de bits devueltas por SNDCTL_D$P_GE7CAPS.__________


Capacidad____________ Descripción_____________________________________________
0SP_CAP_R EVISI0N Configurada al número de versión oe SNDCTL _DS=>_GETCAPS;
re s e rv a d a p ara u s o futuro

D$P_CAPJH/PLEX Activada 31 ol dispositivo puede operar en modo ful» dúplex: de­


sactivada si sólo puece operar en modo semi dupie*
O S P_C A P _flEAlTIV E Activada si el dispositivo admito informo do aita precis ón so-
3ro la posición del puntero do salida
0S?_CAp_8ATCH Activada si ol dispositivo cuenta con almacenamiento tempora­
rio (bufferíng) local para graoactfn y roproducción
OSP_CAP_CO?flCC Activada si el dispositivo cuenta con un procesador programa
ble o un DSP; reservada para uso futuro
O S P _ C A ?_ T fl IGGEH A ttivod a si el d isp o sitivo c u en ta con grabación o reproducción
gatillflda. e s decir d e ncüvoclón irimediuta

OSP_CAP_MMAP Activado si resulto postb'.o el occoso «recto al üirfíor de jrabo-


clón o roorodocctón dol dispositivo o nivel de hardware

OSP_CAPJDUPlEX informa si un dispositivo c s fu ll dúplex o aemi dúplex.


Full dúplex (dúplex 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 ultánea. La m ayoría de los dispositivos de audio, por desgracia, son gemí
dúplex. 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 información 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 grabación y reproducción gctillada (triggertd). E sta es una
característica que es útil p a ra los program as que requieran poder a rra n c a r y
detener la grahación y la reproducción con gran precisión. Los juegos, en
particular, necesitan de esta prestación.
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 grabación y la reproducción del disposi­
tivo por medio de la combinación 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 método 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 caoítulo no cucre las mismas.
Capítulo 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>

títt M tfl(V© ldl

<

in t W * crtptcr_arcnt*o;
i-tt y n t i c i M i í , ;• u t c i n u o i t i •/
cw d is p o s itiv o !| • •/oeWflíp*;

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#,JS£TCAÍ>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_S£AL::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') ;
iíj c a c s -i 8 SPSA ?jK*f!0C 1
j j ) ) ) j- ) . ; t i ) > ) r ) ) i ) > ■>

2 9 6 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 ccísro 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 ( 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 * ;

i f - c a p s 4 OS?_CAP_MUPt

5 « t $ f ' \ t P “ P íit e 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_SüCCES5);

)
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 reproducción
P t r n t e a cceso d ir e c t o a l o s b u fío r s do iu hard»ar«

Lo que viene
En este capítulo ol lector h a aprendido la program ación básica 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 ación do sonido es
un tom a extenso que merece su propio libro, de modo quo con cote análisis
ap-onas hemos roíado la superficie del mismo. El próximo capítulo. "C rea­
ción y utilización do bibliotecas de programación", lv m o strará cómo u tilira r
en ñus program as las bibliotecas do program ación existontos y cómo 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 técnicas y cuestiones relacionadas con la creación y u tiliza­
ción de bibliotecas.
; / / / / # / / / / ' • ' ' * ' . ' ' '
Creación y utilización de
bibliotecas de programación
E ste capitulo tra ta sobro ia creación y utilización de biblioteca* da progra
moción, que :-on colecciones de módulos de código que pueden sor reutiliza-
dos cada vez que resulte necesario en ur. program a Las bibliotecas son un
ejemplo clásico del S anto G n al del desarrollo de softw are: la reutilización de
código. Las m ism as reúnen ru tin as de program ación em pleadas con frecuen­
cia y módulos u ü lita ñ e s en una m ism a ubicación.
L as bibliotecas e stá n d a r de C son ejem plos do « u tilizació n de código Las
m ism as contienen cientos de ru tin as frecuentem ente utilizadas, tales como
la función de im presión p r i n t f y la función 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 código y de la conveniencia del pro­
gram ador. sin embargo. las bibliotecas proveen una considerable cantidad
de módulos utilitario s totalm ente depurados y bien probados, tales como ru ­
tin as p a ra program ación de redes, m anejo de gráficos, m anipulación do d a ­
tos y llam adas a sistem a.
E ste capitulo cubre ios siguientes tem as:
• Obtención de información de una biblioteca
• M anipulación de bibliotecas
• Creación y empleo de bibliotecas estáticas
• Creación y empieo de bibliotecas com partidas
• L 'úiizacó n de objetos cargados dinám 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.
i i ; ) - ,i / i ) ) )t)
¿00 Programación en Linux

Antes de sum ergim os en ia creación y el empleo de bibliotecas, el lector debe


conocer las h erra m ien ta s que tiene a su disposición p a ra ia creación, m a n te ­
nim iento y adm inistración de bibliotecas de programación. Se puede encon­
tr a r información m ás d etallad a sobre el tem a en la s páginas del m an u al y
en los documentos tex-inío (inform ación en form ato tex) de cad a comando y
program a comentado en las próxim as secciones.

E l c o m a n d o nm
Ei comando nrc lista todos los símbolos 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
función requerida, nm tiene ía sig u ien te sintaxis:
raí (opciones] archivo
am lista I03 símbolos 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 arías
opciones útiles de nm.

Tabla i 4.¿. OfxíQnes del comando nm ___________________________________


Opción Descripción___________________________________________________ ________
C Convierte los nombres do símbolos a nombres a nivel do usuario. Esto resurta
aspecialmente útil para hacer ¡ogiblos los romeros do ios íuflclonos de
3 Cunntío se la utillra con archivos do almacenaje de nrch.Vos comprimidor, (archi
vos .o), además tío ios símbolos ciw> éstos contienen, nm imprime ol Indice qya
vincula 03 nomhros do dichos 3(mt)oWS con los nombres de los módulos o m-cm
cros do talos archivos en los cu,nos so orcuentr.-jn definidos esos símbolos
-u Exhibe sólo slmootos quo oo están definidos on oí archivo quo asta 9iendo exo
minado poro quo pueden estar doflnldos ->n otrao bioilotcicas o archivos
•1 Utiliza lo Información fie doouracioo para Imprimir o; número oo línoa en el cual
esta definido ceda símbolo, o el respoctivo asiento de reubicadón si el símbo­
lo no aa encuentro definido.

E je m p lo
El ejemplo siguiente u tiliza nm p ara exhibir los símbolos que contiene la bi-
hlioteca / u s r / l i b / l i b d l . a :
EJEMPLO S na / U 3 f / l i O / l £ M l .a head -10

T _dli>cén_s?iecK
ü jjljjp m
U (H orror ruii
SALIDA
NOOíflaa w dlopen
aeowaac t dlopífi_<í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 ubicación, <>3ea el
corrim iento relativo offset) en b y tes, expresado en notación hesadecim ai.
respecto de’, origen del miem bro d l o o e n . 0 . de los diversos símbolos 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 condición de cada símbolo. U (por un.-
defined) significa que el símbolo 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 símbolo ?e e n c u e n tra definido en el á rea de texto (código)
del miembro. W por wriuible) especifica un símbolo que, o bien no será te n i­
do en cu en ta si llegara a e sta r p resen te u n símbolo de idéntico nombre en
otro archivo o. s: no se llegase a e n c o n tra r otro de nom bre idéntico, 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 común es en la creación de bibliote­
cas estáticas, que son archivos que contienen uno o m ás archivos objeto. Laa
bibliotecas estáticas son archivos objeto cuyo código e stá diseñado p ara sor
linkeado a un program a en tiempo de compilación en lugar de serlo dinám ica­
m ente en tiempo de ejecución. Las bibliotecas asiáticas constituyen la antítesis
conceptual de laa bibliotecas de linkeado dinámico de Windows (DLL o Dyrm-
míe Linh Librar/). Los archivos objeto que las Constituyen M ddñOtiiiAOA
mtembroo El comando a r tam bién crea y m antiene una tabla quo efectúo uno
referencia cruzada entro los nom bres de los símbolon y los miembrojj en los
cuales aquellos se encuentran definidos. En la parte 'C reación do una bibliote­
ca estática ', 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 jigüe 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.____________________________________
Opción_____________ Descripción______________________________________
•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 emitiría 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.
.3 Crea o actualiza el m apa que relaciona ent/e si los símbolos
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 itío s .
•r 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á s»erao agregado. Los nuevos m.-emoros son a raaitío s al
fina: de a r c h í V Q _ c o m p r is id o .
■q 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.
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 símbolos 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:
ló3 (opciones I archivo
ld d imprime los nombres de las bibliotecas compartidas que requiere a rc h iv o .
Dos de ¡aa opaor.es más ú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 núm ero de versión de ldd, y -V, que informa
el correspondiente número de versión del linker dinámico, Id . so.
E je m p lo
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/1ÍM91.4M (&X4l)l>!U<J00)
llbjljruj.ía ■ -> mr/llU,'UbsUnQ.ao, t <Dx4^2*0Wi
::2.«.10.6 •> /Ub.'UBn.iJO 6 (tX4M72QMH
UBc.to.fl •» /U 0 /lía c .in .8 (Ox-iWWÍ&Mj
SALIDA
Ua/lo-llnux.íO.? ■> /Ub/ld-Unu*.so.2 (0X4M96MQ)
(el aigno => ea m eram ente un símbolo de indicación 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 vínculo simbólico a la ru ta de acceso completa a .a bi
bíioteca 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 vínculos en tiempo de ejecución 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 línea 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 vínculos 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 ningún 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 opción -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 opdón - 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^acón ae aíofcxeeos ccmcs^iaas puede resultar compleja
y co:'. ye s generar confusión. Un prcgrarrV) utllij» una función 09finida «n bibliotecas
aomos.'icas s a « socamente d nomore de 'a tuncón. sue a greñudo se tíercciina cíiIjo
ísafc;.. E yog.'3 m 3 re saOo córrc asta dertrea a funoio o cómo acceder 3 su esWao *n
ugrroo de «?ecjc3>n. U ‘ vea de I d . se consisto on CO'KCI» «I esóo <¡\ norríire de la fun­
dón ü zbz ¿ 0 cwe efect?v.srner-?e mrcter’orta 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 Of«OCWW al
'ector« .-toar a v , precrame im o>oiiGítca3 que «jrnrejwndar, Pwtíe 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 dinám 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 ejecución, nde-
m á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­
berán 1 e r carg ad as an tes que tocüis 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 bién se vale de dos archivos de configuración cuyos propósitos 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 estándar, 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 versión 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 deberán ser cargadas antes de !a ejecución del programa.

Bibliotecas estáticas
Las bibliotecas estáticas (y tam bién las bibliotecas compartidas, p ara el ca­
so- ;on colecciones de uno o m as archivos objeto que* contienen código pre-
compilado reunlizable. C ada uno de los archivos objetos que la in teg ran se
denom ina tam b ién 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 símbolos 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 compilación 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­
tensión . 2 .por archivo de alm acenam iento de módulos). Recordemos que
los módulos 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
; ) ) i ) ) )
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 ejecución.
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 módulos presentes en u n a biblioteca estática so debe in clu ir
en e l código fuente del program a que los va a em plear el archivo de encabe­
zado de dicha biblioteca estática y lin k ear la m ism a al program a d u ra n te su
compilación. 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 leído Advancaú Pngrammtng in UNIX enviroament se Richard
Stevens •■‘conccoran M íos tíos programas. Yo '■os ho utilizado durante muchos años
porque cubren pe/fcctamartte mi necesidad de una biblioteca de yJn'nistractfn do ".To­
ros sencilla y funciona!. Quedo roconocído a la generosidad dol Sf. Stovon3 al r-iooimn
permitido reproducir estos creáramos aquí.
Asimismo tío precu-o mucha tristeza el enterarme de su fallecimiento a comienzos do
sepCerrDí» de 1999. Richard Síovonn fue un oxcelonto programador y un tOtVBSBtientC
ex;ositor de lo» dotalles de in programación en UNIX y TCP/IP. Sus aportes a a claridad
do oxposción de los dotallo» de ios APfi» tonto de UNIX como do TCP/IP va.- a ser dolo-
rosamente extrañados.

E je m p lo
El prim er !¡atado que vieno a continuación, l í b e r r . h, «1 archivo de enca-
_______ bezado do una sencilla biblioteca de manejo de errores, m ientras que el se-
c k m p io inundo listado, que viene inm ediatam ente desp u ta dol prim ero, es la imple-
mentación do la interfaz definida en el archivo de encabezado. Podría resu ltar
útil em itir previamente alguno» comentarios acerca del código. 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 número variable do argum entos Ist no se encuen­
tra familiarizado con las funciones con núm ero variable de argum entos, con­
sulte algún texto o manual de referencia sobre C). E ste número 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 vacío de prcprocesador, LIBERR_H_
Esca biblioteca no debería ser em pleada en la construcción 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 información sobre la construc­
ción 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
i I I I ) ) ) J .1 I J . ) ) ) I ) ) )

C a c i t o 1-i: Creación y utilización <áe bibliotecas d e p ro g ra m a c ió n 305

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» U «-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 líaseos
•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
v c w i a l i r _ 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 - iíje ? 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
«^ *ctu c U lla * W a
*/
• O lí iS « rttír_ 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 *5unt«ro_7ja.i£>tf»»:íT!:raa, . I;

/*
• l»oriMir »n i < * s a t t *« « r r o r y - « t e r n a r a <}oi«n ifactuc la lla n ad a
v
vo:S y s o r m r t -'^ r (c c P í- criar 'puntero *a01a0««n»tarc5, v*_U st punto^ar-junim os,
era-* "•*fcnivofi«q:»:rcÉrro<‘« a j: ”
t^r/U1 t:8£CT_H_
»fr-OLf /* L:5ésS_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
/• ítófltr» 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 .toúulos d» « n o jo do
•r-« -* s
•/
# ift c l* í« < « r r .- e . v P ara la d e fin ic ió n o# tr r n o •/
liflc lu a # < s t « r g . n > • ? 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
acactxn
lis :a s v a r u e ü s « arsu a e n tca •,
<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 Programación en Unux

v a _ l m fMnt«r(3_3rgumsntos; /•

va^stirtJpuntsn^arguw itO B , punt9ro_TjbUD8Wi#n5ros>;


:npriBir_srror(sunt9ro_Tatla09Mi«nl>ros. pur»:ero_argunentos, NULLl;
va_9r-i; a u rti^ a rg u n c n to s );
rttum ;

■oíd s a lir _ s ;_ « r -o r( c o im cnar •oun:*',o_T«olaDe«i9nbros, . . . |

<
v « _ U tt 3unt«ro_aru«ner.:os;
» # .ítjrTipon:«ro_4rqga8rtos. oyntnro.r.iDlaOoytniioroiii ¡
:.*aruur_«r*ror (p un te o.ra blalJe N ie eíiro i, puntnro_arBinwintos. NUL.),
*4jino(püiitera j*rgu«9nto»|;

voto J S M tjr_ ^ r* :a rn * r |ch.ir ‘ A rcnivcfloo istraE /T orí*,


conat cnar , punt«ro_'abl.iO«Ml*rl>r<!ii1 ...»

(
v a . l i i t puflt«ro_arguBBntos;

va^ tirtíp yn té ro^ arg m ian tos, punt*ro_TablaDeUiant¡ro»);


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);
r«turn;
>

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_argun«r.tos, pum cro jraaU D euian b rsa);


i*ori*¿r_«rr&.-<puftterp_T«oiel>allie«aras,. puRtero_arjunantes,
A 7 cnivaaeg i3trc£rror6S|;
va_erd(pyrttíro_argut«ntos);
1 > f ' ) ) ' ■ ) ) i ) t / ; ) i

Capitulo 1*1: Creación y utilización de b ib lio tec as de program ación 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:

FíLi •pgnt*f0_ArcrtWcR*fli»tr06 rrores;

guarCar_«rror • *rn*.o; * Valor <ju« cuier efectuó U llanada pueCs


a m a r U e 'u u r • /
• *pri.itft5v<f. ?«?. »jr:«fo_irgun«r.toj|; /• r*nto * « rtn tn i cmo sp rin t^ ),
y K" « a ta c a r to c •/
ssri/!tf{6u* • ítrtentoyf), *: \jVfl*, t?r«rror{gg«rsUr_4rroi*) I !
• £ r : a *0 : • 0 u« itd o u t y s t d a r r co l/ic isu n •/
l f ( A r c n iv d l # g l s t r e 6 r r o r t » »• W JU)
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:ro€rrflr«i); /Archivo a o ia rto y c o rrid a
coa *uftc:ane»
« ta rd a r 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 estática, uno debe prim ero com pilar au código 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 módulos. Si todo anda bien (si no existen errores lógicos m de ti-
peo en el código fuente), se b ab ra creado ia biblioteca estática 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 & _ >i r r o " é s . a
$ i - - r -c 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
S -a s u l i c r i í í j r ' s r i s . i
o í : iiot*ca_ir-: '5 s . o:
SALIDA
j _ ír r rc _ la c a t:o n
í^ e tW i* T 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
; / > ) ) ' I > > t f ' f ]
3 08 Programación en Unux

U " lush
U *aper,
U fpiits
0e?3fl08® t 9 c c 2 _ c o r o ii« : .
JW<3C3"3 T 2 s e n t.* r_ y _ 5 a la r
N a e w S ’í r 3 S 9 n ta r _ y _ re r o rr jr
U 3 p n n :f
J 3tfiflrr
U 3t<J0Ut
U s trca t
. U stre rro r
U 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 módulos 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 próximo ejemplo In sis­
timos, pora utilizar la biblioteca, incluya el archivo correspondiente archivo
de encabezado on su código fuente, utilice gee con su opción 1 p ara vincular
la biblioteca al código fuente, y luego em plee la opción • L p ara ayudar a g ee
a encontrar el archivo de biblioteca.

E je m p lo
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­
ejfMPLO 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 &LT€ARj»SeN7ARY_SAí.IR I
J ) J / ) i .> J J ) ) _ t i ) ) / ) )
Capit-jlo i - : Creación y utilización d e bibliotecas de programación 309

í 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 3ÍCÍ50 archivo 3 directcruT.*)";

fputsrOa«prob«r>dO «Hflt4i*_y_r*tornar. \n’ , std su t);


:ocRt9ro_afCíiIvo * 'c a e r{V o o \ *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.TíA«_SAL:3_SI_ei«0fl


ÍSUtsCCeBprobtflCo W llr _ jl_ * r r g r ,\n ', rtdOUt):
íf{(ow >t»ro_«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_ASéMTAfl_Y_$ALtfl
f5utí('Co«cr3M 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 púas a e n r feo. ho 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 cc«cr50jr_DifiLi3C4ca.c -o coaproesr_d:blioteca -L . -le r r
i ..'eoeprcear_oi3i¿ct«ca
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 arenívo o c ira c to n a .

Los ácm bloques £ i f n d e f - # e n t í i f ev itan la ejecución de las funciones


• _ q u i t . P a ra com probarlas, cóm em e uno de los macros y vuelva a compilar,
y luego comento la o tra y recom pile de nuevo. P ruebe la comprobación de las
funciones * _ q u it como ejercicio d e práctica.
310 Programación en Linux

Bibliotecas compartidas
Las bibliotecas com partidas tienen v arias ventajas por sobre las bibliotecas
estáticas. Prim ero, utilizan m enor cantidad de recursos del sistem a. U tili­
zan m enos espacio en disco porque el código de las bibliotecas com partidas
no debe ser compilado con cada archivo objeto sino que se lo lin k ea y carga
dinám icam ente en tiempo do ejecución desde u n a única ubicación. 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 más rá ­
pidas porque deben se r cargadas o la m em oria sólo una voz Finalm ente, las
bibliotecas com partidas sim plifican el código 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 versión actualiza
da de la bibhotoca e in stalarla en su s sistem as. Con las bibliotecas estáticas,
cada program a que huga mío de la biblioteca debí’ ier recopilado,
Como ya fuu :iu«'.aludo, ul linkor/cargador dinám ico. I d . s o , vincula los nom­
bres do los símbolos en tiempo de compilación n la biblioteca com partida en
dunde lo« rainmoa e«tén definidos. Las bibliotecas com partidas tienen un
nom bre especial, sonam e, derivado de la extensión .no (shareablt object u
objgto comparCihia) do »u¡i archivo» (nam<? significa nombre), cue consiste
del nombro di; la biblioteca y ul número principal de nu versión. 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 versión es 5; el núm ero secundario os 4 ; y 46 es el nivel de su edición 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
dígito principal de la versión indica una modificación de la biblioteca, ol g ra­
do de quo la m ism a y la an terio r resultan (¡muy!) incom patibles. Los núm e­
ros secúndanos de la versión y los núm 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. ¿Cómo funciona eso? La utilidad
ldconfig crea un vinculo simbólico 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­
ción en / e t c / I d . s o . c a c h e . Er. tiempo de ejecución. Id .S O recorre el a r ­
chivo de cachó, en cu en tra el sonam e requerido y, debido a la presencia del
vínculo simbólico, carga a la mem oria la biblioteca que efectivam ente corres­
ponde y linkea las llam adas a funciones de la aplicación a los símbolos 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:
Capftu‘3 1 - : Creación y utilización de bibliotecas de programación 311

• K an sido modificadas las interfaces de fo ndón exportadas.


• H an sido añad id as nuevas interfaces de funciones.
• El com portam iento de ciertas fu n d o n es varia respecto de su especifíca-
d ó n o rig in al
• K an sido modificadas las estru c tu ra s de dato s exportadas.
• H an sido añad 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 guía 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, uñada a su bibliotecas funciones con nuevos nom bres.
• A ñada elem entos de e stru c tu ra sólo ai final de los estru ctu ras do datos
existentes, y o bien deis* carácter opcional o inidolícclas 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 estática. 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 opción • t'P IC do
g e e , que genera código PIC (Código Independiente de la Posición) que
se puede lin k ear y carg ar en cu a lq u ie r dirección do memoria.
2. N'o so debe utilizar ln opción f o d itt • fram e • p o i n t e r de g e e ; si se lo
h iriera , la depuración del pro g ram a ¿e volvería prácticam 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 opción-W1 de gCC'a.
5. Se debe lin k ear expresam ente la biblioteca de C utilizando la opción
•l de g e e *s. E sto g a ran tiza que el program a el módulo no sea compila­
do a u n program a que carezca de la versión 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 espués crea vínculos simbólicos 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 }it3t«ca _«rrcras.c -o D_:LiotíCS_5rr:r3s.?
s acc -5 -$*<*.**£ -d l.-s c r-ia í, c¿oliotecs_«rror«s.so -o
3ioU'r:sca_«<*’- ír'53.;c.!.$.2 sifcLicteca_srn)rss.o -le
* :n -s íi.3li3r«ci_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 vásculos. uno para ei soname y uno p a ra la bi-
) ) ) ) ) ) ) ) . )

312 Programación 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 sección, 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 dónde encon­
trarla. de modo que se deberán 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
dinámico, dónde encontrar la biblioteca com partida, de m anera que h a b rá
que emplear la variable SLD_LI5RARY_PA7H.
Eje m plo
Este ejemplo linkea a c c m p r o b a r _ o i b iio t e c a la versión 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 .
EJEWPIO S gcc -g canpraoarjjibUoteca.c -o conprabarjubiloteca L. lerr
S L0.'.tfiRA3Y_?ATH-$(3iití| ./orrtoat
C^narobanaa r»tarnar_s;_«rrar. ..
P9torr>ar_íl_«rrar p.o puáo a s r t' íoo. «o M ista dicho archivo o oixectorio.
Cotprobanfio as*<itar_yj*otoi*nar...

CALIDA Tal como so lo señaló anteriorm ente, la variable de entorno SLD LIBRARY -
PATH añade la<s) rutáis) 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 línea de comandos os
añadir 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, conviértase 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 método es quo p a ra añ ad ir la ru ta de acceso a dicha
biblioteca uno no tiene que u tilizar la opción -L de gcc.

Objetos cargados dinámicamente


Existe una m anera adicional de u tilizar las bibliotecas com partidas: c a rg ar­
las dinám icam ente en tiempo de ejocucióu. no como bibliotecas linkeadas y
cargadas de forma autom ática sino como módulos totalm ente independien­
tes que se cargan explícitam ente em pleando la interfaz d i (carga dinám 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­
ción más general para la cuestión de la reutilización de código.
En q u é c o n s is te e s te tip o d e o b je to s
Los objetos cargados dinám icam ente son módulos de código cargados especí­
ficamente en tiempo de ejecución con el propósito de utilizar la funcionali­
dad que proveen sin que sea requerido que la correspondiente aplicación sea
linkeada con los módulos que contienen el código cargado. Supongamos que
) } /

C30ríu!0 1 - : Creación y utilización de bibliotecas de programación 313

uno esté escribiendo u n program a gráfico im portante. E n su aplicación, se


m an ip u la datos gráneos de u n a m an e ra personal pero sencilla de utilizar.
Sin em barco. <q desea poder im p o rta r 7 exportar los datos desde y h a s ta
cualquiera de los ¿ e n te s de form atos gráficos 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 modificación de u n a biblioteca req u e riría la correspondiente recompila-
d o n , o por lo m enos un nuevo linkeo. de su program a, lo mismo que lo re ­
qu eriría n el añadido 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 módulo de biblioteca añadido a un program a incrementa


su tam año y obliga a su rccompitación.

Como :e puedo ap reciar en U figura L4-1, cada voz que 8e añudo otra biblio­
teca a un program a, au m en tan el tam añ o y ln complejidad del mismo. El ta ­
maño crece enpecialmcnte rápido 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 diseña una interfaz g en éri­
ca, de formato neutro, p ara lectu ra. escritu ra y m anipulación de archivos p 1
ficos de cualquier formato. P a ra a ñ a d ir a su aplicación un form ato gráfico
nuevo o modificado, uno sim plem ente redacta un nuevo módulo quo ad m in is­
tre el nuevo formato y ad vierta de su e x isten d a a la aplicación, tal vez modi­
ficando un archivo de configurarión colocando el nuevo módulo en un directo-
no predefinido (los añadidos (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 aplicación, los usuarios deben procu­
rarse u n nuevo módulo editando u n archivo de configuración o copiando el
módulo a u n directorio preestablecido. La recom püación se hace innecesaria
El código existente en su aplicación carga los nuevos módulos y, oh sorpresa,
uno puede com enzar a im portar y ex p o rtar un nuevo formato gráfico. E 3 te
enfoque se m u estra en la figura 14-2.
C ada vez que se necesite o btener código de una biblioteca diferente, sim p le­
m ente em pleará la interfaz di a fin de carg ar la función que se requiero, lo
que se ilu stra en la figura por las ¿lechas que a p u n ta n desde ia aplicación
hacia 1zs diversas bibliotecas. Los requerim ientos globales de recursos por
! ) ) ) ) ) ) > ) ) ) ) ) > ) ) ) ) ) ) ) )

316 Programación en Linux

*/
*;1Cll;d3 <SWi0.h>
=irclude <$:diic.n>
nrclu d e <dlfci i>

iot cain(void)
C
void -nar.cíls;
vot<3 ( 'r u t i n a j 'o a u a r i d a ) ( I ; r Pun tero a U r u tin a cardada a 38 " i ; t i l i i 3 0 3 •/
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 ;

• '.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 jírro 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*. fll»r r o r(| J ;
exit(EXIT_FA£UJRE);
>

>• S lu iinar la cadena descriptiva úol e rro r, si or.ta í* l» to •/


d le rro rf );
'•utir.n rcíjuoridu ■ oisyníhnndln, , 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.) {
a rtn t^ rv o jo encongo r » to r o a f _ « _ « r r o r ( ¡ : V s\r‘ , n#nsajoj*rror| ;
«xlt(EXXT/AÍLUBEJ;
]
r M\or.\ u ti il íj r ol sudólo cacado. rmornar_3j_err<ir •/
:f({ jX in t» ro _ a r« h iv i> • r«c«n(* 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 consiiíarjdo con « i projmo y descargue «1 oojsto carraca ",


diclc$i*(nandL«| ¡
4xit(cX I7_Sl.C C eSS>;
\
La salid a de oate program a es la siguiente:
sjcc -q -wali ccirp.-obarjji.c -o c «a ro b a r_ c l -le í
3 lO_l3ftMY_PATVt«Si 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 sueódigo
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
Capítulo 1 - : Creación y utilización do bibliotecas de programación 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 haría norm alm ente a
¡3 fundón 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 capítulo h a explicado el em pieo y la creación de bibliotecas de p rogra­
mación. Tam bién concluye con la co b ertu ra de los A PIs de program ación. La
P arte IV, “Comunicación 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 FÍFO s. m em oria com partida y colas de
m ensajes, y tam bién sobre sockets.
Parte IV

Comunicación 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
) ) ) ) ) i ) ) ) ) ) ) ). ) ) J ) ) )

15
Pipes y FIFOs
Este es ei prim ero de cuatro capítulos que cu b rirán los diversos m étodos em ­
picados por Linux p ara p erm itir la comunicación e n tre procesos, tam bién
denom inada IPC InUrprocess C om m unicatiqn). IPC es una sigla genérica
que se reñ ere a los métodos que u tilizan los proceso3 p ara comunicnrso on-
rre sí Sin una IPC. loa procesos podrían intercam biar, sólu intercam biar, d a ­
tos u o tra información 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 común (tal como ocurre con la
relación padre/hijo después de un f o rk :— por medio de cualquier posible
deacr.ptor de archivo heredado E$t*? capítulo 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 tilización 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* ow parte de procesos se trata en 'Emploo de


forlc*. D¿gfc'\a 78.

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 núm 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 dúplex; los datos fluyen sólo en una
dirección 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 habitual-
m ente FIFOs (F irst In First Out, ;o que e n tra primero sale primero), con el
mismo significado que en la práctica 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 bién 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^saíN»(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 ; PIP6’F:FO
♦ :

Ctt-óttpdSSwd > /tmp/rpylHo t C ' pjWytJ'O ^ ■eul ■!! 'a: <

S o ji il -o: < .tro-nyí'o i


$ oaVóü'saasr.d >.'Kra'rr.yí.fc
F ig u re 15.1. Los pipes y los FIFOs funcionan de manera sim ilar pero üer.en
diferente semántica.
La m itad superior de !a figura 15-1 ilu stra la ejecución 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 cómo 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 líneas 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 cómo se corresponden
entre s í la en trad a y la salida de los dos tipos de pipes. Todos los detalles se­
Capítulo 1 5 : Pipes y FiFO s 323

rán 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 capítulo. En la parte superior
de '.3 m ism a, la salid a del comando c a t e s tran sm itid a a través 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 típico de las pipelines de interfaz.
En particular, nótese que la utilización 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 serán 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 3¿n nombro cumplen ol mismo
propósito, 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 utilización de los operadores de
redireccióa 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 ayoría 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 carácter ¡ es el símbolo 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 función 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:¿ cae¿t¡Jo se refiere só-o a to-s o-ce* ü n nonxxe, y F1FO se aplica únl-
cam era a os p oes cc'i '•ornare. ranto ¡es aioes como los FIFOs. sin amoargo. son se-
m duoír*: ■: sea. •es ístes fíuyen silo en una arecaón. :o mismo que el agua en una
co^-r'.j aesagúe. ranto es aces ccmc fes ^lFOs son non_3eekaüle, es decir, no
i©r sescepticies ce sa' marimrfadcs internamente: es tieci/, uno no pueae ur.iaar ‘un-
cc^-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 sólo sem : dúplex, por !o que ios d ato s pueden recorrerlos en u n a sula d i­
rección 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 común. Tal como el lector reco rd ará del capítulo 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 cómo ¿luyen ios datos por u n pipe.
) ,
d24
} > ) 2
hfogramactón en Unux
j . y . ) j ) ) ) ) ) ) y ) ) > } *

•«9 l---------------------------------------------------------- - «sao


--------- 1** P|PE —{--------►

F ig u ra 15.2. Los pipes sin nombre son semi dúplex y pueden ser accedidos
sólo 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 leídos (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 leído o escri­
to. éste debe existir. La función 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 función 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 sólo
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 sólo 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 función
asigna tam bién un valor adecuado a la variable global de erro r e r r n o .
✓ la i»n*/ixi3 -Jo las llAmjüas ¿i ststomu opon y dosn está cwoiorta en 'Acorara y cierre ce
ve?.-vos*, página 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 inválido,
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, sólo lo son a un ¿nodo que reside en el kem el. La
figura 15-3 ilu stra esta cuestión.

F ig u r a 15.3. Un pipe de U n u x existe sólo 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 .
) ) ) > ) ) ; ) ) ' ) ) . ) ) ) ) ) Y )

Capitule 15: Pipes y FIFOs 325

\ «/ E je m p lo -■*
1/ E l siguiente ejemplo abre y cierra u n pipe:
• v^ac-j c ro g ru a =- Interna? ptíopn.c V
E JE M P LO
r
* tó fir_ o ic a .c y =i€r,-3 ^ o¿g<
•/
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:

¿?((p£p*Urr*flio_<S«»C'‘iO?orM)) < 3) {
parfor(*plpa*)¡
íil*(EX:r_FA¡L!Jft£);

>
C ’.o» « a ic n e to ra a jon va, « p r a g lo ^ a íc ríp to r a a l» ! ,
arr«gIo_e«ac'> 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 ||;
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 sfirién 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 recoccatoóc ce ¡as la/nacas a sistema read y «v rite , reférase a
ta 3 * Lectura y escritura ce a rü v .cs \ ofig^a l-i2 .
326 Programación en Unux

En realidad, no tiene demasiado propósito 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 partiría
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 después 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 comunicación IPC. Cuando un proceso está leyendo debe m antener
cerrado el extrem o do escritura del pipe, y recíprocam ente. El paso siguiente
dependerá entonce» de cuál sea el proceso quo realice la lectura y cuál el que
efectúe 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 envía 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.

PRECAUCIÓN
Cualquier -manto 3o «cr y escribir en smr»a extremos de un único cipe COnstfluye un sano
er-ct d» ^o^ra-'acón. Si CCS procesos necesitan a ?unc*onalicaa (le un pipe ful! dúplex. o
arcceso paore tíew proceder a abrir aos ¡>c«s 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 porción superior de la figura 15-4 m u estra la disposición de ambos des­


criptores inm ediatam ente después 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 después 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 e»tre^o ae escritura ae un piM. cuatouier intento de
-ce' Ce ese ooe retomara 3 tara :-d¿car •? fin del ar;hr<o. Sin enoergo. s¡ es el exVe-
- c 3» « o x a e m "a s*5o serpeo. cuaicver intento <3o 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 escri-
o-w-do no ntiKcatKa o írc*a a SXG*»!f»c. el onsceso de escritura terminar.1».

✓ *>V3 soasar soore <a maneja da .marcaotar o pasar por alto las láñalas, 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 tañer» 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 »
•laclóse cfcnt’.h»
•ir-cU-íe <Uattí.n>

•ce^vne TAjuÑQ_ayf

vcus i i ; : r _ i : _ * r r c - ( c r i ' •*ería]e).


r a t M in (m t ar$c, c«ar • irg v ;;)

C
ipz irr«g:o _d*«cri3tcresl<|, /• Arreglo oe descriptores de
arenivo asrs ei- 3ipe •/
ín t dascriptOfArcAlvcOsras; • Descriptor oel archiva que sw iinistra los
catcs c.-e 253ea •/
/• t'a r.s a irir por e i pise ei
5-ocsío 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 ;
) f i ) ) ) ) ) ) ) ) ) ) J ) ? ) ) ) / ) I }

328 Programación en Unux

/ ' Sfectuar jn fí¡r< y cerrar ios descriptores adecuados ’t


i f ü p i d = ?or¡<(}) < Z)
s a iir _ s i_ s r r o r ( 'f o r k *} ¡
l f ípid « 0) {
/• 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 l«íldyte3_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 j¡e s c ri.p to re s (< S ! \ ¡
} alse {
E i p r x s s u aatíre 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’ ) ; / • 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 p¡jr e l
o ioe algo

p -e d e rn jn a d o */
} « is« | I ’ Todo anduvo ox en • /
* » i:* ((B y t « !.l« ie o s • 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||
> •)
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 ( 1J } ;

»
/• O btener La co n d ición 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) ;

/oíd 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 línea de comandos ol nombre del archivo que con­


tiene loa datos. Si la linea do comandos no contuviera ningún 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):
t 1 ) ) ) ) ) ) } ) ) ) ) ) ' } ) > ' ) ) J
) )

C apítulo 1 5 : P ip e s y FIFOs 329

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 * tín 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 espués 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 nálogam 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 inación 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 través 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 bién 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 condición de salida dol pro­
ceso hijo y prevenir así 1» creación de un proceso zombio o huérfano.

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 tío osoKurar
5 9 * f ic w « 3e «sc/ir-í* (jo* sear atómtaw; 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 re-
¿ia. 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 acción 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 condición de salida del proceso
hijo E sta secuencia de acciones es ta n común que el ANSI/ISO C las incluyó
en dos funciones de biblioteca estándar, 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 pelóse(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 Programación 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 3«r r o w, que tienen la m ism a sem ántica que la
que poseen en la biblioteca e stán 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
función 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 stán 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 stán 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 condición 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 función e stán d a r de C f c ió s e . La (unción 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 condición de salid a al proceso que la llamó. Si la llam ada a pelóse
fracasa, la mism a retorna • 1,
>i / E je m p lo
] ,'B f El siguiente program a es una versión a ltern ativ a fie u s a r _ p ip e que utiliza
popen >• p e ló s e :
ei l Mf LO . 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 oufíTAMA.ÍO.S'jF); /* 9uffer para *entrao«* oe patos \

/* Creación e sl oip« V
i ñ (puntero_arcr.lvc = j»cín (cad en3 _l¿iw a_c«iand os. •.— ) ) = W U)
íaiir_si_errorj*30ceíi*);
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¡-.5WX€SS:;

#o:C S*lir_*t_«rrcr(cftar
(
ptrr«r<*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 código La contrapartida e i tenor que r»1-
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. Además, 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 función 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 pérdida de flexibilidad, pop en perm ite ahorrar entro 10 y
15 lineas de código, y el código 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­
nuación, 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 .: Oe»”' w e le r* a a is*
SALIDA */

»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 rambiéu 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 Programación 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 función crc3r FIFOs:
skí-fc [oocionl raabra^fifo ( . . . |
Esto comando crea un FIFO denom inado n o m b re_ f i f o. £1 parám etro op •
Cion es generalm ente -m .Tiodo, donde modo indica el modo (ec dígitos ocía­
les) del FIFO que se procede a crear, sujeto a modificaciones por p arte de la
umask. Después de h ab er sido creado el FIFO , uno puede utilizarlo como si
fuera parte de una pipeline (secuencia de pipes) norm al.
>• i E je m p lo
ís ) El ejenpio que viene a continuación envía la salida de n u e v o _ u s a r _ p ip e o
través de un FIFO im ag inativam ente denom inado f i f o l quo, a su vez. en­
EJEMPLO vía 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 ./ftu«vo_uiarj)ipo > fífol
A continuación 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
) ) )
)
Capítulo 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 línea 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 código truncado y de a s­
pecto extraño que com pleta el listado. Si f i f o l hubiese sido un archivo n o r­
m al. el resultado h ab ría 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 «jaro-
c«rfa 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 carácter i
SgTtgSCO a» r e n e n

C r e a c ió n d e u n F IF O
La función 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 función 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
notación octal, en c o tíe . 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*c«cr,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. simple-
rrantt efectúo una operación 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 programación,
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. *CÓ¿gos’ac em x generados zcr -as ¡amadas a sisaba*, en página 1 . f. :•


te r* una ¿sta x tos errerss que retoman generalmente las llamadas a sistema.
334 Programación en Linux

i %i / E je m p lo
j 3 [il'y El siguiente program a crea un FIFO en ei directorio corriente:
• vonor» orogr.ir .1 or Interna?: n í« f lf o .c
EJEMPLO

• nuevon.f3.c C'*a un FIFO. SifltaxiS: 'tuovoftfo no.7iDr9_fí*o


•I
•trclude <9ys/:yacs.C>
•tncludo <sy5/stat.h»
• mclude <8rrng.n>
nnclud# <síoio.n>
#uiciud* <stoll3.n>

int « u in iln t argc, c m r *argv| |)


<
nooe_t nooo • 6W «;

;f(a rg c t* 2) { /• £i r.ctJKa d«L srograua taobion »• c u n ta :ooo


argun*ntn V

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€ £vgPL£C: ifo «n w n b rs j^ j^ fa »


SALIDA S ./ntMV oí ifo f ifo 1
$ /nuevoílfo f l'o i
akf'.fo: File *xi«S
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
existía, 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 inglés 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 inación, 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 según el cual ‘todo es un archivo" Como la aper­
tu ra y e; a e rr e de FIFO s es idéntico 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 capítulo con el títu 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 más im portante, tís
el com portam iento de un FIFO ñ éste h a 3Ído abiorto utilizando ol indicador
0_'<0N8lC3CK. Recuérdese que los indicadores 0_WR0NIY y 0_RD0NLY pue­
den ser sometidos a u n a operación de 0 lógico con 0_NON8lÓCK. 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 bién 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 algún otro
proceso abra el FIFO p ara escribir. A nálogam 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 envía la sedal SIGPIPE al proceso quo está intentando escribir y
«signa a e r r n o el valor EPIPE. Después, 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 inación de archivo
(EOF). Como fue mencionado con relación a los pipes, p ara asegurarse que
las operaciones de escritu ra sean atóm icas cuando hay varios procesos escri­
biendo a un mismo FIFO. ia cantidad de bytes escrita en cada operación de
e sen tu ra no debe su p e ra r en tam año 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 últünu
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
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 progra-
eje m pio e 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 'i r s : •

• i« r _ íifo .c C re ste 3 ¡ r a resa f e s *


•/
« in e lú O e < s y s / t y p e s .f l >
Programación 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 uívofifo.c C-ea un PIPO. 3inta*is: nuevo*lío nooíir9_fifo


•/
*:«ciu d « <jy*/:yfl«s.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 • Í6«C;

iffarge 1 - 2 ) { £i iw b ro d*l progr»no caablon su cuenta :oi»o


argun*nto •/

put j ( ’ MOQO D£ íUP’.SC nuovo'Ko <nont!r#jJi>_f lfo>’ 2 ;


# x it(6 X IT _ rA lL U R í);
}
-f( lfo<arowC1). *06011 < *) (
¿ •rro rC n k fifo * } ;
«xiti£Jt: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*Lío fi-'ol
■tófiío: 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 inglés por tra ta rs e do u n m ensaje "del sistem a).
Capítulo 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 inación, 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 según ei cual 'to d o es un archivo" Como la a p e r­
tu ra y ei cierre de FIFO s es idéntico 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 es-
cnbe 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 más im portante, es
el com portam iento de un FIFO r. éste h a sido abierto utilizando el indicador
0_NCNB10CK. Recuérdese que loe indicadores 0_WR0NLY y 0_RD0NLY puo-
d*n ser sometidos a u n a operación de 0 lógico 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 bién 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 algún 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 envía 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 inación de archivo
(EOF). Como fue mencionado con relación a los pipes, p ora asegúram e que
las operaciones de e se n tu ra sean atóm icas cuando hay varios procesos escri­
biendo 3 un mismo FIFO . Ia cantidad d e bytes escrita en cada operación de
escritu ra no debe su p e rar en tam año 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
p¿rte 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 .: •/
I r • sieí.*_f‘ Te.e Zrt j : í a ira rsaa rrea í :
91

f i a c l 'J H < SJr3 /ty p « .¡» >


I ) > f' ) ) ) l ) ) ) ) ) ) ) ) ) }

336 Programación 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 : <J«scrlptor_archivo /• Descriptor del FIFO »/
inc ma byras; /• Nunero de oytes leíaos desde e l
■:fti •/
char büf{PI?€_0M FJ;
acdt^! mío • *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*);
ítiq£XIT_FAILUBtJ;

y
al FIFO y «xhíotr *u salida do o.iios rm ta onco.itrar EOF •/
*ml«<l«>uB.pym • '•«ao{dís<n,otor_4rcfnvo1 nuf, ¡>IPE_8UF •.)! • 0>
p r in :f i* líír _ f tro líy o : %s\ buf|;
cio«(<l«scriptcr_arciiivo) ;

ttlt{CXir_SUOC£SS);

¡¡ 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 conocítfo*
•I
íL-wiud# <sys/ty«s.n>
iirtcloa# <sys/stat.h>
íirclwJe <ermo. n>
) ) ) ) ) • ) ) > ) ) ) ) ) ) ) 1 J >
J ) >

Capítulo 1 5 : P ip e s y F IF O s 337;

#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 ; / • D e sc rip to r d e l * :F 0 y
is t Itn ; / • ütuj^ro ae b y te s -*» c ritc 3 « 1 F [? o *,•
c s * r b u f{P iP E _ 3 u F ]; ’ • S a r a m u a r « e n t u r a s a tó n ic a s *í
• o e » , : *so o - #€46;
p u rte ro ^ o ^ ftic ); r Para la liw ada * tiñe V

• 6*r»lo 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 :«r«r 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 (tíe 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 Programación en Linux

5 l« p !3 l, * 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 ;


o o ra a c u tiv a s a i FIFO
>
c ió s e Id 8 s c rip to r_ a rc l> ;v o l ;
« < it| £XlT_SüCCES3);
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 pequeñas 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 Ltvs 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 expresión “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 inútil, de aplicación cliente!servidor. El servidor es
i e e r _ f ¡.f o; el mismo procesa m ensajes enviados al mismo a través 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
propósito es enviar m en s^es ai servidor.
U na aplicación cliente/servidor m ás sofisticada llevaría a cabo algún tipo de
procesam iento de loa datos que reciba y en v iaría algún tipo de datos o notifi­
cación 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.
Capítulo 15: Pipas y FIFOs 339

Lo que viene
Este capitulo ha cubierto ía forma más sim ple de la comunicación entre pro­
cesos: los pipes y FIFOs El próximo capítulo continúa con la discusión do los
métodos IPC. concentrándose 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 comúnmente er.
aplicaciw es m ás ex ten sas y sofisticadas, tales como los 3i3íemas de adm i­
nistración de bases de datos relaciónales 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 ) ) j ) ) ) )> ) .) ). ) ) ) ) ) ? ) ) ) y ) ) y
) ) ) ) > :• > M )
• a

Memoria compartida
La m em oria com partida es la p rim e ra de eres clases de IPC. o Comunicación
Interproceso>s. que se ap ren d erán 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 próximo 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 bién 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:
• Descripción general del IPC System V
• Problem as que p resenta el IP C System V
• Utilización 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 núm ero de ISBN 0789722151.
Programación en Unux

Introducción al IPC System V


Este es el primero de dos capítulos dedicados a an alizar los mecanismos dol
IPC System V Esto 3istcma do comunicación 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 antigüedad que fueron escritos antes del
advenim iento del estándar IPC POSIX. Los tres tipos de comunicación entre
procesos provistos por el IPC System V tienen básicam ente la m ism a interfaz
y el mismo diseño general. E sta sección p resenta los conceptos fundam entales
del IPC System V y analiza las prestaciones y modalidades de programación
que son comunes a semáforos, colas de m e n a je s y memoria com parada
Las estructura* IPC (semáforos, 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 "semáforos, colua di* m ensajes y segm entos com­
partidos de memoria". Por la m ism a razón, la expresión objeto IPC se em-
plea para referirse ;» cada uno de estos tipos de e stru c tu ra en p articular sin
necesidad de se r específico ai respecto. Ln figura 16-1 m u estra cómo 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
-ornún; se comuniquen entre ellos por medio de uno de los mecanismo® IPC. es
decir, memoria compartida, semáforos o colas de mensajes. Los datos fluyen li­
brem ente en tre los disantos procesos por medio de los mecanismos IPC.
Capítulo 15: Memoria compartida 343

Cada objeto es referido y accedido por medio de s u ideniificcdor, un número


entero que identifica inam biguam er.tc aJ objeto y su tipo. Cada jdentiñcador
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, podría h ab er sim u ltán eam en te en uso tres ider.tifi-
cadores del mismo valor numérico 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-'-caúc^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 ¡r«e !as estructuras Van siendo creadas y elimi'- u
<¡»r: cferoMOo fo.-malrr*jnfe deoc<nir.3Co núnwo secuenciai ítt
u M <Je va alimentando "•asta ciat ur valor máximo. en «i cual vuu-'vo a 0 y
reccn-. erra ia secuencia ~orr*oca. Q valor máximo depefld* dol na tw a operativo y dol
ntrs+ w Ola se *s:4n uv .rando En Lnu» os icontlflcadoros je declaran como ente-
•o» vn i*gPO de tipo » n t . de rodo o».c el máximo vator cosiáíc paro «'tos en 65. 535.

Cada estructura IPC es creada por modio de una Junción que termina en {jet:
s e n g e t p ara ¡o a semáforos. 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 efectúa 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.
Después que una e stru c tu ra IPC haya ¿ido creada, loa llamada* «uhuiguien-
tes a una función * 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 función * g e t con la misma clavo.
La cuestión es. por lo tanto, cómo 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 putídan uti­
l i z a r la m ism a clave E n uno de los métodos, 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 fundón
' 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 identiñcador reto rn ad o por la fundón *get en el ü-
lesystem . donde otros procesos puedan accedería. Cuando un proceso efectúa
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 función 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 automática.
Otro método 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 tendrán 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
I I ) ) ) / - ) ) ) ) } ) J ) ) ) ) ) . J } )
344 Programación 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 código necesario p ara a d m in istrar dicha posibilidad.
Un tercer método requiere el empleo de la función f to k , que adm ite u n a ru ­
ta de acceso y un carácter ú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
función * 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 métodos mencionados antos: incluir la ruca de acceso y el identifi­
cador de proyecto en un archivo de encabozudo común a todos los program as
o almacenarlos en u n archivo de configuración 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 capítulo no la tom a en cuenta.

PRECAUCIÓN
Dicto do rrarijra crido, ¡a imoiomentociOn de Unux <Jo ¡o funtón ftofc no funciona b ?n
La misma una clave na única en Ia3 siguientes situaciones.

• Cuando do*, vínculos s-mOMco* Aferentes vinculan ol mismo orcr-vu

• Cuando ¡o b primeros 16 bits dol númoro tío inode do la ruta do accoso coinc-tíen.

• ; 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 múloploo controladoras se disco. El número p^nci-
cal rte- dispositivo sera dlfe'enttr. pero el número menor d# misma puodo w igual

Cada i debodad d<» la implomontaclóo por parte do Linux do la ftjndón ftok, -»e reco-
r enc^cciOansefite t :q$ «ro re s considerarla inútil c ignorarla.

Además do unu c la v e , las fundones *<jet también 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_CR£AT 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 ejecución. Cuando crea una estru ctu ra FPC. uno debe efectuar
una operación 0 bit a bit en el argum ento i n d i c a d o r e s con los permisos es­
pecíficos, utilizando lu notación 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 recién
creada. El lector encontrará ejemplos específicos de esta situación m ás adelan­
te. Tal como seria de esperar, el [PC System V incluye una función 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­
mación es compleja p ara los beneficios que provee. Segando, las e stru c tu ra s
IPC son un recurso más firm em ente restringido en cuanto al núm ero que un
¿istem a perm ite ten e r e r uso al m ism o tiem po que, digam os, el núm ero de
archivos abiertos que puede a c e p ta r el mismo o si núm ero de procesos acti­
vos que éste perm ite. Tercero, a p esar de ser u n recurso coa lím ites, la s e s­
tru c tu ra s IPC no m antienen un cocieo de refereacia, o sea un recuento del
núm 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 limitación constituye u n im p o rtan te problem a de diseño.
Finalm ente laa e stru ctu ras IPC. como so obser/ó antes, existen sólo 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 todavía o tra interfaz más
de programación. 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 algún 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 modificación de alguna condición, esto constituye casi siom pre un mal
procedimiento de program ación 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 señales.
✓ ? v s recftijw a E/S er rrsuttctex y la nairaca a sistema s e le c ? , ver *Mj|tio=exíng do
E /5 * . s 3¿ íí S 169.

Qué es la memoria com partida


La m em oria com partida es u n a región (segmento) de m em oria d estin ad a por
el kernel p a ra el propósito del in tercam bio de información 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 mapeándolo a su pro­
pio espacio privado de memoria. S i un proceso actualiza los datos p resen tes
en el segm ento, dicha actualización re su lta inm ediatam ente visible a los de­
1

346 Programación en Unux

m ás procesos. Un segm ento creado por un proceso puede se r leído 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 información 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 concep-
tu alm en te a los archivos (ñapeados en m em oria. La memoria com partida se
ilu stra en la figura 16-2.

✓ La creación y ei empico do archivos mapoados en memora se anaDicon on detallo en 'Ar-


ctvvos maneados en «nemono*. jsflffinn i7d

La figura 16-2 sobreaimplifica de algún» m anera el concepto de m em oria com­


partida porque el COrraapOridiénte segm ento puede consistir tanto do datos en
In RAM física como en Ia« páginas 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 rectán ­
gulo sombreado,. Los rectángulos 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 bién 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 región 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 demás 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 páginas
puedan e sta r residiendo tran sito riam en te en el disco), la m em oria com parti­
da es una m anera ráp id a de que dos procesos se puedan comunicar entre 31'.
Tieno mucha3 de las ventajas de los archivos (ñapeados en memoria.

Creación de un segmento de memoria compartida


La función 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 momo-
fia com partida, se debe incluir en oí código 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/s¡im .h > . El pro­
totipo de abm get es ei siguióme:
ir : »r»5«?<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_CR£AT,
I?_EXCL y un conjunto do bita de perm rso (modos), todos olios sometido» on-
tre si a u n a operación lógica de C bit n bit. l.os bits de perm iso deben sor es­
pecificados en notación 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 m®xer* para los «jámeles 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 ■•¿•quiere oor-
cuo tocos os c m ^stra -eci'jycn < ioc.~n>, auf~noi¿ere cue „X0P£M_S0L‘RCE es:*
ocf’ -do. Ctrósamante. cuarto /O cpripii* estos programas en -jra rwtoiooón pretíe-
le'rrv'nacsa oe ü^uc de Sed Hat 5.0 presenta en m sistema, no mío (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 función f t o k . El argum ento StZ9 (fomaño) especi­
fica ri tam año del segmento, redondeado h a d a arriba al valor de PAG£_SI2E,
que es el tam añn n atu ra! de una página p ara un procesador determinado í4k
para ios procesadores de Intel actuales, á k p ara el Alpha: Si Shmget cieñe
éxito retorna ei ¡dentiñeador del segm ento y si fracasa retorna -1

E je m p lo
El próximo 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 identiñcador que re to rn a S híig et.
• *i0Ecr5 :.-;«g.-sflá ir . : -.te'*=*-*r n* »-•>«.« *

• :~ n r_ izzzziP i:a z. : :~ a : un sefiflénta i s n c r i s coapartitía


'I
~ z-z'..zi « s y s f t y s e > .*>
) )
} } } } 1 } > > ) f ) ) 1 ) } ) ) ) ) ) )

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>

W8íine rAiwÑojü? -*«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 \ iíf ln t iíic 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 tía r ¡Sol legtíflnto cre ad o : 40833

----------snarod M*nory 3««o«jnta---------— -


sau o a *ly ,hn;!j pornl byto* r u ttc h ita tu »
«xOCMOOOií «0705 kur?J»ftll 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 núm 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). Obsérvese quo no hay ningún 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­
plícita. utilizando la función sn m a t discu tid a on el próximo punto.

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 dirección 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 cancelación requiere u n a llam ada a s n m d t. Es-
tas dos ru tin a s tienen los siguientes prototipos:
cria- •snnatlint 9nniij, c l^ r ♦snir.adflr. f lags};
Int 3r.®Jt{cra.- -snoaori:
f ' } ) \ ) 1 ) I I , , ,
> >
C as'tJlo 16: Memoria compartida 349

s n r i d es el idenriñcador del segm ento que el proceso desea adosar. E n


s h - s t . si ¿ - - a d d r es 0. el núcleo 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 dirección que elige el kem eL Si s h ~ a d d r no es 0. indica en cambio la di-
recdón 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 ría , 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 sólo le ctu ra . La opción 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 ubicación 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 vínculo 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 dirección 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: at»r*.í V
r
• *sc»«r_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 lítn ri¡'leader
•I
»ir<l-jfl« <Jy*rtyc*s.f'>
#incluC« < s y m ^ :.* >
linciuc* < iy i Iina.!\>
•in c lu í <*tíi«.f»
•irclvtf» «italtD.h>
« t M in (lít t a -íc , d u r M r r » I I I
i
i r \ ic e r t ific a d s r S e s M flT o ; / • I d e n t ific a d o r d e l %«o«iemo •/
c n a r *5u f s g r« w e c c íip ; / • P u n tara i d ir e c c ió n sn .« p a c ió de n m <oriJ
- • l p rc ca a c *7

/• 3< en la linea de scoanccs naya presente un usentificttdcr de


i«S*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 - tfioatíicentiflcadcrsegnento, í , 0)| < {char •) 0} {
;^ 'rcr( ;
e x i tiS t; T _ P A I u f l S ) ;
>
330 Programación 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 t«D ü 4_ tgtotw conaj) < 3) (
perrorCsnnot');
•X U (E X U _FA IIU R E 1¡

)
n o tsc s i e n t o u a sa c« ilac < i\n ’ ¡ ;

/ • V o r t fic a r qui) o fo stiv a n o n t» o l sognonto haya s id o d esaco p lad a •/


syít<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 vonñcn su
código de retorno a d 0 s a r _ s g t 0 ineffic0 mp asigna tem porariam ente (caái.v al
cero el tipo ic h a r *) p ara ev itar asi m olestas advertencias dol compilador
Este ejemplo tam bién 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. Obsérvese que el núm ero de proce­
sos adosados, n a t t c h , prim ero so increm enta y luego disminuye.
5 .1 ad05ar_3gto«anco».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 ríd vichor / 3 « g * e n t S --------------

noy shtud o»ner p errs O ytes n attch


Jx&NOOZM 4&S33 * u r t .* 3 U «366 -0 9 6 I

Sagwnta desacoplado

-------- Snarad Wenory Segnents ------------

*ay 3?iflid onn$r perns bytss natten arataa


íxaoee-wao c<3833 k u r? j»a ll 566 4336 o

Como se puede apreciar en '.a salida, luego de desacoplar el segm ento de me­
n o ría com partida el valor de n a t t c h pasó de 1 a 0.
Capítulo 15: Memoria compartida 351

\ t/ 2. El próximo ejemplo adosa al program a u n segm ento de m em oria compar-


T | tida, escribe d ato s al mismo, y luego escribe el contenido del respectivo b u f
/= l fcr en el archivo s a l - .d a _ 5 gto-ne 173c a n p . o u t
iT c M e T o • * 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 M ao ry sscnent
• S i r t u l s : * y ¡ '_ u ; ‘,-^*xr.oro íc m n ific a a o r
•I
<rfS¡Xym.n>
• ircJjtíf <ty*/ÍDC-h»
ttflclod * <sysí*.-o..H»
imcluO* « itaio .i»
< i:a i¿ o .n »
•inclwJ* «^ c rti.ft»

r«ww_3C? <W6

i«: *!^c. cn»r *»rQv[ 11


<
u n ;<J*n:*fic*Scr$*5M n :o : /* ;d*ntl.f:c» dcr oet jagncntú V
cfitr *6wf_ iy:oa4íKO$o; / • Pu m ijro i a tr a c c ió n an « p a c i ó do n an o rta dol
pr>cwo •/
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
if lt t; /• Contador •/

• $• sisara *us la li-a a le -cnandcs iay« preserte un td a m 'lc u d o r do


ttgaen:* ’i
if(ír^c l« 2) {
p u t s c y c e o 0 5 Síf f U O r i e r i P _ j ^ t 0 n M C 0 0 C leader»*)¡
í*it(Drr_FAIUJR£l;
}
ia«*tifie¿R»r$egw>'!to - a t o iis rjv rrii);

• « o s» -* é l « s ie n to •/

:* ' sjtoni^coie * snaatíica.iti'icaccrSegaer.To, a. a>) < (cr<ar *) Di {


‘jneH 1) •
íi;:í£ x :t_ c x h i^ j;
>

• Asignar rijc.-ia z z n ai =E-;3íft: sicsaao •


i - 3u*_ sgtcaeeccac • «iioc{3üeof< cna< - • TAKM0_3UFH « íiULL) {
3 í-rcrr»si;oc*);
e*it<=Xrr_FAIL^£);
}
; ) ) j: ) ) ) } ) ) ? 1 f ) ) ) > ' >
Programación en Linux

í o r ( i t 0; i < 7«/AW3_8llF; — i )
üu?_ sgrcasncors [ í ] « 1 % I27¡
cascriptO!* archivo - 0C8nC33Íi<Ja sstoirenccso.ouf, 0 M E iT ¡ o « bov .Y .
96M}; * ~ ~
«'•.t8 (d « S c riD *.o r_ 3 'C h iv o . cu f_ ís-to n e n c w a . rAttAÑO_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 región 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_igtoe«i*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*8•C'0•E•l:• ’
La -Jcaicncia de caracteres que so m u estra Gd on renlidnd continua. Los sím ­
bolos indican sim plem ente la continuación do! texto desde la línea an terio r

Lo que viene
Este capitulo analizó el sistem ii de m em oria com partida IPC System V El
próximo capitulo. "Semáforos y colas do m ensajes", continúa !a exploración
dol IPC System V. p ara pnsar posteriorm ente a la program ación do TCP/IP
y aockets en el capítulo 18.
Jt í ) i

-
17
Semáforos y colas de mensajes
E ste capítulo continúa con «1 trata m ie n to del ÍPC System V que fue comen*
lad o on el capitulo an terio r El análisis del mismo norri completado con la co­
bertu ra de las cola? de m ensajes y los semáforo*.
E ste capitulo cubre toe siguientes teínas
• Qué es u n a cola de m ensajes
• Creación do un* cola de m ensajes
• Agregado de elem entos a una cola d e m ensajes existente
• Publicación y recuperación de m ensajes
• Eliminación do una cola de mensaje#
• Qué son los semáforos
• Creación y eliminación de sem áforos
• Actualización de semáforos

✓ La uUitzaoón da octetos ¡PC ae memona cofr-oarnaa se anaína en ai caoítuío 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 j f ) ) j • y ) y ) } ) . ) ) ) ) ) }
356 Programación en Linux

El IPC System V y Linux


EL método de comunicación en tre procesas rPC System V es sum am ente cono­
cido v habituaim onte empleado, pero la im piem entación 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 versión de Linux dei IPC Sysiem
V tam bién es anterior aJ IPC POSIX. pero son pocos los program as de Linux
que en la práctica la im plem entan. aun cuando se encuentre disponible en ios
kerneLs correspondientes a la versión 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
POSÍX (y en general tieno éxito), im plem ento una versión demasiado antigua
tanto del IPC POSÍX como del IPC System V. La dificultad es que el System V
se encuentra sum am ente difundido y es m ás común, pero la versión POSIX es
mejor, más 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 Método Correcto O; o oea, ei IPC POSIX.
C uando se program a utilizando sem áforos surge otra cuestión adicional Loa
nemáforoa 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 bién do múltiple» procesos) que si: en cuentran en ejecu­
ción 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 redacción
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 3úper-program adores. tr a ta r á n de
encontrar una solución altern ativ a an tes do recu rrir a 1a program ación m ul­
ti-hilos porque la m ism a es difícil de llevar a cabo correctam ente.
¿Mi solución? He procedido a sim plificar ¡a discusión de los sem áforos por­
que la versión System V fue creada pensando en los procesos m ulti-hilos.
Nro obstante, los sem áforos em pleados en program as estándar, mono-hilo,
son muy útiles, como lo apreciará el lector en este capítulo. 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 identiñeador del tipo analizado en el capitulo anterior.
i ) ) ) \ a ) ) > ) j) » > ) > / f ? ) ) y

Cap?íu!o 17: Semáforos y colas de m ensajes 357

Por razones de brevedad y conveniencia, este capiculo utiliza los térm inos
coia e idenr.r.cador de cola p a ra referirse a las colas de m ensajes y a los
identiñcadores 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 leídos 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 leídos on orden FIFO, o se a el primero que se escribe
es ei prim ero que « lee. Los dos rec tángulos dibujados con líneas de puntos
con Lechas apuntando hacia arnera de la cola de m ensajes m u estran cómo
pueden 3 e r leídos los m ensajes en orden arbitrario.
Ib d as las funciones de m anipulación de colas de m ensajes se en cu en tran de­
clarad as en < s y s / rcsg. h>, pero se debe tam bién incluir en el código 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 función m s g g e t.
P ara aña¿Lr u n nuevo m ensaje al fin al de u n a cola, utilíce 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 efectúe 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 función 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 entación 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 núm ero total de
colatí o el núm 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 idéntica 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 iden-
tificador 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
El program a de dem ostración 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
ejeM Pto coid especificada sim plem ente abre la cola existente.
I ' Sonor» <1«1 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* rr«nsaios ú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 lave aa i a c o la • /

; * C raar la c o la r.5n ssje3 *>'


¿ 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 £556 } } < ® ) {
CsDftuto i ? Semáforos y colas de mensajes 359

pí.-ror; ’K C gsticriatj';;
9XÍt(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í< {itíe n tlfic jd 3 r_ c o U •- tso3»t(<ey. •) I < 9) (
C 4rrcrrnsy;-et::s«0 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*, itJantífic.ioar_cala|

*»tt(aiT_succrss);
>
La salida de este program a en mi sistem a presentó ol *iguíente aspucto:
J ,/cr«r_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 ideatifi-


cador de la cola recién creada y luego llnm a a msgge t una segunda vez. Si la
segunda llam ada tam bién 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. Obsérvese que la prim era cola especifica permisos de lectu­
ra/escritu ra p ara todas ¡os usuarios em pleando la notación ootul estándar.

PRECAUCION
AOsférereace 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 mociñcs 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 fi-
mil de u n a coia ¿e deberá utilizar la función 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
i ) ) ) ) ) ) ) ) ) ) } ) y ) ) ) ' }
Programación 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 estén l i s t a s en la ta­


bla 5.1. 'C íe lo s do error generados cor las llamadas a sistema*, pégir.3 125.

El argum ento rnsqid {identificadar de cola de mensajes) debe ser u n identiñ-


cador 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 núm 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 declaración do estru ctu ra es en realidad sólo una plantilla, ya quo
m te x t debo se r del tam año de los datos quo están 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 inación, m type puede ser
cualquier entoro de tipo l o r g m ayor quo cero. E! proceso que efectúa la lla­
m ada debe contar tam bién 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 año 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 leído
Si ? Lags es 3 y ya sea que la cola tenga el máximo de mensaje» perm itidos o
haya sido escrito a la cola ol núm ero total de hytes de datos perm itidos, la
llam ada a flsg sn d se bloquea (no retorna) h a sta que dicha condición sea mo­
dificada. P ara modificar esa condición 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 señal 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 rse-
ceaidaces de !as disertas apiicacor.es. Por «¡emeio, si uno desea transfenr un mensa-
o que consista ■?.*. un valor entero y un arrezo de ipo carácter compuesto por 1 0 Oytes
4ó*o nace fa¡t3 ceciarar msgCuf como sigue:
H ) ) ] ) ) ) ) .1 > ) > > > 1 '

Capítulo 1 7 : Sem áforos y colas do mensajos 361

r . - 'j r
IC-^ tLCCJíersají;
in t i;

c fc a r : í * t o _ w n 5 3 i « n í |;

>;
■5S-9C.’* e * s u n va cr lo ng se^vdc ;<y ios -3aío$ del mensaje, que cvcden
«Star fe— a n sie s cor--" jnc lo constce--* adecuado. B ‘.amarte Ce ¡a estructura decio-
^aca este ejecxeío 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 línea de comandos
r * $ * tr* 5»: ;rjg rtx a « i In te rn e t. « n d .c V

/•
• *wriar_a_eata.c - £ rv ta r on a una cola ya ao ie rta con a n te ric rid o s
• 5 in t» « u « rn a r_ a _ c a ta íd a n tific a c c r da c o la

•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*w¡o_8ü? 5i2

it m c t santa]* { /* Estru ctu ra para a l .««majo *f


lo í’fl tiM _ H e n ia je ;
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 ia « n tific a tío rje o U ;

in t ta n f o .tttto ; I' lo n g itu d se l n a n sa ]e a


se r e n v ia d o * /“

s tr-c t M a s a je O u f f a r .a e n j* } « ; r e s tru c tu ra se o a tro n n e n s a í* */

• Oe te n e r e i ic a n tiíic s o o r :e c o l a tra n s fe rid o en ia lin e a de c c ita n o o s V


362 Programación en Linux

if| a r$ c :* 2] { /» A sacer- nciríjre c a l prograns y arjunerto de su i'.nea


3a corandcs •/
p u tii'W Q O O CE SU P lE O : e n v ia r _ a _ c o la < LtJtQ tifíC 3 < 3 o r í p c o la > ‘ )\

/ ahupe) ;
>
x < 3 * n t ifíc 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 c o la •/

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 : • ) ;

if(|'g et3 0 4 tu -i‘8f_,T«nsa|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_3ücc€S$ >:
}

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 • * n i. i) * . t ia o _ e a n s a | a • g e t p id O ;
r A ñ a d ir «1 n » n sa )« a l U n a ! d« l a c o l a •/

: aiui*a_:exto * strUn<buff«r_*ar,«a|*.tiixto_nonM)#};
i'(( tig jn d < ld « r:if:.c * d e r.c o la , 4bjff«r_aenaa¡«, tn*aAú_t«*to, 0}| < a) i
a a rra rC B jg s n a 'l!
•iitl£ xtr_ F A a ií> e > ¡
)
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 bsér­
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 niñero uno
aensaie coDiicado

El prim ar programa, c r e a r _ c o l a . creó una cola nueva cuyo idennñcador fue


640. E i segundo programa, e n v ia r_ a _ C O la 6¿0. solicitó un m ensaje para
ser publicado y almacenó !s respuesta tipeada (indicada en negritas/ directa­
m ente en la estru ctu ra de patrón mensa ] e declarada ai comienzo del progra-
Caoítulo 17: Semáforos 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. Obsérvese 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 sólo 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 extraído. 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 señalada 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 vu-
lor 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 extensión 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_NOEÁROR. ol mismo resu lta
truncado a n b y te s pero no se genera notificación 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 -*¿aác osra a «gúmena '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-acénseos 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 Programación en Linux

r 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 )» < r E s tr u c tu r a p ara o l « r . s a j e • /
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 ;;

»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 ; / • lo n jltu ií d * l * « n sa )a a
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 « ; / • 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 | ( / • 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
0« c o n a 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 l¡4 rQ v (l | ) ;

r 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 ( tacaño 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 ) ) I ) I .1 ) .» I i > ) i f 7 ) ! ) i
Capítulo 17 Semáforos y colas de m ensajes 365

» t i t ¡£ X I - _ = A lL Ü f t = i;

>
**it(Exrr_sycc€SSj;
j
A continuación 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 . / cr«i^_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«: i«3*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 código 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 código. Re­
su lta de p articu lar interés en el p ro gram a de dem ostración 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 fácilm ente o b ten i­
do 1•*•338). l e e r c o l a podría 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 función 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:
i«t 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, acción) 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 •
Oíd j j s identiñeada 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 parám etros de


u n a cola; UID, GID. modo de acceso y ei máximo número
de bytes que se perm ito alm acen ar en la misma.

E je m p lo
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 lín ea do comandos.
cjsm p io 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 lía in a una c o la oc ttan sajo s
• S ln ta m «iutLna r Tür.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 <identífiC3!Sür_C0Ía>' >;

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 . < 3) {
e a r r o r i 'n s g c t l 'J ¡
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 ;
Capítulo 1~: Semáforos 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
----- UíSJlc» Srf.ü -------
ir p * « ;5 smr*r 5«i-rs
;« n js a í-S y tf» « m sa g « 9
Í1ÍMHJ?: k u n jM il í«S a 0
s
S ..'#!¿siaar.c9U 'Z«í
Con ' í S I
s
S lK t 3
-----MtU(« X k i i --------
«*7 «Kid ownir w nu uieO-úytes mihq«i
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 1liego 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 requúndo 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 ostración, m uestra el núm 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 ejecución.
El comando ip c r o ( 1) elim inará la e stru ctu ra IPC cuyo tipo o tdcntificador
sea especificado en la línea de comandos. Ver las página* dei manual para ob­
tener m ayor información. La figura 17-2 m uestra la salida del comandu tp e s .

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
excíte. Se encuentran corrientem ente en uso rres segmentos de memoria
com parad a, una cola de m ensajes y dos semáforos líos semáforos se an ali­
zan er. ei próximo título). P ara cada objeto ?e listan claramente ¿u clave.
.1 ) ) i J >
368 Programación en Linux

identifícador, propietario/creador y perm isos de acceso. Las estadísticas 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, según sea el tipo del objeto.

Semáforos
Los semáforos 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 información a diaposición 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 semáforos se parecen m ás a u n a generalización 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 sólo la m odalidad má3 3imple de un sem áforo, el sem áforo binario U n
semáforo binario puede ad o p tar sólo 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 oOtanormés Información acerca dol cloqueo tfc 3rcb¡vos y registros, ver 'Bloc^eo de
arenaos*, oágina 182.

Los sem áforos funcionan de una m an era muy sim ilar a señales de trán 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 trán sito esté en verde. Si el semáforo 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 aemáforo se vuelva no cero. E n la term inología 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 semáforo, y suponiendo que el proceso cuente con los permisos
adecuados, el semáforo debe existir. La función 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 bién incluir en el código
m ente los archivos de encabezado < s y s / i p c . n > y < s y s / t y p e s .h > ) :
m* M©ger(kay_t Key, int nsons, ia : flags];
sem get retorna el idenrificador del semáforo asociado con un conjunto de se­
máforos cuyo número es n sem s. Si key (clave) es IPC_PRIVA7E o si key no se
encuentra y a en uso y además en f l a g s se encuentra activado el bit
IPC_CflEAT, el semáforo 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 : Semáforos y colas de mensajes

acceso a i semáforo r l a g s puede ser tam bién objeto de u n a operación lógica de


0 b it 3 hi: car. ios bits de permiso, expresados en notación ccsal. Obsérvese, sin
embargo, que los semáforos deben co n tar cor. permisos de lectura y de m odifi­
cación en lugar de con permisos de lacrara y escritura. Los semáforos emplean
el concepto de modificación en lugar del de escritura porque nunca en realidad
se escriben datos a un semáforo, sim plem ente se altera (o modifica) su estado
mcreraentando o disminuyendo su valor. Si ocurre algún 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 identiñeador dei sem áforo asociado con el valor de key.

NO T A
j h amadas a semáforos 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 ex-
pUcactfn, no oostsnte. es ¿molificar try.am ten» y presentar el rrítsriol -31 JoCtOr en
tvear ce cubrir 'c-3 semáforos ®n toda su co^ple^dad. '*fc sea que se trabaje con un úni­
co soentforo o cor. mochos af mismo tiempo, el errfoaue bás-cc e3 el mismo, cero resus
la « r s o rta r» oue » factor comcronda ¡os semáforos dai !PC System V vienen en
corpxtics. Perw-aimerrte. considera cue la Interfax es ínnecesariamonto compleja. y el
\>Z =>OSW estandart» una ir?eff3r más simple pero igualmente coteote.
a tratamiento que se efectúa ce os ser^fiyos en este capitulo omite también su orr
pi*o er. otras situaciones en ¡as cuates un proceso Üene muchos hilos de ejecución,
los orocetcs mu.t)T.!ct y ol empleo de semáforos en tlicho contexto se encuentra mfis
and oci atanco tic o sa foro.

La función se n o p •'ibñr semáforo) constituye el núcleo de las ru tin a s que


involucran semáforos. La m ism a realiza operaciones aobre uno o m ás de los
sem áforos creados o accedidos por la función se m g e t. Su prototipo es el si­
guiente:
m t «M c e U n t «♦«ta. itru ct J*nouf • « ■ « !)» , unílflpec 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 núm ero de elem entos p resen tes en el arreglo de e stru c tu ra s sem-
b 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; /• Ku**ra d« swiaforo */
saart ssa_5p; /• Operación a LLtvar i caso "I
short s w _ f l g ; ! • Ire ic M o rc » quo controlan •/
>;
E n las e stru c tu ras de parrón se m b u f. el elem ento seis_nufii es un núm ero de
sem áforo ubicado e n tre cero y n s e n s - 1 , en tanto sem_op os la operación
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 semáforo ¿era n u ev am e n te decrem entado y el recureo que-
Programación 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 operación 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 recién creado jo e n cu en tre desbloquoúd') o disponible:


/• ’tonbr* oel progr«*a on :nter-iot: nkaoni.c •/
/•
• crear irrm faro.c Croa y docrcrr«ntJ 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 Guanina a en a fo ro s c r e a r •<
in t in d ica d o re s * *686; I • üern ch as do le c tu r a y e o d iílc a c io n para
todos io s u s u ir ic s ‘ I
s t r u c t saBDu- Ouf;

/• Croar e l ser.aforo :on aerecnos ae lectura/nodiricacion para tocos los


usuarias •/
idant:tlcaaíir_sonafQro - aengec^[W_PRIVATg, ?otal_s0nár<ro3, inoicaoores);
íff iaontif¿caaoc_wnaforo < 0 ) {
perrorCsanget*);
exittsXIT FAlLURSi;
>
príncfCSenaroro 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 seítop •/


aur ,n u n era _ s« n afo ro s « 0 ; / ' U n s o lo 36R gíorc
í u í.c a e r a a io n x r e a l i z a r • 1; • /• in c r e a e n ta r o l s e n a ío ro ,
c a r o i t l r JCC8 S0 *7
:j*.corftg_:ndicaccr=-: - :PC NCNWn; 81aquear 3: se llega a naxu.a
/alar pe.-siticc */
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: Semáforos y cotas do mensajes 371

•xittéXIT/AlUBE);

srítw 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 ¿denüñcadores que se vea pasiblem ente resulten diferentes on s u sistem a.
5*w*ws creído: S12
--------- S— pftort v r j y j ---------------
K«y icaid e*r*r pems man* status
SALIDA (IMNNM 5*2 *urt_ « li SM t
El ejemplo utiliza IPC_PRIVAT£ p ara aseg u rarse do que ol semáforo 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 semáforo: Como sólo so croa un semáforo, sem jvjm e»
igual a cero Como el recurso im aginario no se eneunntra en u«o (en verdad,
cate sem áforo no ha «ido vinculado por *1 projproma con ningún 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 función 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 ie«i2, 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 semáforo 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 semáforos) se rá siem pre coro.
E l argum ento C"K3 acción »puede ser uno de los valores de la lista siguiente:
• GETVAL: R etorna ei ¿atado c o m e n te del semáforo (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 -
> > i ; y
372 Programación en Linux

• GETNCNT: Hace que ei valor retom ado por s s r . c t l sea el núm ero de
procesos aguardando quo el sem áforo se increm ente; es de­
cir. ei núm ero de procesos a la espera de luz verde.
• GE7ZCNT: Hace que el valor reto rn ad o por s e m c ti sen el num ero de
procesos que están aguardando p a ra que ei valor del sem á­
foro sea cero.
• GETALL: R etorna los valores corrientes de codos ios sem áforos p re­
sencié en el conjunto asociado con se ffid .
• SETALL: 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
• IPC_fiMtD: Elimina el sem áforo cuyo identificador es sem id.
• [PC_SET; Establece es modo (bits de perm iso.'en ol semáforo.
• 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 configuración y com porta­
miento. IPC_STAT copia e sta información de configuración
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 va-
riablu 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 cuál 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 peña
un uíipei vital en ln ru tin a so m e tí. Uno debo definirlo en su código fuente
do acuerdo con loa lincam ientos do la siguiente plantilla;
unton *tmin (
tr.: vaL; /* Valor pura SETYAL ‘ I
»‘.ruct ion:tl_38 *auf; /• Bufor c« !PC_srA’ •/
•inncnod tftor? ln: ‘ nr-ay; r Buffer do íETall y SGtALL •/
);
\ 11
Ü |) E je m p lo
¿fgl A >.-.tta a ltu ra el lector debería estar en condiciones do com prender la razón
mj>uo 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
próximo 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 semáforo y luejjo em plear el
ídeatiñcador del mismo como argum ento para la línea de comandos de
a iijn in a r _ s e m a f o r o .
r V30bre ddi orografía en :n:ern«i: scU .c V
r
• aiirunar_j4.raforo.c - Vanipuiar y s iu in * .- un ser.ai’oro
• S ín u x is : ei:nirar_3ar.áfíra iaantif lc.Wor ae 36iraforo
V
CaDitU’O 17: Semáforos 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 <ie«r:ifíca<ícr d« 93nafaro>*>;

>
i3»eufüador_ncafaro « *toi<ar?v(1])¡

r ü lB ir.ir «1 ií34íoro */
¿♦((«••ctKJOtntlftcatfor.Mnífor*, «. IPCJWIDII < 0) {
w r-3 P {-* ««c ti ik _*«io *);

) #i*t (
0g!«(*$«MMro «U fU M d O '):
ty»t«c{*iocs
>

**i:t6í!T_$ucc£SSi;
>
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 (cr«sr^i*»af=ro
^ U a itzro cr«» 00 -
--------- im s r ^ r e A r n y » ----------------
y i« ic «mer Mriw n9ejs status
3 i*K*ee*i 5¿« kurt_*ali i

S > ÍJirir_ < « ^ o ro W


Síssísrc elin u a flo
--------- S M U l n r t A . * r * y l ---------------

*{y Síflia W-flC 39TBS PS8BS StltUS


374 Programación en Unux

Ei código 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­


máforo cuyo identificador !e os pasado en la línea de comandos. Tam bién 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 ­
máforo ha sido efectivam ente eliminado.

Lo que viene
E ste capítulo ha completado n u estra introducción al IPC System V con un
análisis de las colas de monsajes y loa sem áforos. En el próximo capítulo,
“Program ación de TCP/LP y aockets", el lector ap ren d erá los fundam ento? de
la program ación 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 próximo capítulo, el lector
contará con la suficiente informución en su poder como para tom ar una deci­
sión fundam entada sobre cuál de loa diversos meconismos de IPC so acomo­
da mejor a tu - necesidades,
r
)
)
)
)
)
)
)
.)
)
)
)
)
)
)
)
)

I m i mi - u m m U n M - " * ................................................................... ............... ..................»


Programación de
TCP/IP y Sockets
A m edida que la In tern et desem peña un papel cada voz m ás centra; en la 30-
d e d a d y especialm ente en el m undo de la inform ática, casi toda aplicación
no trivial necesita incluir algún tipo de prestación básica p a ra el trabajo en
redes.
E ste capitulo cubre los siguientes u*maa:
• Introducción a los conceptos y a la terminología de las rcde3 de compu­
tación
• La API Berkeley p ara socketa
• Operaciones básica* con socketa
• Sockets p a ra UNIX
• Conceptos básicos sobre program ación de TCP/IP
• N ombres y núm 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 Programación on Linux

Conceptos y terminología de redes


Para la mayoría de la gente, las redes parecen funcionar como teléfonos. C uan­
do uno efectúa una Uamada telefónica, 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 línea en el mismo orden en
que se las expresó y, simplificando un poco, nadie m ás puede escuchar su con-
versación o incorporarse a la misma a m itad d e 3U desarrollo L*n teléfono, en­
tonces. provee la recepción 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 tránsito. De m ane­
ra Tinular, cuando uno hace clic en un hipervlnctdo de una página Web, el m is­
mo lo remito casi inm ediatam ente a la corraipondiente página vinculada. No
hay paradas intermedias; la página no resulta corrompida o interrum pida.
En realidad, 3iii em burro, las redc3 de com putación no funcionan de manor»
tan impficable y eficiente. A diferencia de los sistem as telefónicos, que pro-
voen un circuito directo en tre dos ubicacionos, laa redes de computación tr a ­
bajan siguiendo un esquem a de alm acenam iento y posterior rem isión, deno­
m inado en la jerg a inform ática conm utación de paquotej.. Quien origina el
rcensajo onvia Ion datos en forma do bloquea de tam año fijo, denominado»
paquetes, al interm ediario m ás cercano, denom inado enrutador. El enrutw-
dor 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 línea, donde se vuel­
ve a rep etir el proceso de dedaión e n tre alm acenam iento o ulterior remisión
La figura 18-1 ilu stra la m anera en que tra b a ja la conm utación de paquetes
P a c M f-S w iíf-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 conmutación
de paquetes.
La figura 18-1 re sa lta la m anera en que viajan los datos a través de las re­
des de conm utación de paquetes (m ostradas en la p arte superior de la figu­
ra; y aquella en que lo hacen por las rodos de conm utación 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: Programación de TCP/IP y Sockets 379

puede ap reciar en ia figura, en u n a red de conmutación de paquetes, los en-


rutad 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 líneas oblicuas con flechas en ambos extremos que conectan
el Üujo de dato3 a través 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 conmutación de circuitos
croa u n a conexión directa en tre m i_ re d . con y s u _ re d - n e t.
Aunque pueda haber puntos de conexión entre ambas redes, como esta indica­
do por loa pequeños cuadros de la figur;i. las mismas se comportan más como
cruces de vías férreas que como intersecciones de tránsito automotor. Los da­
to? ol tren que circula por la -.ia íúrreaj pasa por los puntos de conexión sin
interrupción rumbo a su desuno. En una red de conmutación de paquetes, en
cambió, t i l « m o on !a Internet, le» datos deben pasar por v an as ¡otorsoccio-
oes •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 automóvil a través 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 operación, la.» redos de conmutación de puquetes
tienen o tras limitaciones. Primero, algunos de los paquotos se pierden. S e­
gundo. los mensajos largo* son desglosados «n múltiples 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 conmutación 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 isión 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'MíS de lai
reces as iQ.Tixl3c.«y E> s¡s m nana cortiíflérAOlci'V-nte *ooresimplirlcado psique
'a cea es pro.ee» a¡ 'ector a sutoenie información con» para colocar la programación
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
•ecn¿ra ce tos rrórno».
De manera sírm'ar, un z¿&vj<¡ ;w>de rozsr o superice ce la programación oa-
ra reces. £4 :3 constituye •jr- tena avnoJe^j que recuero demos ce aáginas 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 cómo deberán ser transm itidos los datos a
través de red. Se dice que un protocolo as ementado a conexión si tiene
des extrem os deám dos, s; los demás usuarios no pueden irrum pir en la co­
nexión y si debe existir una conexión pre-via entre los dos extremos p ara que
tenga lu g ar la comunicación Un protocolo que carece de estas caracteristi-
cas es considerado sin conexión.
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 1/ 1 t h ) ) ) ) ) ) >J
380 Programación en Linux

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, sólo 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 isión
más eficiente, pero los mismos están secuenciatlns, ¡o que significa que arrib a­
rán en el mismo orden en que son enviados. Los protocolos de secuencias de da­
tos son conocidos tam bién 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 términos en mente, resu lta relativam ente simpte clasificar !u mayo­
ría do los protocolos de red. incluyendo TCP/IP, el protocolo básico do Internet,
y el IPC local 'conocido anteriorm ente como sockets de UNIX), en una de do3
categorías. Los prutocolw de dataginm a, tales como el U D P (L W Datagram
Protocd), e3t<in basado» en paquetus, que son sm conexjón, r.o sccuenciados. y
no ofrecen control de errores. Los protocolos de secuencia de ccmrtcrvr,. por ol
con truno, están orientados a bytes y ofrecen tanto secucnciamiento de datos
corno control do errores. TCP {Transmissiort Control Ptvtocol). constituyo un
ojemplo clásico 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 programación 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 razón 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 programación p a ra uso de los program adores de red
E3ta generalidad de uso introdujo complejidad adicional, pero esta compleji­
dad es un pequeño 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
capítulo utiliza los sockets B erkeley p a ra p rogram ar tanto en POSIX local
IPC, que opera 3Ólo en una com putadora aislada, y TCP/IP. que perm ite co­
m unicarse e n tre si a m uchas com putadoras a través 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 (dirección de sockel), que alm acena u n a dirección 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 {
) > I ) ) ) I ) ) ) ) ) I ) ). ) ) ) ) J
Capítulo 1S: Programación de TCP/IP y Sockets 3S1

unsiyeti sñort i r t sa_faBüy;


ciar sa_3ata£i4i;
>;
sa__f a a i i y describe el tipo de dirección alm acenada Csa = stored address),
m ientras que sz_ 3 a ~ a contiene la dirección concreta. s a _f 3m ¿lv es típica­
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
direcciones Protocolos Descripción
AFJJNXX PFJJNIX Socxets de entorne UNIX
Ar_IMET ?F_INET TCP/IP (V\arai6n 4)
AF_AX25 P=_AX25 Protocolo AX 25 para -gdíosneionodos
Ar_I?X PF_IPX Protocolo Novall IPX
af _ appletalk PF_APPi.ETALK Protocolo Aotfe’aik DOS
Les dos protocolos que an alizará e ste capítulo 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 protocolo» y do direcciones atírtiUdos m r»aHa en < 3 y o •
. '5 0 C k e t . h > .

| Fundamentos de los sockets


Las operaciones básicas con socketa abarcan la creación, ap ertu ra, cierre, lec­
tu ra y « e n tu r a de loa miamos. G racias al reconfortante hábito 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 nórmale».
✓ P»a encontrar . r. fcréve aréíisia 4e -a to rra er cuc trato Unu* ios archivo*, ver *Car«cte-
rístíeas 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 idéntica l\)d as las funciones de sockets req u ie­
ren incluir en el código 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 operación especifica p a ra sockets es ia función 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 Lo menos dos sockets utilizados p a ra es­
tablecer u n can al de comunicación entre dos procesos o sistem as que deseen
intercam biar datos.
382 Programación 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 categoría 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
comunicación 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 propósitos 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 capítulo sólo so com entará el socket SOCK_STREAM,
Tabin 1 8 .2 . Tipos de Socket Berkeley._______________________________________
U p o de aoekat Descripción___________________________________________________
SOCK_STflEAM Acepta secuencias de caracteres (strooms) orientodoo o conexión,
secuencladoa. con control Jo errores y fulí dupíox.
SOCK_CGHAM Acepta mensajes sin conexión, sin orden secuencia!, orientados a
paquete» no datos de tamnrto fijo.
SOCK_$£OPACKET Acepta transmisiones do paquetes secuonclados, fuit dupiox y on«n
tados n conexión, 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 Díijo nivel a nivel do protocolo.
ti código doóo sor redactado de modo de procesar los dalos según
seno las especificaciones del protocolo. No se recomienda a los que
sufran dot corazón . . .
$OCK_ROM Acepta la transmisión de paquotas orientada a cor.ox.6n, pero no se
garantida quo los dntos serán recibidos en el ordon debido.
Si el socket es creado exitosam ente, S o c k e t reto m a u n descriptor de arch i­
vo válido 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 contraposición a los procesos root) no cuentan con p er­
miso p ara c rear un socket de las características 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.
Capítulo 1$. Programación 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 inútil sin a b n r conexio­
nes h a c a el mismo. Además, el proceso de conexión 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 información, da toe. u otorgan a quien
lo b a pedido algún tipo de acceso h a d a algún 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 conexión por parte de Ion clientes o
solicitantes. Los procesos diente», análogamente, requieren del servidor que
les provea información o datos vía el socket. o envían un pedido, de nuevo a
trav és del socket. de acceso a algún servicio que provee ol servidor.
U n servidor, entonces, tiene máa trabajo que realizar que un diento. Pnme*
ro. habiendo creado un socket, debe ligarse al mismo, lo cual crea una aso­
ciación e n tre el socket y una dirección. En el caso de los sockets do entorno
UNIX, e sta direcdón consiste sim plem ente de una ruta de acceso y un a r­
chivo (tal como se detalla en la próxima sección) En el caso de un socket
norm al TCP/IP, la direcdón es una dirección estándar de Internet (comenta­
d a en el título "Programación de TCP/IP". más adelante en este capítulo).
D espués de h ab er ligado la condición, un servidor debe permanecer a la es*
cucha de una conexión, lo que significa que debe aguardar hasta que un
d ie n te solicite una conexión a ese socket. Despuea de redbir el pedido de co­
nexión. el servidor habitualm entc acepta la misma; es decir, abro formal­
m ente la conexión p ara el d ie n te que lo ha solicitado y comienza a intercam ­
b iar información con el m ^ m n a través 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 conexión 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 conexión ol socket
en el cual se encuentra interesado. La ¿g u ra 15*2 ilustra el proceso de crea-
d o n y conexión 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 ningún re­
querim iento de que el servidor deba aceptar el pedido de conexión de un
d ien te.
Programación 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 categoría 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
comunicación 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 propósitos 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 capítulo aólo se com entará el sockct SOCK_STREAM
Tabla 18.2. Tipos de Sockct Berkeley.__________________
Tipo de sockot Descripción____________________________________________
SOCK_STAEAM Acepta secuencias tío caracteres {strsnms} or-eniodas a conexión,
wcuenclatías, coa control do orroros y fuii dúplex.
SOCKJXJflAM Acoplo mensajes $in conexión, sin orden aecuonclal, onontados a
poquotos de datos do tamaño Ajo.
SOCK_SEQPACK£T Acepta transmisiones de paquetea secuenciados, full duoto* y onen
tacos a conexión, 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 código dé be ser redactado de modo du procesar los datos según
sean na especificaciones riel protocolo. No se recomienda o ios que
sufran del cora/ón . . .
S0C<_RDW Acepta :a transmisión do paquetes orientada a conexión, pero no so
garantiza que los datos serán recibidos un el orden debido.
Si el socket es creado exitosam ente, s o c k e t retorna un descriptor de archi­
vo válido 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 contraposición a los procesos root) no cuentan con per­
miso pora crear un sockct de las características 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.
Capítulo 18: Programación 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 inútil 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 información, datos, u otorgan a quien
lo ha pedido algún tipo de acceso h a c a algún recurso o facilidad Do m anera
correspondiente, loa procesos de servidor, gene raímente, crean un socket y
luego ag uard an la llegada do pedido# de conexión por parte de los d ien tes o
solicitante*. Loa procesos clientes. análogamente, requieren del servidor que
les provea información o datos vía al socket, o envían un pedido, do nuevo a
través del socket, de acceso a algún servicio quo provee el servidor.
Un servidor, entonces, heno más trabajo que realizar que un cliente. Prime­
ro. habiendo creado un socket. debe ligarse al mismo, ¡o cual crea una aso­
ciación entre el socket y una dirección. En e! caso de loa sockets de entorno
UNIX, esta dirección consiste simplemente de una ruta de acceso y un ar­
chivo (tal como se detallo en la próxima sección). En el caso de un socket
normal TCP/IP, la dirección es una dirección estándar de Internet (comenta­
da en el título ‘Programación de TCP/IP*. más adelante en este capitulo).
Después de haber ligado la condición, un servidor debe permanecer a ¡a es­
cucha de una conexión, lo que significa que debe aguardar hasta quo un
chente solicite una conexión a ese socket. Después de recibir el pedido de co­
nexión, el servidor habitualmenie acepta la misma; es decir, abre formal­
mente la conexión para el dienta que lo ha solicitado y comienza a intercam­
biar información con el mismo a través 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 conexión 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 conexión al socket
en el cual se encuentra interesado. La figura 18-2 ilustra ei proceso de crea­
ción y conexión 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 ningún re­
querim iento de que el servidor deba aceptar el pedido de conexión de un
cliente.
V ,, M M ,• > v / V \l }S >\ f - >' >' > > > > } 1 ' ' '

384 Programación en Linux

CU=N7 $E*VEW

r— ícci« : i) -

^ correcto j woac

ttooni) j

J a-xecM

ACnve jCCKfT

F ig u ra 18.2. Un cliente y un .servidor conectándose a un socket


Las cuatro llam adas necesarias p ara o stib lo cer una conexión 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, i n t « d d r lo n j;
irn U )t« n ( tn t socKfs, ínt a a cfclo Q );
: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 * a d d rl« n } ¡
t n t CO fln«ct(U»? í c c x í a , a t r e u t a o c k a fld r * a a d r. u i t a c a r le n j ;

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 dirección do socket
a d d r l e n es el tam año de s o c k a d d r {adviértase 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 máximo número 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 conexión adicionales. H istóricam 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 .
) ) ) ) J V I i ) ) }' " 1 )

C3c"íu>0 í $ : Programación de TCP./IP y Sockets 385

NO TA
3- : a - a á?i ^ S i x sara sccfcets admita a¡Jira 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 evolución. 1.3 Mtpfementación
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 «¡*c»f¡caci ir- carecen se^ 3fi>o envoltorios do las a rd u a s
3.-3G3S ./roer'Jífl'ocss cor :a eseectfleaódn 'clasica* cr^PCSiX. »ero aún, as sagi­
nas de -a n se encuertrar »'0 S 3 n e n t.» desaecua^adas.
-2 rsíersrca oe prcgr*naoón rf$5 s o ro -K J j í i .a esDecficaoór. IPC ce oqsix laconscn,-
ye a seré 3e ftcfwB S-*e\»ns Veíw/fr Prcffscvnr^. S el lector vatara Ce uíilirar e °C de
^ C S X OcOoré teo®*- en ros-ta --■= el rr»srro tal vez oo se comeorta como uno 'o escervwla.

Sockets de entorno UN IX
Les sockets de entorno ITNTX o p eran sólo 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 dirección de red. Eso en realid ad fue una sobregeneralización. 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 voreión de sockaddr específica 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_i¿e¡ {
us»lSn*fl m or» ! A t lu f i.f a a iiy : /• AFJJNtX •/
cna r w.n M tn ( tC 8 1 ; /• ?atn«iau« •/
1;
P a ra c re a r un socket de entorno L'NÍX. 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 esperaría, pero el archivo es creado recién 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 dirección ¿spe rada en uso) y reto m a - * al proceso que
efectuó la llam ada. El macro SUN_LEN\ tam bién definido en < s y s /u n .h>,
re to m a el tam año 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 ua-
c ó n ilu straran el método correcto conque se puede abrir un socket do servidor
y un program a d ie n te puede conectarse al mismo. Preste especial atención,
sin embargo, a cómo 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
patrón de estru ctu ra sockaddr genérico p ara cada llam ada que se efectúa a !a
interfaz de la corresa>ndiente APL
Programación en Linux

E je m p lo s
Los siguientes program as de dem ostración. 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 básicas cor sockets de entorno UNIX.
f JÍMPLO
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 */
/•
• ?r*ar_sock«t.c - Crear y lig a r .in jo c M t. Sintaxis; croar socket nOTfir» ae
¡ac<«t
•I
•Incita* <syj/»cck«f f>
*includ« <*ys/un.n»
• Lnclud* <stdliC.n>
•inelude <3tdio..'»>
•inelud* ‘ noipor.n*

int M in (U U arge, Cíur •argvU)


i
lnt attcriotor_5ock#:;
s t r v e t »C K a d a r _ u n a:ruc_sorvldor; /• Estructura d « soexot «n « i s e r v id o r •/

s o c k l«n _ t t i n u i t o j j t r a c c ió n ;

/• 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 sockít •/
if((aescripzor_socKe: = sccaetlPF.'JNIX, SOCX_STAE¿W. &|) < 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, slíeof(StruC_s«rvidor.si)njiatn)J;

/• Ligar e l socket a una Sírece ion ’ /


l*:(Difld(descriptor_socket, (stn jct 3ockaodr •¡Ssrruc servidor,
SÜH_L£N(istruc_l®rvídor|)) < 0)
arr_5ui~rbl^d‘ >;
Caclt-jio 18: Programación 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? *Soc»e: 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 3oc«accr *;&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
dirección 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 .
Obsérvese 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­
trón 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 operación d e casting un patrón 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 señala 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
condición 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 entadón, 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 código 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 función 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 definición rfe
e r r _ a u i t es la siguiente:
voií *rr_3vi:(chsr «asa)
{
w » »i I K y , ; .1 ) t ) ) . > ) * ) t i /
3S^ . ro&.omo^ion en u n u x

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
• 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 itooúre j ?
archivo

¿-.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 a«scrlptar_íoc<(4t;
irru c t íockad(Jr_un 5truc.cU*itto: /• Estructura co socket a» proceso cliente

wcxLen_t ta-iartojliríccion; /• tnitarto aol nioit&ro nockasdr C# estructura


Jtruc_clt#nre •/

r So aguarda cono argunonto tío 14 lin o * do conancos o l nonbre Col socket •/


if(a rg c I- 2 ) (

putiCWCCO 5E EMPLEO; conectar jio c u o t «JOJWre de xrcnivo>"},


•xlt{£X:T_FAllu«£):

!• 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{strüc_cuante.3(in_path, a r g v [i), s ueof(strüc_clie nto .sun j>a tn));


i ) } ) ) ) ) ) ) ) ) ) y ) ) ) v *
Capítulo 13: Programación do TC P /IP y Sockets 389

• C o o e c t á r n ioc'«»t *
zsaañojiirecciQf'. * SUK_l9(Kstnjc_ci¿en-: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 0CIT_3OCC£SS);

La configuración ¿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 también pueden utilizar p ara ligar la dirección 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 dirección 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
línea 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 conectándose 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 cu-
da u n a de las tres xterm s m ás pequeñas de la derecha. c r e a r _ s o c k e t
informa sobre cada conexión exhibiendo su leyenda de nueva conexión h a b i­
litada cada vez que acepta u n a n u ev a conexión. 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 dirección (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 Programación en Unux

program as de demostración. 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 a¡r«ady 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 aceptación 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 capítulo, p ara leer y escribir en soc-
kets uno puede u tilizar llam adas a sistem a e stán 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
£¡f 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 leídos
df-.‘xle el socket a su en tra d a estándar. 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 código resulte algo m ás simple y sencillo de seguir, he L p e r. c define-
una función, 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 definición de xferjJata es la siguiente:
voia <fer_3ataiint srcfd, :nt tgtíd)
i
:nar sur[102*1;
int COnt, ien;

r L3ér 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 •/


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 > ej (
¿■'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 = «riteítgtfs, au*, crt)) r* :nt)
err_quitf, h6lper.c:xfer_aata:wrvt«’);
>
Capsulo 13' Programación de TC P /IP y Sockets 391

E s ta fun ción 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 función
r e to m a . P a ra u tiliz a r e s ta fu n ción , a ñ a d a la lín e a S i n c l u d e ' h e L p e r .h ’
ai código 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 eclaración 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 lín 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* * accíptKJíJcrlotor^icc**:, <itruer iccuntidr ')j,»truc-
w rvidor.
4:wirtC_5irKCi«rJ j >• ai
CJfci’U (Xma conaxian r* atdo n je iiit ia a * !;

* u « r « « i » «1 ircMvo « tntraáí 3* u t o » y tscríb ir 4 itaout •/


xfe-_3I*a(0«tcrict0rArcni«o04t0J, 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 oxión q u e Ih se »
req u erid a , e! n u evo código a cep ta sólo ia p n m e r con exión , 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 cód 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 s®c*9t •/
tfa r _ 3 * ta (fi!w o (jtiifl). d»sc-ipTor_jack«ti.
£.-.t* cód 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 lín eas
d e tex to in g resa d a s ap arecerán 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 ostración 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.


) } ) ) - . ) ) j ) ) y > > > } J ]
3^2 Programación 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.

Programación 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­
sión actual de este protocolo es !a 4 ÍIPv4), pero ya h a comenzado la tra n si­
ción a ia versión 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 versión
2.2.a. Dado que el nuevo protocolo no está aún muy extendido, sin embargo,
e sta sección cubre cu su lugar IPv4. Como 30 destacó al comienzo de este ca­
pitulo, la program ación 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 programación 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 más significativo do tos números multibyte en la dirección de
memoria más baja. Muchos computadoras aon también 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 núm eros mul­
tibyte el quo se almacena en la dirección de memoria m ás baja es el byto me­
nos significativo (el térm ino general p ara indicar la disposición do valorea en
memoria es orden íAt bytes). La implicancia de esto es que cuando so ingresan
valorea numéricos 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 entación 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: ntonlíunsicnod 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 short in t
desde el orden de bytes del sistem a al orden de bytes de la red.
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: Programación 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 patrón 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 definición com pleta de un socket so debe tam bién incluir


< s y s / s o c k e t.h > .
3a-a TCP/I? { w rjlec i. ocr io « e o s ), sin_4anily d»b9 3er af.IKét.
* 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 dirección 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 notación e stá n d ar decimal con puntos 3e de­
be em plear la función í n e t _ n ? o a ; reciprocam ente, p ara convertir u n a d i­
rección er. forma decim al con puntos al formato binario de S in _ a d d r se de­
berá u tilizar la función i n e t a t o n . Amba3 funcionen están 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
dirección 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.

PRECAUCIÓN
van*» faraones API o « TCP/JP retoman cero sj fracasan y un valor distinto da ccro si
teñen éx^zc Este comportamiento es precisamente opuesto al conocetamie«to oe to­
das as funeones dé Ote; oteca / cc sistema que se frayan visto hasta añora.

CONSEJO
£ Jector se --CC2.-3 ocas-onaimente con una función denominada m e t _ a d c r . Dicha
funoón 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 'unción obsoleta porque no recoroce
215.253255.255 como oreoaán i? vütda. SJ llegase a ancóntrar coa ¿o q u e utiliza di­
c ta fundón, "sga;* un favor s mundo y reerr-piáceia por ln e t_a to n

Las direcciones de red em pleadas con TCP/IP son núm eros de 32 bits, gene­
ralm en te expresados en notación decim al con puntos, como por ejemplo
Programación on Unux

w w w .xxx.yyy . z z z . Como se tra ta de núm eros de 32 bits, existen potencial-


m ente 4.294,967,295 (contando desde 0) direcciones de red diferentes Sin
embargo, como cada dirección específica puede q u erer o necesitar correr
m últiples aplicaciones TCP/IP sim uliáneaw ento. cada dirección tien e tam ­
bién h asta 65,535 puertos a los cuales conectarse.
Los puertos son núm eros de 16 bits que rep resen tan una conexión 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 conexión en un sistem a e3tó definido por la combinación de la diruc*
c.ón IP del .servidor y un núm ero do puerto lín u conexión de red completa y
específica entro dos sistem as e stá dolinidu por dos punto» de conexión de d i­
cha» características. La figura 18*5 ilustra gráficam ente lu cuestión.

Mosn wosra

F ig u ra 13.5. Una conexión completo de red queda definida p o r dos direccio­


nes IP y dos núm 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:PÜERT02 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 ostración, el lector debe conocer
una ultim a función, s e í s o c k o p t (establecer opciones de socket). D espués de
cerra r un socket. su dirección (la combinación do IP y de núm ero de puerto}
no queda disponible d u ran te un cierto período de tiempo. P a ra re u tiliz ar e s­
ta dirección, uno debe establecer una opción 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 opción 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: Programación 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 función


s e t s o c k o p t debería 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 continuación. 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 número 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** » un «ocket TCf/I> y Lu«go qu#(J»r i la i d#


c o n tiU A ti
•/
• w i u c i < iy i:* e t u :.n »
<a«ttr«t/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 ; . • E s t r y c r . r j 3» soc««t «1*1 s o r / ic a r •'
» o c k l*o _ t :»aa/io_a;r*ccio < *: * ;sa 4 i*3 a e i n;w »ero s c o a a o r ae estru ctu ra
*Trwc_$»n»i03r 'I

w t j * t ¡ (• s » r j s e is o c k o p r •/

/ • 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 . SCCX_STB£MI, 0)1 < 0¡

»T r_qU Ít(*SO C k«t*);

!• 3 * 3 « S 1 r « í ; i i l i z i r i» ■iirtcC'.Qr l o c a l •/
S8t5OCW0T(<ÍMCrÍBTOr_SOCJl«t. 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 ’ /• no o l v ic a r s i o raen : s e y tss
z* l a r « ' * j

l
) ) ) ) ) ■ ■ > . 1 ) ) ) 1 > ) > > ) ) > > >
396 Programación en Linux

r 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 iraccío 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 dviértase
que corno c r e a r _ t c p i p especifica una dirección IP do cero, el kem el asigna
u n a dirección predeterm inada. La salid a do u n a corrida de dem ostración 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 próximo 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 Ca.néctarid a un socket TCP/IP, Sintaxis: ccnactar tcpip
dirección IP'
*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 *
> ) > ) ) ) ) ) ) ) ) > ) ) ) > ) ) ) ) )

Capítulo 18: Programación de TC P /IP y Sockets 397

¿_“ aair-Cint irse , «car *argv[l)


(
ifl* 30ícr;: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 ¿9 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 «<n«t */
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_vli«nt*. i . J i:* c ílíC 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_íit»nt*.?in_ocrt « v.ontijw oe;: /• no olvidar *1 «rd*r üo los
5yt«» M !* '«•3 */
lí< l ( lntt_lton|«r^»l 1 ] , ljtruC_cLi«n?í. J í n j i d d r ) ) ) / • Esto n a r j terninar el
C ^ í ' i n i 11 1 ¡
d irección ip «1 invalida •/
ft*r r_ « u it f • *>;

C o n e c ta ría 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 sacfcatídr * )& itru c _ c li< sn ta ,
t SJU>; _ ; i r í c c • on) J
«rr^w ltC cor-féC'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_acc£SS):
>
Además del código 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 bién incluya u n a nueva función, 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 fímción de manejo de errores especifica de
TCP/IP, n e g r o r . £ ¿ ta se comporta exactam ente igual que la función 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 dirección IP, en form a decim al con puntos, del servidor al
1 ) ) ) J ) > > ) ;> I

398 Programación 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 continuación (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 ¡ * ./cr« a r_ tcp lp
3 c c m rc p /ip d isp o n ib le
'• T y f. Puerto 5Z«<io
--------- O ireccion IP í.9.8.3
salida w nu#v4 coo«x¿on na sido naoiiitaaa
$ ./conoctar_rcpto o
Client» conectado a socxet
U na vez más. tran sferirle 0 a c 0 n e c t a r _ t c p i p en su línea de comandos le
indica al kernel que utilice pora ol socket u n a dirección de su elección En
lugar do 0. uno puede tam bién tran sferirle 0.0.0.0 o la dirección Í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 corría 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. Conectándose 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 soc-
kets ce entorno UNIX. Una vez más, la concepción de Linux de tra ta r a todo dis­
positivo como un archivo resulta se r una bendición- 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
*/
Capítulo 18: Programación 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 : ft«j.i|voxai

<
tnt í w c ' i p « f . » o r t « , :«5crt:toi*Ar<niva04:o8; /• c « c r i a t c re» a« ípp.Hivo
« lo s •/ ~
it r u c H m d o r , i* £ jtru c tu ra t»
ío c ««! <S*1 » « r v iíc r “ v
»oc*l*n..t t»M<,'o_air*cclOft; f" TjnaOo d*
*tn*c.»«rvtdor •/

;• C r t ir 3#i socm: V

i?(<e**c/-:otcr_i©ch«t • i«c*«t{?f_rxrr, scck_st«€aii. » ij < *)

t r r jQ u lt(*M C fc « t*);
• I n t c u liii' 1 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


:i»a¿o_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 ) ) ;
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< 2d r ) ) ;

' Aceptar la s r ir e - s c&'-exíoi*. sue a r r ib e •/


ifU se sc -ip tc rA .-c .'in o C U tss = acc«ptld«scri.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 ;
; ; ) > ) ) 1 i ) J ) ) ) ) ) ) J .> )
Programación 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 tíljd 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 do«rlpcor_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; /• Tanate d® ítn :c _c !i«n to 'I
r 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 < tíiro 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 = sock«t(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 3¡5dr)>) /* 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 ;
* J J ) ) ) ) j ) ; j ) ) ) > ) ) ) j ) )

Caoítulo 1S: Programación de TC P /IP y Sockets 401

* Cof«tir$« t i MC«« •'


t3aa5c_íl¿.-»cciGfl = sirtof!3truc_cl± 9fiT 9!;
lílccríw ctw tscfU Jto r^ ao ciM t, ( s t.- j c t so<<jc<:r *)4$íruc_c¿ient«,

•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 r¡tons(struc_cii*fl?*.*ifl_p 0 r t ) );
s r i - r r ¡ ' .tO i.-s-:cicr Hs\n*. in«t_r¡toa{stnic_ciieflte.sin_a(¡< lr)> ;
/• Cosías- ítíir. ai w u t •/
i?er_c*ta(fUeí>c(5tair.). dMCriStor^focket);
**ití>xrr_síxcs3s):
>
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 asignación dei número d« puerto. A
# r n e z . c « le agregó código a d id o a a i que copia la direodón 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 idéntica
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 exposidón se h a concentrado en la utilización 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 información de te x ­
to. No ocurre lo nnsm o con los ¿eres hum anos, que prefieren las cad en as de
J t ) ) J ) >

402 P ro g ra m a c ió n e n U nux

texto a las secuencias dé dígitos. 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 cómo convertir
un hostnam c - nom bre de servidor) a unú dirección 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¡ /* NonOro canonico «í«*L servidor •/

char " p a lia s e s ; /• Lista do ¡illas */


:n ; iw ddrtype; r A f jN e r v
in : iMflngth; i* sizeof(struct ln_addr) •/
cnar ••n_a<ldr_Ust; !• 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 con-
tiono la información relevante que corroaponda al respectivo DNS.
De m anera análoga, g e th O S tb y a d d r acepta una estru ctu ra de patrón
s t r u c t í n . a d d r correspondiente u una dirección d<- red, (la cual ya sí? ha
visto), alm acenada en a d d r, su tam año, 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
estáticam 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­
ción presente en la e stru c tu ra h o s t e n t , alm acénala en variables locales.
Con respecto a la propia estru c tu ra h o s t e n t :
n_name es el nombre canónico, 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 año do la estru ctu ra que corresponde a !a dirección, 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 de-
m ú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: Programación de TCP/IP y Sockets 403

dirección 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 múltiple nom bres 'estrictam ente hablando, tie­
ne un sólo nombre canónico y uno o m ás alias) so utiliza típicamente p ara per-
mita- que u n a sola computadora ñsica 3c a capa¿ do proveer múltiples sen-i­
dos, tai es como comportarse al mismo tiem po como servidor de Web y servidor
de FTP. Dicha computadora tiene una sola direcdón IP poro dos nombres.
Independientem ente de la razón 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 tír
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 patrón h o s t e n t.
Si U direcdón IP o el h o s tn a r m t que ae le transfirieron a dichas funciones re ­
su ltan ser inválidos o s: ocurre algún otro tipo de error, ambos funcionen re ­
tom an NUIL.

E je m p lo
El «iguiente program a de demontrución, h o s t _ : n f O. ucopt.i un ¿orinante
como argum ento en su línea de comandos y exhibo ol contenido do lu corres­
pondiente estru ctu ra de patrón n o s t e n t .
/ • n o ce?» C*1 a r o $ r * 3 i «n Xftt«TA*t: ft c it l r t f o .c •/ »
/•
* *5$t.info.c - vuestra #i centtoiao 3« .* «itructur* 4* pitron hoottnt par»
• iír 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 <n»’C8 h>
UrtCluCi <«3113.ft»
♦ incluí* <s:aio.h>
nneluoe Tií¡o e r v

iu t M infint ir-gc. c~tr 'a r^ rd :


{
srrjc t ^asrsot 'z/st-
struct la jo a r -*ccnt«rc8*cúO¿r#eciOrta-srP;
snor '•>jnttroHaciaAlias.
in t cantsoar - i
• S í 2C-.3.'*; cese arsu tu ato :e 14 i ir é 4 s* ee»ntí63 la airscoi& n IP • I
I f íé r - c :•» 2) {
FJT s: ’ MOOO :z a P L rO : r.cst_ iafe <nonc*4 ce :=rv;cor»*>;
= x i: E X IT/A IU R E :
i
P ro g ra m a c ió n on Linux

/• Recopilar ios datas ’/


if[¡tju -í -* gotKostbynanoíargvH])) =» NULL)
hsrr_ou ií{ ’ gsíftostoyna-W) ;

/* £1 roatjre 3 2 ! servidor <t$ valido, asi oue proseguir •/


p r i r t f í * tn/oroacion 2 fl servidor para is'.n’ . a r g v [ 1 I |¡
pr¿níf(*.Voflbre canónico: %s\n', ouf->>i nane|; /• N o w e S3nor:co ael
sarvtflor '!

OPÍittff ‘ A l i a s : * ) ; r Tcdos loa a l i a s dol 39rvi<j®r •/


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', ' punt»roHac;UAlia5>;


contador •*
MnteroHaciaAüss

)
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) r 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 diraccian»s IP almacorufliis <in ol servidor •/


putsj•Diroccionet D r » s a n t « » :');
ounteroHaciaQl'•«ccior.tti í p - (stru ct *r._addr ••)buf-»ft_addr_li3t;
■niia|*(Xint«roWac:aDl'-ac:lon.‘sI? ) (
p rin tf ( ’ >:%s\n‘ , in«t_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 canónico: 'tp.rídh 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

LC«cit'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 código 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 programación de soc­
kets y de TCP/IP Completa asim ism o la cobertura que efectúa este libro de
las comunicaciones inu-rprocosos. L a próxima 3ección, U tilid ad e s de Progra-
mac’.'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 código*) fuente: el sistem a de control de
revisiones*, que !*.• ensenara cómo u tilizar RCS. el Sistom a de control de revi­
siones. RCS es una h erram ienta que autom atiza la mayoría do las tareas aso­
ciadas con ei seguimiento do las modificaciones realizadas a los códigos fuente
de los program as. 0Para qué '-o debe* efectuar el seguimiento do Ins modifica­
ciones do los códigos fuente de los program as? ¡Continuó leyendo y lo vorál
) j ■ .i ) » ; / j f i i t >
Parte V

Utilidades de programación 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
> ) ) ) ) ’/ ' > ) > . ) ■ 1 ) ) ) ) ) ) ) ) ) )
( 1 S
Seguimientos de cambios en e
código fuente: El RCS o Sisteiru
de Control de Revisiones
El control de versión es u n proceso que p erm ite m an ten er el seguim iento de
los archivos do código fúento y llevar en un registro adecuado las modifica­
ciones que se les van haciendo ¿P ara quó m olestarse on hacer eso1!* Porque
algún día uno realizará esa edición fata l a un archivo de código fuente, eli­
m in ará au anseceaor y o lv id ará cualas fuoron exactam onte las líneas do ¿ódi
go que pretendió modificar. Porque ten e r que efectuar m anualm ente ol ae-
guim icnto do la versión c o m e n te de u n program a, de la próxim a versión 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 frenética­
m ente la copia de seguridad e n cu ita después de quo alguno de su s cologas
sobrescribió por q u in ta voz un archivo do código fuente puede hacerlo come­
te r u n disp arate. Porquo. a lg ú n día. m ien tras tom a ol café de la tnaúanu, so
en co n traré diciéndose a sí mismo: “Control do versiones, e sa es la Cosa Co
rrecta que Hay que H acer- .
E ste capítulo analiza el m étodo RCS, «jI Revisión Control System , u n a solu­
ción h ab itu al al problema del control de versiones. RCS es u n a solución 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 Versión System , tam bién 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:
• Terminología relativa al control de versiones
• Creación de un depósito de reposición de código fuente
• Verificación 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
• Modificación 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 núm ero de ISBN 0789722151.
Programación on Linux

¿Por qué razón 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,
podrían 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 programación?" Prim ero, considera que
RCS es la introducción m ás sencilla a los conceptos sobre el control de ver­
siones. Pocos program adores principiantes han oído 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 configuración
inicial y dispone de un conjunto de com andos pequeño. Esto lo convierte en
el vehículo ideal p ara introducir al recién llegado a la program ación 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 transición de
RCS a CVS ?e puede efectuar de num era sencilla.
Además. 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 neófitos con Linux. Pocos aprendices do
h acker necesitarán, por ejemplo, contar con la posibilidad de navegar su
propio código fuente utilizando para olio un navegador de Web o de lograr
acceso jnónim o do lectura/escritura al depósito de reposición de software.
Finalmente, la mayoría du -os programadores principiantes no trabajarán en am ­
bientes en loa cuales se estén desarrollando varios proyectos al mismo tiempo o
que dispongan de un único repositorio de código fuente que almacene el código de
varios proyectos simultáneos, ambientes para los cuales fue diseñado CVS.

Terminología del control de versiones


A ntes de seguir adelante, sin embargo, la tab la 19.1 lista unos pocos térm i­
nos que serán 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. Términos am píeseos en el control de versiones._________________
T érm ino_________ D escripción___________________________________________________
Archivo RCS 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 específico. Normalmente, un archi­
vo RCS tiene una extensión .v (coma. v}.
Arcnivo as trabajo Uno o mas archivos recuoeracos tíosco e ■repositorio ce código 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 más
pueda editarlo simultáneamente. Un archivo en uso es aloqueaoo
por ei primer usuario contra posible» ediciones cue puedan llevar a
cabo otros usuarios.
Revisión Ura versión 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 número de revisión específico.
Capítulo 19: Seguimientos de cambios en e¡ có<Jigo fuente 411

Ei R easian C ontrol Sysism o Sistema de Control de Revisión adm inistra múlti­


ples versiones de archivos, generalmente, aunque no necesariamente, archivos de
código fuente. El RCS automatiza el almacenamiento y recuperación de los archi­
vos correspondientes a versiones anteriores, la modificación del contenido do los
mismos, el control de su acceso, la administración de versiones y la identificación
y fusión de revisiones. Como beneficio adicional. RCS minimiza los requerimien­
tos de espacio en disco porque sólo lleva el registro de loe cambios realizados,

NOTA
Los s í t o c s so n i? Z90* jc ares-ocreo que * «cay v í encuentre «npJearKJo
e¡ RCS 5.” ?ara qué .«ratón ae RCS se está ’-flitzando. 5pee re s -V.

El RCS puede ser utilizado con más archivos que ios de código 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, capítulos 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 tambión con a r­
chivos binarios, razón por la qu« mucha gente em plea CVS en lugnr do RCS.

Utilización del método RCS


Uno de los atracti%*os dol RCS lo constituye su simplicidad. Con unn m ínim a
configuración y sólo unos pocos comandoa, uno puede obtener mucho. Esta
sección 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 sólo 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 opción 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 continuación:
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 utilizarán
el subdirectono RCS. El mismo se denom ina tam bién el repositorio.

C O N S E JO
£ c c - - :c " - 3 — preGete#-— -■>30 oe RCS es u f j . iar 'eD G S ¡* .cr.o en caca tfrectorto
se 1*30^0. ri'.c n>su*:a s._-c:e.r.3 sara proyectos sccuci’wm. Lo araarior
Í U . 2 '- 5 z~ - v - ' í : ;= RCS: no fafriHB e :niC^O con ac..setos que tienen
o ro s Srectorics in tracto. E'~- otra rezar- aor ¡a -rucha gente prefiera CVS.
D espués de que h ay a sido creado eí repositorio RCS, el paso siguiente es in ­
g resar al mismo todos los archivos existentes de código fuente. La p rim era
ve 2 que el lector ingresa ur. archivo determ inado, RCS solicita u n a descrip­
ción 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 recuperación, c o . Pero vayamos p.-.so a paso. El
ejemplo siguiente crea un repositorio, u n archivo de código 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 continuación
_________ S akdir RCS
EJEMPLO
Después, creamos el archivo de código 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
RCS
•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'),
r«curn €XITJU0C£SS;

>

OttSCfiption. te m K v n a d wltn i n g l e V or ana o í f i l a :


i A lio 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
RC3/nifuente.c,v -> aífi¿an?e.c
'e v m o n t.1 ( I o c Km i

done
Capituio 19: Seguimientos de cambios en el código fuente 413

Obsérvese que si r.o se utiliza La opción • 1 de co, el archivo RCS que se recupera
ea forma de archivo norm al es de sólo 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 líneas 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 acción, efectúe u n a modificación al a rc h i­
vo funcional. Si aú n no lo h a hecho, ex traiga el archivo RCS del repositorio y
bloquéelo (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 príntf, porque tan to L inux como UNIX, a diferencia de DOS y
Windows, no añaden autom áticam ente u n carácter de nueva línea 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 núm ero de la revisión. Uov&ndolo a 1.2
2. P edir u n a descripción 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 eliminación 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 modificación sugerida en el párrafo 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 < - a tfu w tt.c
r.tm ' M i i o a . 1 .2 ; p r e v lO u * r a v lS iC O : 1 1

w t«r loa aessage. te'-Binatec witn single . or end of *iia:


» AAttidO carácter ae m¿i\u linea
» .
óene
C uando se las utiliza con c i , tan to ia opción • 1 como la • u generan u n a ex­
tracción im plícita 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 editándolo, m ien tras que - u ex trae u n archivo
norm al sin bloquear y de sólo lectu ra.
414 Programación en Linux

O p c io n e s a d ic io n a le s d e lín 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
amisión) y • f (por fnrce [obligar]). La opción - r ge u tiliza p ara indicarle a
RCS cuál es la revisión del archivo que se desea m anipular. RCS presupone
quo uno desea tra b a ja r con la revisión m ás reciente: - r deja s:n efecto esa
opción predeterm inada. La opcion • f obliga a RCS a sobrescribir el archivo
norm a: corriente. De m anera predeterm inada. RCS aborta una operación 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 opción • f p a ra po­
der com enzar de nuevo desdo el principio.
Las opciones de línea 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­
sión determ inado de m if u e n te .C , se u tilizaría un comando sim ilar a
co L - r 2 ." r a i f u e n t e . c . A nálogam 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 número da revisión 3 .1 y deposita er. el di­
rectorio corriente de trabajo una rovistón 3.1 do sólo lectura del archivo p re ­
viam ente ingresado al repositorio RCS.
»i< E je m p lo s
Sj 3iS y l Ente ejemplo crea la revisión 2.1 de m i f u d n t a . c Afwgúreao, a n te s de eje
c a ta r este comando, de h ab er extraído previam ente m if u e n t e . c del reposi-
e k m ih o torio y de haberlo modificado de alguna m anera
i ci -r2 nif-jenttt.e
<- rtífuanta.e
(¿g v i ' r*" •'avuio.'i 2.1; prevloi¡9 revlJiOfl: t.2
^ eoter iog m sag#, t«tntirac#a vrith single or ena of rile:
sau d a y> 59 aootfico algo
» •
dora

£¡£ m p ; o más alto.


S co - r i . 2 n ir u e n ta .c

Z 'Ü T R C S/M .rxjen te.c.v —> Jifu a n t o


^ r«yi$iofi !.2
salida dor,c

S.’ SMP'.O
Caoítüíc 19: Seguimientos de cambios on el código fuente 415

: :o -f nt't^ííte.c
RCSíaifaeBíe.c,* —> utfaente.c
rev isió n 2.1 ( lcck*31
iO A
<¿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 información jdentiEcatonn en archivos do código fuente,
de código objeto y bínanos. 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 SPALASñA_R€SERVADA: 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_5€S£aVikO*:NO»««£.AfiCHIVO NUWJISV c EO*A M09A AUTCfl ESTACO 3UMUEAD0R $

En «1 sistem a del lector, la m ayoría de e-stas campos tendrán valores diferen­


tes. S: el lector extrajera el archivo con u n bloqueo, vería tam bién 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 después 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 History ........................


• Sízq : aifueflts.c * i
• Revisión •■$$$,i? 2a 35:N:$s <Lrt_#all
• z- - t Z z * :•- r M é r t C s r ie s - = 3 : ? c " s« ia « l a c r a c l a v e Lag
, ) , } ) ) ) ) ) ) ) ) 1 ) i > ) ) ) 1 } ] ’

416 Programación en Linux

fl«vision 1.3 1S99/07.-20 04:59:17 *urt_wali


3e cánois *retum’ cor ‘exit*

aeviawn 1.2 5939/07/20 24:58:25 Xur*j*aLl


Añadido 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 codíqo Cuento \n*>¡

♦*lt(EX l7_3U C C E SS);

}
La palabra clavo SLog : m en saj 8$ perm ite ver las modificación*.*.*: 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 rnodiiicación m ás reciento
y continúa 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__________ Descripción_____________________________________
SAutnorS Nombro de ingreso al sistema dol usuario que ngresó la rev.siOn si re
ser/orlo
SDate$ Focha y hora en ouo ae .ngrasó la revisión, en formato UTC
SHeaaerS .Ruta completa de acceso al archivo RCS. el número ae rov.s>on. la fe­
cha. hora, autor, estaco y responsable del bloqueo (si esra stooueado»
S L o c k e rs Nombro de ingreso al sistema dei usuario cu» msntiene bloqueado e!
archivo ce revisión <sl éste rio estuviese bloqueado, el campo respecti­
vo queda vacío)
SNameS Siembra de símbolo, si ’o hay. empleado para extraer la revisión
Sf l CSf t i eS Nombro cel archivo RCS Sin incluir su ruta 00 acceso
SftevisionS Número de revisión asignado ai archivo RCS
SSourceS Sólo 'uta completa de acceso al arch:vo RCS
SSxateS Estaco de a revisión: Exp (experimental) es ei p'ecetermir'aco: Stao
(estable): «e.1(emitido ireieasec]}
) J ) +) ) ) ) ) ) ) ) ) ) ) l J I ) > ) . ) ) )

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 4 17

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 simbólico q u e re p resen ta SNameS es u n alias que uno
puede u tilizar p ara referirse a una revisión en particular. P a ra asociar un
nom bre simbólico con un núm ero específico de revisión, cuando ingrese un
archivo al repositorio utilice el su:itch •n < n o n b re > . El campo S S ta te S tie-
nen experim ental Exp) como opción 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 prestación de RCS le perm ite a uno dotormi-
nar qué revisiones de cuáles m ódulos e stá n .hiendo u sad as e n u n a versión
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 bién p alab ras que no sean p alab ras reservadas do RCS.
Esto lo perm ite al loctor incluir en su s program as información adicional tal co­
mo, por ejemplo, el nombre do una em presa Esta información nsí incluida pue­
de resu ltar una herram ienta valiosa para circunscribir problemas a un módulo
«•pacífico do código. £1 aspecto atractivo do e sta prest RCS actuali­
za lus cadenas de identificación autom áticam ente, lo cual constituye un real
beneñeo tanto para programadores como para gerentes de proyecto.
,3 E je m p lo
V* ‘-r'F P ara ilu stra r el empleo de i d e n t d-eoeremos cre ar prim ero el siguiente ar-
Z ^l chivo de código fuente, ingresarlo a l repositorio (utilizando p ara ello la op-
cjc m piq ción -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 1

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 * , .entorno»-*),
•-•turn EXIT_3L»CC£3S;
)

i gee ¡.'JorwLr^ertorno.e -o in p rin ir_ e n to rro


i id«nt :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 expresión 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
expansión por parto do RCS de las p a lab ras re n e g a d a s p ara crcar u n huffer
estático 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 describía
el texto expandido, y gee compiló dicho texto expandido en ol urchivo binario
P ara confirm ar eato últim o, recorra el archivo de código fuonto y com pare la
cadena expandida por S IdS en el código 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 revisión 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 opción - r tino puede comparar
versiones específicas. El formato general p ara la comparación entre «i de revi­
siones específicas 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 més 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
1. P ara analizar el empleo básico de r c s d l f f , considérenlo» el program a de
_______ dem ostración recién comentado im p r i m i r _ e n to r n o . c. E xtraiga del reposi-
c u m p l o torio RCS u n a versión bloqueada del m ism o y elim ine del listado el buffer
estático r c s _ i a . E l resultado debería 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.
•I
Caoítuto 19: Seguimientos do cambios on el código fu e n te 419
*:.->c 1üSí
#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 t»pfjB iP_*ntcroo.c
M
« tt it ie V *r rc»_i«3[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 línea 9 de la reviaión 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 específicas por medio de la opción - r ,
ingrese i a p r i r i r _ e n t o r n o . C al repositorio RCS, extráigalo inmediata­
m ente con un bloqueo, añada una sen ten cia s le e p (5 ) inmediatamente an­
CiCMPLO tes de r e t u r n y, fin alm ente, vuelva a in g re sa r al repositorio esta tercera re­
visión. e sta vez incluyendo la opción - u. A hora debería 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
revisión 1.1 con el archivo en uso:
S «“CStfifí ..-l.l iacri«ir_aatorno. C
2c2
< * s : c: i*C^ÍB¿r_rr,t í - ',.0 . : t « ’ .t 1999,-«7 .'23 35:57 59 K u r:_«ll ?«P S

> * 51:: iB?rtii.'_ertí"»O.C,v ' .2 tM9/«7/2fl 06:20:47 <ur*t_*3U 5x0 $


1 , 1 / } ) .1 ■ 1
420 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 revisión 1.2 con la revisión 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


r s t r t e v in g r e v is ió n *- 2
r ? t r l8 v ; r g r e v is ió n 1.3
d i* ? < r l.2 n .3
<:2
< • 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 5

» * Sífi: 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 práctica 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 versión.

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 adiciónale:: ex­
tienden él control <lel program ador sobre íu código fuente perm itiéndolo
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 básica 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
ningún argum ento elim inará todos los archivos de uso corriente que no h a ­
yan sido modificados desde que fueron extraídos. La opción -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 inación de u n a revisión especifica em pleando el
formato - rM.N, dor.de M es el núm ero m ayor y N el número m enor de la
revisión. Por ejemplo, ei siguiente comando elim ina !a revisión 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 código fuente 421

3 \: / E je m p lo
I.ItÍÜ l) El com ande sig u ien te elim ina u n a revisión no bloqueada y no m odificada de
;-=l 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_*ftt«rt*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 versión 3in bloquear de im p rim ir_ t? n c o r -


n o . c a fin de te n e r -ana versión 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 información sobre
los archivos alm acenados en el repositorio RCS La opción • 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 bién 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 opción -L. P ara ver la in ­
formación 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 Este ejem plo exhibe toda la inform ación registrada para toda* las revisiones
de im D r u ii r _ e n to r n o .c :
c u m p lo s r lo g j j 0.- 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 ación en Linux

amea sleep

r*vi5¿e« ».2
cat9: '999/Í7/28 86:0»:«4; author: K urtjw ll; State: Exo; linos: *’ Z
díiftotí Ouff«r

(■«visión t.t
date: 1099/17/20 «5:57:59; author: kurtjM ll; State- Éxp;
Io itial revisión

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 práctica, sin embargo, resu lta útil do dos m aneras. Si uno extrajo un a r ­
chivo del repositorio RCS como dn sólo locturn, y luego le efectuó cambio» cu
ya pérdida 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 extraído 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 explicación 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 información
adicional, puede utilizar para ello el sijíuiento comando re s :
& res -,tfav:o«nsa|o

n r s v es el núm ero principal de la revisión cuyo m ensaje se desea corregir o


modificar y m ensaje es la información corregida o la información 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 revisión 1.2:
■ i£ M P ío 5 res - n . 2 :*£iini^ado ouf^er astático 'rc $ _ W H '* ¿ricriair^entorno.-:

f- *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 código fuente 4 2 3

ne«s: 1-3
brancn:
¿ocks: W ic t
acíssi L i s t :
syaboüe
fcfyvor* íwcjtitutlan: o
total revisión». 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; Unas: »i 2
ELiairaco fru tar tita tico

El prim er comando llevó a cabo la modificación. El comando r l o g exhibió h


información registrada con el fin de confirm nr quo In modificación 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.
P a ra o btener m ás información sobre RCS, v er las siguientes página» de
man: rcs(l), ci{1 ), co(i), rcsintro(tj, rcsdiff(i), rea-
clean(1 ), rcsaerge(l), rlog{1), rcsfíle{1) y ident{l).

Lo que viene
En este capítulo ei lector aprendió sobre RCS, el Sistem a de Control de Revi­
siones. E l próximo capitulo, “Un toolkit de d ep u raaó a", continúa 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 técnicas de depuración.
D espués da h a b er depurado su software, aplicado parches al mismo, corregi­
do otros errores, y luego guardado todos esos cambios uúlÍ 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 istribución de softw are”.
1 ) ) ) ) ) ) ) ) 1 ) ) ) ) ) ) } ) ) ) * ) )
Un toolkit de depuración
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 ién o tra s técnicas y h erram ien tas m ás
especializadas.
Este capítulo cubre los siguientes tam as
• Empleo del gOD
• Tipoa de errores de memoria
• D epuración con E lectnc Fence
• Utilización 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 núm 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 sólo unos
pocos comandos. Le serií de sum a ayuda el com pilar la versión a dep u rar con
la tabla de símbolos especiales destinados a facilitar la depuración, gdb
tam bién 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 obtención p o sten o r de sesiones de de­
puración m ás rápidas y efectivas.
iPero espere' 6Qué es una versión p ara depuración? ¿Quu os una tabla de
símbolo»? Comencemos por esto último: una t.obla de símbolos es una lista
do funciones, variable# e información alm acenada en un archivo binario u
objeto que tan to el entorno on tiempo de ejecución 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 símbolos de depuración añade información ad i­
cional. tal como los núm eros do línea 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­
puración sea m ás sencilla La sección de esto capitulo relativa a l gdb le m os­
tra rá de qisó m anera utilizar usté tipo du prestaciones

Compilación con apoyo de depurador


Tal como se aprendió en ei capítulo 1, ‘■Compilación de program as", p ara
crear una tabla m ejorada do símbolos 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 símbolos do depuración en su tab la de


símbolos. Se puede utilizar tam bién la opción ggd b de g e e p ara generar
aú n m ás información p ara depuración, esta últim a especifica p a ra el g d b .
Sin embargo, p ara trab ajar de m anera m ás efectiva, esta opción requiere
que uno tenga acceso al código fuente p a ra cada biblioteca quo sea linkeada
d u ran te la compilación. Aunque esto puede re s u lta r muy útil en ciertas si­
tuaciones. puede se r tam bién oneroso en térm inos de espacio en disco. En la
m ayoría de los casos, uno debería tr a ta r de arreg lárselas con n ad a m ás que
la opción • g 3in aditam entos.
Como tam bién se recalcó en el capitulo 1. es posible u tilizar al mismo tiempo
las opciones -g -O (optimización). Sin embargo, la optimización transform a
el código objeto de forma ta l que u m enudo impide apreciar ia relación e n tre
lo que figura en el código fuente y lo que es visible en el depurador. Puede
ser que algunas variables o lineas de código 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 endación e3 que uno aguarde p a ­
ra comenzar la optimización de su código 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 código, resu lte mucho
m ás sim ple y menos estresante.
Cao;tulo 20: Un toolkit de depuración 4 2 7

PRECAUCIÓN
V> f8T W v3 Ge s u s 3rr>.vos ¡a ;rr‘0 '~ 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« cuestión 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 artíwvo ejecutarte final, c.’cno usufirio ns esta-
r3 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
¿ - Í 3CM35 r>*cesar.cs a IV a e hao w s¿ cc*responc«r'.e arcWva b inara rrtás C0ir<aca>.

E je m p lo
E ste capítulo u tilira en varioa de su s ejemplos el siguiente programa:
/ • «íoter* : f l ¡rro jrjiu «n Í n t í m i t : sa rj_á8p«rar.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 díDurucior
•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
Lun»Jf_«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 < Wj»íL90_3ftAAC£; —1|
s * r(x l • i;

i
Yo compilé este program a y craté de correrlo, tal como se m uestra a conti­
nuación:
S gee -5 ^ 4r i _ 3e s u r jr .c -o para_d«p«rar
S J s¿r=_5ic^*ir
Segoeitarirc *».!: ,ccr* ij«eM
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 ayoría lo que se desea obtener con gdb puede ser efectuado cor. un
conjunto de comandos sorprandentem ence pequeño.
) ) ) ) ) ) ) ) >
) ) ) ) } } ) ) ) y
) ) -2 8 f-.ogrdmacion en Linux

in ic i o d e gdb
P ara iniciar u n a sesión de depuración, sim plem ente *ipee gdb r,o¡nbre_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 utilización
de u n archivo de vuelco de m em oria es opcional pero reforzará la capacidad de
depuración 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 — -^ 1
***** rr^m «1sV¡iW f«.1...9WM,
'•T'OX —»*,-• - v * uV f,„» i

F ig u r a 2 0 .I. Isi pantalla de inicio de gdb.

La opción -q suprim ió los molestos mcnaajoa .iobre licencian. O tra opción


útil do línea 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 códigoTuen
te del program a (como opción 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é rozón
term inó ol program a. En esto caso, el program a ocasionó una serta! 11, que
corresponde a u n a falla de segm entación, También exhibo, de m an era útil,
la función que se estab a ejecutando y la línea de program a que gdb conside­
ra que generó la falla.

EJECUCIÓN 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 aceptaría norm alm ente.
Además, 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 después de haberse
iniciado una sesión de depuración. 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 línea de comandos.
i ) ) ) ) ) ) ) ) ) } ) ) ) ) i i > n t j )

Capítulo 20: Un toolklt de depuración f429;

CONSEJO
S se "■?. o-visco céreo 3= sscr.K sfgúi remarco Ce y<3Ü o -o s e srcuentra s e g u ro ae
3j 3 - x i : ; colecta. acócuenta cctf una axcsif.ts ayude- Un sim escomandohelp *j-
ocíos t? 3 “neo ce comarcca da gdb 5 brindara una brevo sta Ce as cistíneas cáte­
l a s as comandos crsoecíbies. mientras Que n e ip (tema) imprimirá ayuda •jíii 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 dispo-
nóte en .'rea y x r co-rco sotícitSroola 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 de-
tiene tra s recibir la señal SIGSEGV:
E iC M P tO
(J«3I 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 SIOSÉGV. Sígoennuon f a u lt.


¿r luA *jf_»U teri3 3 u r* Jx cífííaca) a t 5Jr3_a«ourir.c:24
s a u o a 24 s u r jt l • i;

igcoi

INSPECTINQ CODE
La cuestión, pues, es qué ha estad o ocurriendo con la fundón 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 atrás) a
fin de g en e ra r el Arbol de la función que condujo u la falla do segm entación.
Tam bién re su lta práctico ten er a lg u n a idea del contexto en el cual existen
las iineas de código que causaron -ol problema. A esto propósito utilice el co­
m ando l i S t . que cieñe la forma general l i s t [in, n J . Los valorea B>y n re ­
presen tan los núm eros de linea inicial y final que se desea aean exhibidos.
Un comando l i s t sin ningún a d itam en to exhibirá las 10 lín eas de código
circundante.

E je m p lo
La sucesxva de los comandos to a c k tra c e y l i s t dene el .siguiente aspecto;
(ffw > s i ' t ' . r a *
ejemplo iic n n z a n i . - j _ / _ o : 5 t « r i o (su.-*-#xo?fff8c$) n cara_d«purar.i;:24
i ’ ó im a r ifl w t n () a r p a r a j * t p « i r » r . c M 6

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 Programación on Linux

2* jy r f il * l;
23

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#su¡te inequívoco 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 función m ain. Se puode observar tam bién
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 iGüilo u n a im agen clara de qué »■; lo
que « U sucediendo con e! código y dónde tiim e lugar, uno puede luego de-
term in ar que es lo que anduvo mnl y corregirlo.

E x a m in in g O ata
Una de las prestaciones máa titiles do g d b es su capacidad de exhibir tunto
ol tipo como ol valor do caoi cualquier expresión, variable o arreglo prosen te
en el program a que e stá siendo depurado. El comando respectivo im prim irá
el valor de cualquier expresión quo sea legal on el lengüino 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 región 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 región de m em oria de in ­


terés y num ero es el núm 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 núm 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 notación e n tre corchetes indica que uno quiere com enzar a im prim ir des­
de ese elem ento específico 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 bién indi­
car los tipos de variables presentes. U na de la s -imitaciones del comando
c h a t i s es que sólo brinda el ripo de una variable o función. Si uno desea en
cambio la definición de u n a e stru ctu ra, debe u tilizar el comando o ty p e .

E je m p lo
E l ejemplo siguiente m uestra una serie de comandos p r i n t consecutivos y
sus resultados:
= J £ V (>V0
CaOfluíO 20: Un todWt d© depuración 431

:? » ) ei-int i
J!
igtf&l ;rirt «jrriJ
£v.f>s: K t t u « « o -/ i t n :í» N ?N
¡ 500; p r i n t t^ * [¿ 5|

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. 1 *2 . « .3 . »**, n a . *»5. »*r . **8

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 ,

(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_3i»terio
t y f « • » o ra ( í í )z •>

A unque an este ejemplo el program a se ddíuvo 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 ubicación de memoria especificada, aunque
tiene acceso formal a ia ubicación 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 seÓ3Ía el comienzo del mismo. Por lo
tanto, gdb examinó s u r . vio que era La dirección 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 indexucióa. [ ]. tal co­
mo se indica en el segundo comando p r i n t su r.
4 32 Programación en Linux

CONSEJO
HaoituaJnerte es ccmotladq ser compatfbilidad cc.- ’a biblioteca res-meé ce GNU
le que significa que acepta la edición desde línea 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 sesión. Oe manera si-
rrillar 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 carácter situado sotiro ei cursor
• Ctn+t desc<a:a el cursor hasta el final de la Jnea cómeme.
• -Ctrl-*-K elimina todo lo que se encuentre aove la uní-sación corriente ae: cursor >
el flnaí Ce ’a linea.
Para obtener más detalles sobre la ecicíón desoe la linea do comandos, ver ‘a página
reaüíine 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 ejecución del mismo en algún momento, gdb le perm ite i uno
establecer p a ra d a s o puntos de detención (breakpointx) en diversos tipos de
construcciones de código, incluyendo núm eros de línea y nom bres de funcio­
ne.-}. Uno puede tam bién establecer p arados condicionales, donde el progra­
ma se dettune sóio cuando 8e cumplo d eterm in ad a condición.
P ara lijar ur; punto dn detención fin un núm ero de línea, utilice la siguiente
sintaxis:
Igdbl oreak nunoro_Uno«
P ara estnblocer u n a parada en u n u función, em plee esto otra:
(gdb) orjak íic<iibro_a#J,ur.cton
gdb d eten d rá la ejecución del program a de forma inm ediata an tes de ejecu­
ta r la línea especificada o in g resar a la función 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 código que está por aer ejecutado. Si el lee
to r tiene entro manos un proyecto m ultiarchivo y desea detener la ejecución
en una línea determ inada del program a o en una función que no se encuen­
tra en e! código 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| or»ak '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 ejecución dei program a cuando se encuentra
determ inada condición. La síntesis correcta p ara el establecim iento de p u n ­
tes de interrupción condicionales es la siguiente:
(gíüj brtak nu<ie."0_je_linea ar nc<iüro_Ja_funcion i f «p re sió n
e x p r e s ió n puede ser cualquier expresión que evalúe a VERDADERO co cero)
P ara proseguir la ejecución después de a rrib a r a u n punco de detención, ü-
pee c o n tin u é .
Si h a establecido varios puntos de detención y ha perdido la pista de lo que
fue establecido y cuáles puntos de detención 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 .
) ) ) J i ) ) ) ) ) ) )

Capítulo 20: Un toolkit de depuración 433

£1 comando delete le perm ite e lim in ar puntos de detención, o puede m era­


m ente d eshabilitarlos urliióando 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
La saiid a de u n a sesión de depuración que se m u estra a continuación ilu stra
el empleo de ios puntos de detención;
E.'EM PLO ! 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 d«tt«ss#<í i-.¿s 3een s t a r t a - J a lr e a d y .
S ta rt i t f ro€ t M M g inn ln g ? (y o r nj y
s a lió * 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 ) a : p a ra_ d 9 p u r3.-.c:2S
24 s w r [ i| * t ;
ÍCCO) sa'in: i
$7 » 15
:&C5 » m<© o rtw p o ir.ti
•fea Typ* O lí : Effc Accr?»» ítnat
i Dr»*kpoint *M p y 3«834 8 a i # m lun4_y_n*.3torio »t
o a ra _ (5 tp u ra r.c :2 4
StOC «n ly i* 1 ** *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 información sobre los puntos
de detención en vigencia y los e lim in an por número.

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
expresión, y la expresión 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 ejecución), 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.
Programación on Unux

E je m p lo
Elim ine todos ios p uní 03 de detención y puntos de superv-.sión que pudiera
haber establecido y luego establezca el punto de detención 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­
cución cuando la variable i se a igual a 15. D espués 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
iteración del lazo f o r

C O N S E JO
\o reauHa nao»Mfi<> iludir atop ir"', voces, gdb recuerdo «I üi:iro con'a-nlo <?)<»cuti»-
do, do -ricdo quo so cuo<¡o sancillnnwnto oprimir ln tecla Iniro y v o iw i «¡ccui-vlo. uno
gran contribucid" j la comcfídud. 6slo funciono nem ia nvayorto ile loo comando'; do
gdb Para obuinor mftrt douillon vor lo documoninctón 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 lúa 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 función ostilr. activas si esa función se
está ejecutando o si ae lo ha transferido el cont rol a otra función llam a­
da por la p n m era. Digamos que la función f oo llam a a la función 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 encontrarán activas. D espués que b a r hayo retom ado, sólo se ­
guirán activas las variables de f oo.
• Las v ariables globales están siem pre activas, independientem ente de
que el program a esté corriendo o no.
• Las variables no globales están 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. ¿Cuál
es la idea de g d b sobre ci contexto de las variables? La complicación surge
del empleo de ias variables estáticas, que son locales al archivo; es decir, uno
puede ten er variables estáticas de idéntico nom bre en varios archivos, y las
m ism as no ocasionarán conflictos porque no se en cuentran visibles fuera dei
archivo en el cual están 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 resolución de alcance de C++. La sin tax is es la siguiente:
arctirso_a_nGS}br3_Ge_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 función en la cual aparece la variable. A si que, por ejemplo, supongam os
Cacituio 20: Un toolkit de depuración 435

te n e r dos archivos de código 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 estática. 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 ilar-
m 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 función'
í?r5) print
(gao) o r in t U o i s t : : i d x >

Detección y reparación de problemas de memoria


El tem n de este capitulo lo constituye la c a ía de errores. Luego do los erro­
re s lógico* y los de tipeo, el tipo m ás com ún de erro r lo constituyen los que
e stán vinculados con ia memoria. En e s ta sección, 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 ayudarán 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 categorías generales: filtracio­
nes. corrupción 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", página 228.

La corrupción 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 código:
ciur •eae**a;
cnar -nersaje;
strcpy(ca¿tr.a, 'algiau z tn tiu a 2 e m t o * ; , * vieoorta para 'cadena no
5Si5*aca
e ír.ia ie ); /• pensáis' i\o esta
inicialUaflo *.*
Este fragm ento de código ocasiona u n a falla de segm entación 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 ¿unción 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 inicÍ3Íizado 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 süi proponérselo a la m em oria ubicada inm ediatam ente an tes
o después de u n arreglo.
i ) ) ) ) ) j ) ) ) ) ) ) ) ) ) .) ) > -> 5 > '

436 Programación 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 filtración de m em oria.
• Se p a sa del final de u n a región de m em oria asignada dinám 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 estáticam ente y tam bién 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 « < s * .d ío .h >

íín e lu d e < itr u » g .n »

e.tar buffor_global[51; f E « f l en una va ria d o global Esta «c la ra d a anto» d«


*»tní> •/

in t a a s r iv o i c i

(
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 ftría 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);


freeiíufl;

/• is ta vez so casa d* la rg o ;o r n t.c n o « l f ir a l do : j í */

Q uf = n illo c (3 );
) ) ) ) ) ) ) ) ) ) ) • ) ) * ) " ) ) ) ) ) ) ■ ) ) )

C apitulo 20: U n to olkit de depuración 437

: . 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 003 <0 C53 •'


frtt(o a rj;
f m ite f];

• 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 riíitf 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€_0u€W_CCa7O- aíccars-»
S*yi¿ci'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 pleu-
z ¿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* .
Programación 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 eléctrico", 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 Ilícitos de memoria, y ab o rta ol program a cuando encuentra la
p rim era instrucción que cometo una violación de lím ites de memoria. E! pro­
gram a logra osto reem plazando lo función m al lo e nornml con su propiii (na -
l i o c y asignando un pequeño tram o de mem oria situado inm ediatam ente
después du la asignación 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 violación do accos» do m em ona, la emú aborta vi
program a m ediante unu señal SIGSEGV. Si ol síntoma 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 ubicación del rebajam iento.
P ara em plear Electric Fence uno debe linkeur ui código objeto do su progra­
ma u n a bibüotoca 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 violación de m em ona que en­
cuentre, Electric Fence efectuará un volcado de memoria.

E je m p lo
V /jS y Este ejemplo m uestra cómo u tilizar Electric Fence.
fÉ X J gíc ■•} «uljjjcjien cn a.c -o >-il_uso_renúfia lvfence
ejem plo s .1 itai_uao_*ei«oria

.• -* » « 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 e®3fía
{güb} r-un
S tartm o -rocr=n: i$ryiocal/newp!'o;ects/lo8/20/src7*al_iuso_ne3ari.'.

niectric Finca ¿,o.S Copyright (C! 1987-¡996 3rjce ^orens.


CO : aocie
Caoftulo 20: Un tooíWt de depuración 439

r«c«l*e<» i i y i i SI3SÉGY. S*5*«niation fault.


«trcpjf (aw t*«*a:«affa , it>cd«fg(*\ src«ta$*«9Sfc *3tc<Jergh’ )
«t - . *rsd*c»' g ««e r íc /strcpy. c : 38
..í*yW «OS/fi»t!9ric/JtPcpy.c;3e: so soc-*-. f i U ar dirtctory
i?2Si «n e -t
*a strcpy (C«s:«0>**1i»aí?8 *«octf«fgn\ jrc»ú*80-i95fc •accdei’sf!'!
7At ../syM«3s.-;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 jíc U in _Ubc_SM rt_ttln (oai**<<M4«39« 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 compilación utilizó la opción - g para generar jimboloe de depu­
ración adicionales La pentllfcma lista del listado anterior (ígdbj es sólo el uxn-
bolo de p etiaó n d e comandos/ deja muy e n claro que «date un problema en !u
línea 27 do la fundón m am del código fuenUt dol programa o a ijjs o jr a m o r i a.
Después 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 ración/co-
rrecciótv'recompilado U na vez que el program a esté totalmente depurado, rc-
compilelo 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 línea


27. pero no logró detectar el desbordamiento m ás pequero. ¿Cómo pudo ser? Este
comportam iento peculiar 5e origina a p a rtir de la manera en que ei CPU alinea
la memoria asignada. La mayoría de los CPUs modernos requieren que los blo­
ques de mem oria esten ahneados con respecto a su tamaño 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 asignación de ocho bytes
a ñ n de satisfacer los requerim ientos de alineam iento de memoria. Como re­
sultado, el rebasam iento m ás pequeño 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 alineación 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 bién 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
) ) ) ) ) ) J ) ) ) } ) > ) > ) i ) ) ) } >

440 P rogram ación 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 espués de asig n ar a S£F_ALt(3NMENT el valor 0, recom pilar y volver a co­
rre r el program a, Electric Fence detecta e sta vez el pequeño rebasaaiien to
de buffp.r presento en el program a.
S « X30rt =f_ALlGMU£ST»Q
S jec -g iMl_‘JS0_n»it0ria.-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»

(gcül run
Starting orojrair: /u3r/i,cca:/ro"prci8Cís.'lpe/2«Ksrc1,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 3íQR€0'/, S íg n u n ta tjo n ' j u l t .


a trc o y |d# s:» 'íx4 eio.iff3 , a c c d » \ src«¡»xlKW95ee *abcdO*>
a*. ./ 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 .
(QflO) «furo
« itrepy (<j«at-0x40'.0afft> 'aocCo*. 6rc-»x3«-t95aS 'acedo')
./íysa*ps/3enertc,'>trcpy.c:38
#1 Jxe**85<2 m r.ain(| 4t nal_i/SO_nr>noria.c:2l
*2 ¡»x-K)<J3¡fcb3 Ln _tioc_5tart_iTain (mnln»0x8»48ew <nd:n>. #rgc*1,

.KQV'-axaff'f334, Ifllf«x0í48660 < _ in u > , ftnl««x6ft495ac < _fLnt>.


rtld_nm*ax40í»a356 <_dl_r:ni>, 3tacK_ond®exDffff92C>
¿t ./iys<!«ps.'3eneri«,'litc.starí.c:78
<*»>
Como se puedu ap reciar ea ía áidida anterior, Electric Fence ahora delecta el
pequeño 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 práctica nortear siem­
pre al código cbje:o del -i¡smo ¡a biblioteca 1 loofonce para así poder detectar ios e--o
••es as rraiíoria que de ocra rr<cCOtal vez no ouo.'esen ser d&iectaoos. OebíOO ÓTOcisamen-
te 3 tas cuastior.es referentes a la alineación de memora oue se^oamos ce comen:
) ) ) ! ) ) ) / ) ) ) }

Cactolo 20: Un toolkit de depuración 3¡B|

Empleo de mpr y mcheck


La o tra h e rra m ie n ta de depuración 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 corrupción.
A dem as, m pr genera tam bién e stad ísticas y patrones de asignación, aunque
e stas ú lu m as prestaciones no e s tá n cu b iertas en esta sección. E l método 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 asignación y de liberación 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 descárguclo y compílelo. E ste p aq u ete de
softw are incluye varios p ro g ram as u tilitario s y u n a biblioteca estática,
I ¿ b ~ D r. a. que debe 3er v in cu lad a al código objeto de su program a. A segúre­
se de u tilizar el «ufcA -g con el ñ n de g enerar símbolos de depuración, 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 código 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 búsqueda de bibliotecas la expresión $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 asignación y de
liberación, 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 debería 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 información de registro no es de mucha utilidad tai cual está (In docu­
mentación de! program a m pr explica el formato, si es que llegase a e sta r inte-
re 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 información que resulte m as inteligible. P a n visualizar las ftigús 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 cioca«r«d aas: and o í aliocatad blocK
* c o .t»j (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 opción • f inform a el nombro dul urchivo y ol núm ero de linea donde mpr
detectó la fuga de memoria, La salida iudica que la linea 18 de la función
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 em-
pluon núm eros decimales largos para m an to n er el registro de cada pedido de
asignación y liberación de memoria). Observando ol listado de código fuentu,
uno puede verificar que efectivanw nte os así.

Usando m ch eck
Tal como se mencionó recién, m pr, por sí solo, no puede detectar lon error»**
de corrupción de m em nnn, Si bien t>sto os así, mpr incluye la función
í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 ubicución del comienzo del buffer) y liberaciones repe­
titivas del mismo bioquo lievudas a cabo por llam adas superíluaa a f r e e .
De- ru?cho, mpr compila mcheck on l i b m p r . a como opción predeterm inada.
Las buenas noticias son. entonces, que loa raba»am iantos de buffer, tan to po*
sitivos como negativos, hacen que el program a aborte a menos que uno ins*
iruya específicam 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 dónde h a ocurrido el mismo. Compilado ju n to con m ciieck , el progra­
m a de dem ostración aborta cada vez que uno castiga dem asiado la m em ona.

E je 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 habiéndose corregido el erro r encontrado en la co­
EJE M P LO rrid a previa:
s ./nai_u80_«inoria
POS.POCO : accde
n<y»cx: «so>‘y cloccersC ssst and i f allocated biOCK

S . 3ai_i¡so_n8(T<ria
pos POCO : accda
Caoftulo 2 0 : Un toolkit de depuración 443

?W_WJCH3 : aíCC«?3*
8gjausau»RT 0 : í:c « * :-
c*scry clsetfí'K t ir f s r g lliOC 3 t«<l OliKSt

l— l
S .lu tíjiv ¡_ » t v }r i3
PO«_POCO : » > :íí

PMJWCHS • «cdíftf-
S£_0üB2A.CORTO:
•cft*cX: biocx ’reri t » ;c «
La corrección 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 depuración
de progr.imaa Er. .*1 capitulo sim ie n te, "D istribución do softw are', aprendo-
r á un p ar de método» p ara d istrib u ir su softw are ya libro de errores. En el
últim o capítulo, re u n irá todo lo aprendido a fin de en co rar el proyecto do
program ación ya anticipado, u n a base do datos de CD do música.
) ) ? ) ) ) ) J ) ) ) )

21
Distribución de software
H asta oS mejor y m ás rápido program a del mundo se volverá inutilizablo si
resu lta e x tra o rd in a ra m e n te difícil 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 ación, cubre el espinoso procero de la
distribución de software.
E ste capitulo cubre los siguientes tem as:
• Empleo del comando t a r
• Utilización 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 distribución de ioftivarr consista *m la creación, dintribución, instalación
y actualización de softw are ta n to d«l código fuente como de toa archivo» bt-
n 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 , j , > > > > > ' t > > ' ’ ■’ ’
448 P ro g ram ació n en Linux

5:c.T3SoLv.conf
etc/snc.conf
sM.'sysics.cor.r
Obsérvese 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 op-
ciones. Tradicionalm ente los archivos t a r comprimidos, o zipzados, se desig­
nan añadiéndoles . gz al finai de 3u nombre. Tam bién se les da a m enudo la
extensión . tg z . C ualquiera do las dos opciones es aceptable. Por razones de
ÍJEVPI.0
coherencia este capítulo 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
.. f atc/dosanu.conf
itc/gprt'root-Conf
^1 « t c / n o s t .c D / if

í TTToa ■ tc/lfl« í.« a f


«ts.'issano.conf
Otc/ld.JO.CCflí
«te/IÜO.CMf
•tc/logrotatcar: Cannot au<j f:L« íatc/guota.conf: Pontusioo tíc-nod
tar: Er'-or extt d»l3y*d í-ott gr«vl<ms orrora
wo. con*
•:c/»yJlcsj,cc¡if

ü i opción v hace quo t a r sea verboso, ca decir, que liste Ion archivos que va
añadiendo 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 utilUttíófi de ia obciío /. para comprimir jn arcftrvo t a r "ralenttta' de alguna mare­
ra la operación 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 compresión trecho mejor, piro ae ceoe tipoar un comando adiciona,
oara nacerlo. Como loa progrnmadoros son seres démosos, '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 efectúa/ 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 segúrase á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 presión en los sistem as Linux. Es ta m ­
bién la utilidad e stá n d a r de com presión em pleada cuando se em plea ia op­
ción z de t a r Los archivos com prim idos por medio de g z i p g en eralm en te
tienen una extensión .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
CaafaüO 21: Distribución de software 443

c o m p r a d o s em pleando z ip tie n e n u n a extensión . 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 extensión . 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, súbitam ente, se da cu en ta que omitió incluir la corres*
pendiente documentación. Porque i a escribió, ¿no es así? No se preocupe, se
puede fácilm 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 documentación recién escrita al archivo t a r comprimido
que se creó al cabo de la serie de ejem plos anteriores, puede em plear la op­
ción r o la opción u. La opción 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 £ opción u \update).
z su vez. sim plem ente actualiza u n archivo p resente en el archivo t a r con
una nueva versión del mÍ3tno. N atu ralm en te, ót el archivo original no so en­
cu en tra presente, la actualización 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 idéntica a la generada cuando ne creo el archivo t a r , du modo
que no -se la repetirá aquí. O bsérvese quo osto comando no utilizó In opción
de compresión. Z. Esto 50 dobe a que el ta r de GNU, por lo menos h a sta la
versión 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 .

ELIMINACIÓN 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 opción
- - 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 continuación el nombre
de los archivos que se desea eliminar. Lo mismo que con la opción u de actualiza­
ción. 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 operación de eliminación de arciuves, uu ¿oüJw ¿ 2 cgsspntiS -in­
teriorm ente, no posee una opción 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. Además do
copiar archivos, i n s t a l l establece sus perm isos y, si re su lta posible, sus
Programación en Linux

propietarios grupos. Puede tam bién 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 bién en ''scripis" de interfaz. La sin tax is del comando
I n s t a l l es la siguiente:
i install lo p cío flj...|| fuentd(...! dostino
donde f u e n t e consiste en uno o más 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.________________________
Opción Argumento Descripción____________________________________________
•Q q ro u p 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 .
•o owf.ftr Asigna como U3unrto p/opa'tario do loa archivos o-1UID o nombre oe
usuario especificado en ownor, El propouno píotíolorminado es rool.
•m mode Establecí- ol modo de los archivos (sua permisos oe acc* 80 | de
acuerdo al valor octai o simbólico especificado in n o d e . £i modo
de archivo predeterminado en 755. or. decir IcctuM/csaitura/cjo-
cución. para ol propietario y 'ecturo/ojocuclón para al grupo y oí rot-
to de los ufiuonos.
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

f
! Í-U 1 Este ejemplo e stá tomado del makoíile de gdbm, ia biblioteca de base de
r |[7]l H^too do G:TU. Luego de expandir algunas de las variables de m ake, el ta r-
^ r¡E \ got i n s t a l l es:
¡T e m p lo in s ta ll. libscád.a 3 dt1n.i 1 gcfcn.inro
install -c * 3-í -í licgdfo.i S(1¿m íi ' í / I íocooí.a
in stsli c b e-i-t saan.n 5(inclueedíri/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 sólo 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 áeTexinío, 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
Cáptete 21: Distribución 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 debería incluir e s » opción en la iínea de comandos pero, en la mayo­
ría de los casos, la misma será ignorada.
2 E ste ejemplo crc-a un conjunto de directorios debajo de / tnrp y asigna al-
^ %i_í gunos modos extraños a los archivos que copia i n s t a l l . A menos que ei lee-
ly \1 / to r tenga permisos no habituales sobre / tn?p. este programa debería ejecu*
/g j tarso sin m ayores problemas. El escrito utiliza algunos de los archivos do la
cjcm p '. c distribución 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
después 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 te InXiirmt: lo« l - w t a U . V t . V
* l/ 6 1n /$ n
• 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 oís 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*)
00
SWSTAU. -C -2 O 5US£ft 5 SGft? JL3£ S 2 V
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¡

a n w r- x r-x 2 '< u rt_ « a il u s» rs :0 2 ¿ J u l ae a 4 : u /


SALIO*
: rrx r-x P-X 5 <nrz # a l l u « rs •3 2 * J ü i 20
15 7 2 3 - e l 20 >54:-4 3 n s ¿ 2 < n r .c '

—*—* —* 1 •a r'.ja lL usar* !W *= J u l 2<J 0 4 :u ;p.^rp.c*


- - X - I - X 1 K a rt « I I ¿ s a rs 5522 J u i 20 0 4 :i* c h w j.c *

-x - i _x ; f c r t «rail u se rs • : i 2 : J u l 20 0 4 :! * c b o » n .c '
) ) ) > >
y v > ) ) )
nación en ünux

- —X —X —X l J c u r tjn U users 2454$ J«1 28 i* :'* copy.c*


- -X - X —X 1 fcurtjtail users 6354 Ju l 28 04:-4 co-f.asn.c*
- -X —X - x 1 •<urt_*3il users 2Í521 J u l 22 34; :i
- -X -X —X 1 xurt_wall users 38SS4 Ju l 20 24::4 20.c*
• -X — X — X i k u r t jM ll osees 29320 Ju l 2? face*

S 3U -

?3S5»crd;
* :<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 *.W2
- - • — i root 6 7 3 12 J u l 23 0 < :2 1 Cí.PO
- - • — ’ ra o t X f* 75552 J u l 23 « < :2 l (Je.SQ
- -i ! root XT5 7 4 1 1 7 J u l 23 3 4 :2 1 t i . 30
- -• -• 1 roo t Xf5 99148 J u l 23 0 4 :2 1 OJ-PO
- — — 1 roo t Xfs 77667 J u l 20 0 4 :2 1 r r .p o

- -• - • 1 rsot x fs 6 5223 J u l 2 * 0 4 :2 1 KO.PO


- — -• 1 roo t xfo 78329 J u l 28 0 4 :2 1 n l.p o
- -• -• 1 rnot xfu 0 7 10 3 o u l 28 0 4 :2 1 no.po
- -• -• l rs o c x fs 07227 J ü l 28 0 4 :2 1 p l.p o
- -• - • 1 ro o t X fi 78743 J u l 20 0 4 :2 i P t.p o
- — 1 ro o t x fs 6BS34 j a l 20 0 < :2 l /■u.po
- -• -• 1 rco t Xfs 60906 o u l 28 0 4 :2 l sk .p o
- -• — l rsot x fs 6 5 7 14 j u l 20 0 4 :2 1 s l.p o
- -• - • 1 ro o t x fs 66062 J u l 28 0 4 :2 1 s w . p o

El interés 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 código fracasará si no es co m d o por
el usuario root. El prim er bloque de código crea tres directorías 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 código fuente C desde el subdi-
rectorio s r c {fuente) del directorio corriente de trabajo a cada uno de los tres
subdirectonos. La opción • 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: Distribución 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 según el nombre del directorio y haciendo
que les archivas sean sólo de lectura para el propietario/usuario Ningún otro
propietario o grupo tienen algún tipo de privilegio sobre estos archivos.
Este empleo de i n s t a l l es extraño, y los modos de archivo, tal como lo mues­
tra el listado, son inusuales, pero el ejemplo ilustra adecuadamente la razón
por la cual i n s t a l l es un mejor comando que Cp y cómo 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 distribución de Linux de Red Hat. Se lo emplea con mayor tro-
cuenaa para Lir.ux. Pero existen versiones disponibles dol sistema para va­
rios siatemaa operativos añnea a tTNXX, incluyendo a Solaris, SunOS, HP-
UX. SCO. AIX y el Digital UNIX.
El tratamiento que se brinda del RPM en este capítulo se concentra en la crea­
ción do paquetes de código fuente. Si el lector so encuentra interesado en cuestio­
nes más triviales tales «orno por ejemplo instalar, actualizar y eliminar paquetes
de RPM. lea el excelente libro de Ed Bailey Máximum RPM. Puede también din-
gir nu navegador hacia ol aitio Web h t t p : / / www. rpm. o rg /, desde dondo podrá
descargar la última vención de RPM. obtener documentación completa, FAQs y
KOWTOs. y hasta descargar una versión digital de dicho libro.
NOTA
Se recorroertta «fifAtcamenTe aocuirir Máunuffl RPM y reoxnpensar de esa manera
tarto ai autor como »■ «citor por nacerlo disoomtüe o*n cargo El lector encontrara asi-
Ktvno J'./« í-iCoc<y oe '-ni cocía ^ 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 código 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 constricción del paquete de software. Deberá también contar ya con
un entorno de desarrollo plenamente funcional (compiladores, herramientas, edi­
terv- bocaditos y gaseosas, café y tedo lo demás que necesita para sentirse cómo­
do). y además su oüiga fuente debe haber podido ser compilado sin problemas.
Antes de continuar, sin embargo, resu lta .->^;.dal poder transm itir la filoso-
fia a la que responde RPM Éste siempre debe comenzar con ruentes p rísti­
nas. Pristinc, en este contexto, significa código original, sin ningún parche,
tal como provino ¿e quien lo desarrolló. RPM se halla diseñado para permi-
P r o g r a m a c i ó n e n L in u x

tírle al usuario aplicarlo parches al código fuente original. E sta prestación le


perm ite a uno utilizar RPM p ara personalizar el softw are a ur¿ sistem a espe­
cífico o corregir los errores cuya solución conozca.
El énfasis sobre fuentes stn modificar perm ite que usted o sus usuarios siem ­
pre puedan comenzar una construcción desde una base conocida y personali­
zarla luego p ara hacerla ad ap ta r a determ inadas circunstancias. Como dcsa-
rrolladorde software, esto lo brinda considerable flexibilidad con respec*.o a la
creación 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 código 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 creación quo se llevo a caho de un paquete RPM puede resu ltar
algo desalentadora. A fortunadam ente, la m ayoría del trabajo a realizar salta
a ia vista. La parto más im portante de la creación do un paquete RPM. la ge­
neración de un archivo de especificación, debí* aer efectuada una «ola vez.
Despuúa que haya .sido creado el archivo de especificación, uno pasa la mayor
p arte del tiempo haciendo lu que quiere hacer, m an ten er el program a. Sólo
resultan necenanad pequeriao modificaciones al archivo de especificación.
CONFIGURACIÓN 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 configuración 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 configuración predeterm inada do RPM versión 3.0.2 en Red Hat 6.0-
5rpn — shcwrc
¿fiCHITSCrwS AtO OS:
^ auiid áren : ¿336
.- L íjJ * 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. : U36S
salí oa ¿ rs -a ll es : -ír.ux
c :a ? a t i 0 I « ai-chí : i66ó 1436 i3 3 6 n oar:fi
c s o a a t ic ic es 3 : 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 Distribución 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 urquitectu-
ra y configuradones de 3istema operati%-o, las cuales definen el entorno de
construcción e instalación, y valores de ^pm rc. que controlan ol com porta­
m iento de RPM. El archivo de configuración global, / e t c / r p m r c , debería
s e r empleado p ara establecer configuraciones a nivel de sistem a. El archivo
local. SHOUE / . rp m rc, contiene valorea específicos al usuario que «instruye
un RPM. E n la m ayoría 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 ciín nace/ eso erectamente en el archivo de e&peo-
ícaoór no fr^cno sentido nácelo aquí. 3 afoüle^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 -n«yrtc?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 Róbales

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 especificación, después dei código 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, cómo construirlo, dónde in sta larlo y ¡os archivos que con­
so n e el paquete El nom bre ¿o cada archivo de especificación que uno crea
deb en a se r asignado de acuerdo con la convención 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, versión es el núm ero de versión, típ icam ente en formato x . y . i . y
r e i e a s e es el núm ero de edición de la versión 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­
sión 4.2. edición núm ero 13. lo que indica que ésta es la edición o '‘lan za­
miento" núm ero dieciocho de ;a versión 4.2 de ncurses. Los núm eros de edi­
ción son em pleados por los productores de softw are p ara indicar cuántas
veces h a n construido u n paquete especifico. Los núm eros de versión, a su
vez, son establecidos por el encargado del m antenim iento del paquete. Cada
archivo de especificación consta de ocho secciones:
) ) ) ) ) ) ) ) > ) ) ) ) ) ) )

456 Programación en Linux

• Encabezado: la sección encabezado contiene información re to rn ad a por


las interrogaciones del RPM. tales como su descripción, versión, ubica­
ción del código fuente, nom bres y ubicaciones da los parches y el nom ­
bre de u n archivo con iconos.
• Preparación: la sección de preparación 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 construcción del ejecutable G eneralm ente, esto
e3tá lim itado al desem paque del código fuente y a la aplicación de cual­
quier parche que pueda existir.
• Construcción: ta l como seria de esperar, la sección 3obre construcción
lista los comandos necesarios p a ra com pilar el softw are En la mayoría
de los casos, este es un solo comando raake r pero puede se r ta n comple­
jo como uno lo desee.
• Instalación: otra vez, el nom bre de la sección h abla por sí m ism o La
sección de instalación 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 instalación del softw are luogo que aea com pletada exitosam ente
la construcción.
• Escritos do m stalación/dosuistalación: estos escritos, quo son opciona­
les. son com do3 en e! sistum a del uauario cuando el paquete es uiatala-
do o eliminado.
• Escrito de verificación: babitualm ento, las ru tin as de verificación de
RPM son suficientes, pero si n in g u n a de ellas satisface su s nccesida
dos. e sta sección lista todo» Ion comandos o usen tos de interfaz quf*
com pensan lúa limitaciones de RPM.
• Prolijamicnto: osta sección ad m in istra todo p ro lijam en te post-construc-
ción 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 instalación (un RPM no se
puede construir sin dicha lista), e sta sección contiene una lista de los
archivos que forman su paquete, establecí* su s atributos de archivo e
identifica 'os archivas de coníiiruración y de documentación.
ANÁUSIS DE UN ARCHIVO DE ESPECIFICACION
El ¿iguicnttí archivo do especificación está Lomado del paquete do d istribu­
ción 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 especificación es el
encabezado:
Stmcary; An x display oí tn« Ear’.n fro® «pace.
Vine; xaartn
versión: i .■3
3«laase: 12
Copyrififtt: HIT
Group: ¿TiüSBnei'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/t«o.'xaarth-roct
) ) ) )

Casííuio 21: Distribución 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 Scítwar.. Tía
•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 sección de encabezado. Tal como se puede ap reciar se


provee m uchísim a información, la cual puede ser obtenida desde la base de
datos de RPM em pleando las potente? capacidades de interrogación de
RPM. Tanto la información sobre el nom bre como la de I0 3 núm eros do v er­
sión y edición afectan de m anera d irecta el proceso de construcción.
La siguiente sección de un archivo d e especificación es la de preparación
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 socción de preparación 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
código fuente virginal. Eso es todo.
Bueno, la situación es realmente un poco más compleja. La línea % 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­
trucción (si es que loa hubo), descom prim ir y extraer el código 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 extraído y sus correspondientes archivos.
Esta es ¡a m anera más 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 mayoría de los casos al comportamiento predeterm inado es lo
que se desea y todo lo que se necesita.
Luego de la sección sobre preparación viene la sección de construcción La
m ism a d eta lla cómo construir el p aq u ete de software:
%OuílO
UKT
U>(
La sección de construcción 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 códigos retornados p a ra cada paso, abortando la construc­
ción con u n m ensaje inform ativo si ocurre a lg ú n error.
458 Programación en Unux

Despues de h ab er construido el paquete, el lector probablem ente q u iera in s­


talarlo. La sección sobre instalación provee la información 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/v»nC0nf iO /*o artn «SOF
« e arth nane *x«artH *
< 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 preparación y construcción, RPM tra n s ­
fiere cada linea de la sección Instalación 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 bién I n s t a l l , i n s t a l l . man, y códi­
go personalizado de interfaz que tom a a su cargo los detalles que sean espe­
cíficos do osa instalación en particular.
Después 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 construcción e instalación. De e sta t a ­
rea se hnce cargo la tección de prohjnm iento.
>ci«*n
rn r f JRWI aUIlOJXXJT

Dicho de m anera m ás precisa, la sección de prohijamiento so aseg u ra que el


directona de construcción 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 especificación (con
sus comandos, en realidad 1en caso de que hayan surgido problemas. Habi-
tualm ente no se requerirá del empleo de e sta sección si uno se atiene a los
procederes predeterm inados de RPM.
La siguiente sección es la do archivos:
vrilss
S a o 'a ttrj-.ro o t.ro o t}
/usr/XtiflflíBln/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 sección de archivos consiste de ia lis­
ia de los archivos que constituyen el paquete. Si algún 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 documentación o configura­
ción que se a requerido.
Capítulo 2 1 : Distribución 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
!¿=^ El siguiente comando construye tan to el RPM binario como el RPM de códi-
go fuente de x e a r t n
C J IM P I O
*FL9 J 03 fu » r /* r í/r * n tf $ ? tC S

S *90 -M « » » r t n -l.© -! 2 IS K

;i*cu:isq:
sIlT oa lu i « 4U»t!»»Ull«d •IÍU*r'*MW/liO/X!WCWftO
■JCC -02 •
- - O lln » 0 _ l3 « e _ _ •C .?C JIX _ C _ S 0 U * C £ * 1993 *9 1

- 0 .9 0 S IX .3 0 U » C € O J Ü P € S _ S O j S C £ '4 M !. 0.3SO_SOUfiC6

- C ^ S V lO .S O J ft C c O TJSCPflO rO -15 OMAMOWPPOTa

• c i * t r » f l .e .a t u r i n . o

P ro e m io «Mita
Finai.'tg ara»ia**..
FirtiTQ rtsu íre i...
¡UQUÍT33: 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 )
-i¿a*.ic.5{a<.:BC_2.ii
• to tí: i -j s 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 í: 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

í x s &j Z w ; : S c le 3 r

£1 listado se encuentra abreviado debido a La ¿-^tensión de la salid a generada.


Si todo anda bien, uno term in ará con un. p aquete binario, / ’J S 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 equivaldría ¿1 equipo del
usuario,-, instálelo y compruébelo. 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 f )) ) f ) í ) ) J .1J í ) ) J J . ) 1
460 Programación en Unux

5i, por el contrario, se p resen ta algún 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 construcción a ñ n de identificar y, en principio, solucionar los problemas.
Ei siguiente listado contiene breves descripciones de las opciones disponibles:
• -&C: Valida la sección de preparación del archivo de
especificaciones.
• -bl. Valida la lista de archivos p resente en V f i i e s .
• •b e : Lleva a cabo u n a preparación y u n a compilación
• -b i: • R ealiza una preparación, u n a compilación y u n a
instalación.
• *bb: Efectúa u n a preparación, u n a compilación, una
instalación y construye sólo u n paquete bm ano.
• —s h o r t • c i r c u l t : A ñada este argum ento a la línea de com andos pa­
ra en cam in ar la ejecución directam ento ai paso
de construcción especificado (p, 1, c. i . b).
• - k e e p te m p s: Proserva loa archivo? tem porarios y los scriptz
creados d u ran te el proceso de construcción
• —t e s t : Realiza un sim ulacro do construcción a ñ n do
m o strar qué es lo quo so llevaría a cabo (tam bién
ejecuta - - k e e p - te m p s ) .
Después de h a b er solucionado todos los errores, reconstruya el p aquete u tili­
zando la opción ■D a, cargue su program a a l repositorio, y dispóngase 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 cómo com pilar program as, ha cubierto diversos
temas referentes a programación, conocido num erosas interfaces de p rogra­
mación de aplicaciones y cubierto brevem ente la inm ensa cuestión de la pro­
gramación p a ra redea. Le han sido tam bién presentadas algunas utilidades
de programación esenciales, tales como RCS y gdb. Con el fin de re u n ir todo
este m aterial en u n a sola aplicación, el próximo capítulo lo conducirá a tr a ­
vés de la construcción de u n a base de datos p ara CD de música
) -)
) . )
Proyecto de programación: una
base de datos de CD de música
El capitulo 3. 'A cerca del proyecto’ , le b n n d ó al lector un somero recorrido
del proyecto do program ación que so com pletaría al final de cato libro. Bue­
nos. ya hemos arribado al mismo. D u ra n te el transcurso de los veintiún ca­
pítulos an terio res e l lector ha ¡do ap ren d ien d o mucho «obro la programación
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 pequeño 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 capítulo cubre los siguientes tem as
* £1 código fuente completo do los p ro g ram as que sntegran ¡a base de d a ­
tos de CD musicales.
■ L'na explicación d etallad a de dichos program as, modulo por módulo.
• S ug eren cias sobre cómo 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.
y j ) J J J- ) i ) i ) > > f J J > J

464 Programación en Linux

Ei código, módulo por módulo


Tal como se lo mencionó en el capítulo 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
módulo de ayuda g e sto r_ d b _ c d m .c . P arecería razonable, entonces, dedi­
carle algún tiempo a exam inar el módulo de ayuda, porque el mismo hace po­
sible la funcionalidad de ia mayoría 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 interacción e n tre la base de datos y la API de baso de datos
Berkeley. El archivo de encabezado y el código 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_
¿incluís <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 n u ll,
c o n s id e ra r /juo
• ic s m n o » a b r i r c d jt u s ic a .d b uCiícaiio 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 c o rrie n ta n o n te a b lo r tu S ;»n p r«
r o to m a r 0 .
•/
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 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
v a lo r da
• 6 u f_ c la v d o srrn o an :o d os l o s dan as ca 3 0 5.
V
/ J ) ) ) > i ) ) ) 1 J ) ) ) ) ) )

Cac^tulo 2 2 : P royecto de program ación 465

ínx * li* in a r_ rtg (c «a r • V j'jU v * ;

• sacor.-jr iterati#ai6n;e La zi-s :s S itos. ouscanco jna clavo cuyo valor $«3
igual 3 i i=
• 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 ix z a t d« íatos *1 r t g u t r © cuya clav» $<a igual a la 49
txrfjrLave.
• : ato**ar ® s i t d i m t t u w / almacenar « l corríspandisnt* valar or la
varU&it valor,
• r « ; o - n r : •? ¡J clave Ocscsca no se ercuer.tra, y arrno en todos la* d M U
C8SC5

•/
i r : r*cup«r*r_r#g(char •6«f_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 tárenos *xito ratornar «1 nunaro d« rogístroa
« iM e w rtoa
• «1 fivrf clava y Bc?_valOf. R etam ar i n nc existan re g is tro s e is o o n io la s . S i
f r u ijw i,
• retam ar errno.
•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 ocasionaría
que g c c e m itiera au-Tíic-scias o erro res íobre variables o funciones que es­
tá n siendo redeñnicas. 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.
4€6 Programación en Linux

U na lim itación 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 patrón DBT; esta dependencia puede se r resu elta haciendo que
estos parám etros sean sim ples punteros a cadenas de caracteres.
A continuadón. la im plem entnción del ad m in istrad o r de la base do datos:
■ • d «¡ crograma en Internot: ircdds.c '!
r
• <j05tor_db_:dn.c - AMúnistrador 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’

i t i t t c 00 ‘ tía; / • Pun-.ero g io u a l do o iu e a<> d ato» •/

ím <3rir_dtj(c.iar •ruta_íCCMOjJb>
<
in t walor_r9tortiaúc;
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_:icc«íO_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 = .i3Ílac(striei'|ruta_pcr_deTeoto) - ?|) 1= NULL} {
itrcpy{ru:a_accosc._30, ruu_cor_defecto>;
> s is e {
return - 1 ;
>

vaior_'5tornsco = ct_ocer.'ruta acceso fib, DB 3T35E, ce C3EAÍE. «S M , muu


NUU, ic5); "
i f (vaLor_ratonaM l» Z) {
ráturn vaior_retoHja<Jo; /• E— or ra:ai
>
"«tur-i 0 ;
Capitulo 22: Proyecto de programación 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
. . . •)
2 3 - > s y r.c í0 3 , a ’. ;

í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;

r 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 , p«ro funciona */


c ln « .4 n i • oyr_ci»v*;
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 , OajvCOVEíWUTEÍ;
i?(*»Ior_r*To.-nado =* i»_<Ff5x:5T} !• Clava ya axist* '!
revjpfl 1;
» Í J I ;'(v*l3r_.*í:cí-r-4C^ !• 8) * •Ccurno .HQun otro tiao ae srror ‘I
r « r .-f l «al;-_r**3ríi*4c;
33->s>-;(32. í ; . • S in c r s n iif ia 32Sá 2= catas •/
retUH» í ; * «ita . •
) ) ) J ) ) ) J > J ) J f J ) J ) J J
J: J J J
468 Programación en Linux

w t «li«i-E r_ r* g | c ria r ’ buf_clave>

{
iflt v3lor_r«torn3do;
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 tíc • CO ->i?lin inar_r«g(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_r«tornatíc;

)
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; /• Copiar aqu: b jíjrla v o •/
08C *cursor_ilo * NUIL; /• 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) { Algo anduvo naL •/
r#turn v*ior_rotorr.3do;
>

In ic ia liz a r 09T clave; considerar quo 'v a lo r- ya 3e encuentra L iic ia llíja c


V
(T«nset{4clave, a, sizeof(D aT)};
clave.data = 2uf_ciava;
clava.size • strlaníbur_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' {

L
Capitulo 22: Proyecto de programación 469

f
• Este t i íeiicaáo. 25 no alnaesna ;3£?-33 teramatfas en n u il 0 9 o cero
o rnaría),
• c a ooco 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 cacaría 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 ) ) {
iíf c U v t.s ite = str;*nie<jf_cla/9)| { /* Coincidencia encentrada */
crea*;

)
)

I ' C5*í'ji*;t áe lar^c o encantrmca una coincidencia"? •)


itív 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_retorrj«5o;
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.:la»e-
clave ; : : e • »trlen(6uf_cU ve>;
• i*r ai podeacs seterer e l "► jistro 'I
<aior_‘ etor«ad3 » e6->recup«rarj*0fl(a&. N uil, 4clave, valer, d );
j« it e a ( valer j ,etc,,'tsfi3i {
case » : I ' Ojala •/
retum •;
c a s a ajuOTrOW O; / • C la v e r s en contrada •/
■*eturn 1 ;
csfault: /* E r ro r no «re vis to •/
rrtu m »ilor_retcrr.ado;
) l m trj¡ riltc ft •/
Programación 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^ttarírado * ob->curjor(co. v a l . X curaorjm );


xffvalor_r«torrado l - 0 j
return valor_rotornaoo;

(• I n t C U llío r l a s 08Ta •/

< M M «m c líV fl, I). *íi#a#(ü8T));


M R M t(4 v iia r, a, Si:B 0 r(R 8 T ) ) ;

« M l# (< C U rW rjJD >C_r«CM#r«r r w f w r i o r dO, i c l l V f l , J v a lo r , 00 VFXTi ¡ •


Oa.NCrFOWtO) ( ‘
•*con;«tf;r;

raturn cantador;

u u lis ra r_ ríg 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_-atoríiadc = 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_retarí»ada)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 programación 471

•* 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)) :*
o b jio t p ü u w i {
3a-»*»Cu»ii-jr_i-«-j{;s, vuu.. tólave 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 50«ta«0r;
i
E ste código 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 ó algün otro tipo do error ajeno ni sia-
tem 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_CR£ATE hace que s« cree la buso do dato s st te ta ya no existiera. Ade­
más. 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 función db -> C lo se debería 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 explícitamente a
db -> sy n c por La¿ dudas. De hecho, como medida de precaución, 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 bién llam an a db->sync.
La función 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 tendría primero que
elim inar dicha registro, y luego volverlo a agregar después de efectuarle las
mcdificadones que fuesen necesarias U n a fundón que actualizara un registro
existente sería una excelente adición 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 interrogación. 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 ter-
m 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. Después de que se encuentra
una posible coincidencia. e! paso siguience consiste en comparar la longitud
áe la cadena de búsqueda ron ia longitud; de los datos presentes en la base
) ) ^ ) ) ) ) ) ) ) j ') y ) y ? ) J )
4 72 Programación en Linux

de datos, que se encuentra alm acenada en el miembro s i z e de la e stru c tu ra


de patrón 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 válida.
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 3er-
keley 08 no m antiene u n registro de cuántos 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 má3 sencillo
im plem entar la función 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 núm ero correcto de punteros a p ares clave/valor. Des­
pués 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 bién 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 válid a h asta
la siguiente llam ada a cualquier función 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 función 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 función freo
pasa a 3 e r responsabilidad del program ador de la aplicación.
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 desaparecería después de que
term inase la función porque am bas son variables autom áticas que dejan do
'e r visibles {quedan fuera de alcance) cuando term ina la función, 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 co1 orearan » nn in t e r n e t : n c flu t ll.h */
r
• 'jtKisadMjJO cdw.n U t ilt t y fvnociona ror miste CO dotabas® oragran.
•I
«Ifntí## urtLtOAO£S_OB_COM M_ ,*• Protección contra r .u itic l« inclusión de el*i»or.;o6
igualo» •/
« e 'i n e UTIl.:aAC£SJ»_COMH,

/*
• 0 Dt*n*r ana cadena para asignar a una ‘ clave1 a a un ‘ valo r1
•/
int db_cau_ijítstr(cnar duí|], Lnt ionQitud);
íenaíf /• ut:li¡^ii6s_O0_CCM_M_ 'I
Este segm ento de program a declara u n a sencilla fundón para o b ten er una
cadena de caracteres ingresada por ei usuario. La defm idón 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 oíse de catss de
CO 3e nusica
•/
) ) 1 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )

Capítulo 22: Proyecto de programación 473

Jir-clud?
*If!Cl'JÍ« <St'í¿C.^>
#irtcU*Je < j?ai;3.r»
firalufie *at;i:3i2e3_:;_caa.ft’

a ii- y ? T¿ÜMÍ0_3U? 102*

iiít «J_cd*_gttnr [citar s«jfn. í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 código 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 inválidos o tran sfo rm ar Ion dato» válidos « un for­
m ato que pueda procesar su aplicación. A continuación 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 programación oara que puetfao se/ reutliteadas en diversos
croy&ctcs.

✓ _í cresoJo de fcoiicacas ae Díogramac-'ón se trata <?n detsuie en ei capitulo 14. 'Creactón


1 uttiraoftri ce ojotottcft* ce programación/
• « i p r s g ra a a «n I n t e r n e t : « c d c l i . c */
/•
• : L i a :' 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> /• ? a n * « « t •/
safe <anistd.ft>
n rc la tfe <;«toot.1» / • Para getcpt »/
474 Programación en Linux

ílnclude <s-i-trrg.h> r Para '««iicpy' en glibc 2 . 1 . t


«trclude , ge3*<l^_dt_cdl^.h• /* Administración ae aasa <J« datos '/

itfqfi^e 'MVÚQJUF 1024

voia noco_a*_mr5:eo(vaío);

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 ; / • oe < g m o o t.h > ’ /
axtcm tnt optlnd; /• Oo <gotfrpT.n> •/
CST valor;
Char ••clavos, "v a lo r# »;

lí(a rg c < 2 ¡¡ argc > 4) (


Wd0jld_«n pla 0 { ) ;
>

opción * g*topt(ar¡jc, argv. * »:# : 0 : r : l ‘ ) ;


if¡a&rir_db{MJLL} ” I) { /* A b rir la oaso a« aatos •.'
.outif'error a i aor-.c la base de da tos');
>

3»iccfi{opclon) (
ca$e a‘ : /• Artauir un regiatro •/
/* ?ero no artadir jn registro vacio u ana clave ce longiruc cera •/
if(argc = * 44
loptarg MJLL) 44
(strlen{opta."g> »= l| si
<argv(opund| 1= MjtL)| {
valor_retonado * aradirj-egfcptarg, argv(opt¿nfl|);
if(valor_ratornado == t| {
p rifltf('C la ve’sá' ex iste\r‘, optargj ¡
5XIt(EXIT_rAIl.UR£J;
> eisa íf (vaicr_.-e:ornatlo < i ) {
perror( ‘ c lie n te jjc n .c : añadirj - e g ') ;
**it(EXIT_FAIUJfiE|;

>
» f I i

Caoítuio 22: Proyecto de programación 475

orí»x:
* (

>
c*m 9": f un r«gtscrg •/
if[ * r $ c — 3» (

iffO O ttf<¡ 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(y«lar_r«»orp.»<Jo < « M

M « (e x t T .F A :u « j;

>
OTMfc;
>

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 U«OM 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 t t o i n 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
. . / / y
Programación en Linux

) a la s {

n o C c jJ e jjn p le o {);

}
case ’ r ' : /• Recuperar un rg g is t.-o '¡
t f ia r g c *« 31 {
: f( o p ta rg i - NULO {

a e .T se c (iv a io r, ®, s iz o o fíO 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 -== 1 J {

p rín tff'C la ve '^ s ' no encontr3 da\r.\ optarq);


exlt(EXl7_FA:LüHE);
} 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 {
*oiío_dajmpl«a|);
»
caso I : /• Listar todos lo» ragistros •/
tf(* rg c — 2 ) {
if((co«taoor • contar/agsO > « 0 ) (
putsCMo «u s té n rogistros on esta Oase tía 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 ofÍC 6T •) • contador)) =» N U IL ) {


puc3(*cl¿ei»te_c<!n.c: n a llo c c la v e s * );
<Xlt(eXIT_rA!LURE);
>
lf((valores 1 tallecí sizsoflMT •) • contador)) — NULLI '
piit5(*cliente.«In.c: tóíIoc valores*);
exi:iEXlT_FAlLUREl;
>
Capítulo 22: Proyecto de programación

• ? 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(TAíW Í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
<al«r_r*t3rrt3i}3 = IiJtar_r45S(CUv«5. v íla rfS );
;f(r*lor_r«WP«aao »■» 9 ) {
C«-.“o r ( , c l i 8 P : ? _ c c a . c : l i s t a r j " e g a *);

« * it ( S Ü T / A lL U 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 , c la v a * ( i] ,
( in t) * t r l* o ( v a lo r a » ( t | ) , v*icr«*£ i 2 );

>
&r«ik;
» #1M {
o c o a _ c « .í* o U o ( j;

i
3 « f* u it: / • Opción 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 )

{
PutífUCOO OS at?'-£0: cliar.t«_c«3n \
\ 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
Programación en Linux

\ n \ t { 0 <C léve> {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_FA»tuq5|¡
>
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
línea 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 opción 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 opción -1 no requiere ningún argu­
mento porque sim plem ente lista todos los registros de la base de dato#
Uno mejoru úti: n este progrumn podría s e r elim inar el lím ite establecido
para ul tam año del buffer ostñtico un •*! caso de la apuración 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 código en cues­
tión 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 );
}
l f ( | v a l c r » » ( ‘. ¡ « nallcc|TAUAÁO_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 porción de código es aceptable porque


resulta difícil im aginar el nombro de un in térp re te o el titulo de un CD que
pueda exceder el tam año 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 cuestión 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 aplicación determ inada.
P ara analizar la linea de comandos, el program a utiliza la función definida
en POSIX g e c o p t. declarada in < g e tO p t. h> {también se debe incluir en el
Código fuente < u r u s td . Í1 >), ta l como sigue:
i r : ^5tM r(in: arpe, citar ‘cons: ar^vf], coost eflar *aostr¿ng);
E n esta declaración, a rg e y a r g v son los parám etros a r g e y a rg v que se
transfieren a m am . igual que como se lo hizo en capítulos anteriores, ge •
t o p t espera que cada opción sea precedida por un guión i», o p t s t r i n g
contiene una lista de caracteres de opción válidos. Si un carácter 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 programación

Por 'o tar.to. ol parám 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 opción pre­
s e n » ea la línea de comandos y retorca el carácter correspondiente (a. e, fc. r
o i 1 o EOF si no existen más opciones. Si una opción 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 número de argumentos do lí­
nea de comandos que recibe y luego utiliza g e to p t para determinar la opora-
c ó n a llevar i cabo y los argumentos correspondientes, si fuesen necesarios,
p a ra dicha operación Cuando termina de realizar la validación 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 práctica lleva a cabo la operación requerida
C ada operación posee su propio código 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
vacía y el valor aaociado con dicha clavo e li m i n a r reg , ti su vez, necesita
sólo unu clave que no sea nula. Esto último requerimiento también se aplica
a b u s c a r_ re g y re c u o e ra r_ re g .
Obsérvese que tres de las sentencias c a s e - b. r y 1 - utilizan una varinn-
te inusual de la sentencia p n n t f :
srHUfC'-*», (int) v*ioe_%a«rioo. {ciar iac«na);
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. Además, resultan necesarios los cambios provisorios
(caats.i de a p o de objeto porque el miembro s a o de una estructura de patrón
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 serán impresos;
b) este especiñcador de tama fio de campo, a su vez. debe ser una constante nu­
mérica e n tera o una expresión que evalúe a un valor numérico de tipo i n t .
Si el especiacador es una constante numérica entera X. el ancho del campo
im preso será de X caracteres, como en la siguiente expresión:
arÍ3T-{*% * s t» \ ca«<r,i);
SL =r, cambio, el especiñcador es una expresión que evalúa 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 expresión 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 expresión numérica 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 carácter
J ] ; y l ) ) ) ) ) ) ) •> y > } } ' y }
480 Programación 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 espués de llam ar
a C o n ta r _ r e g s , el program a prim ero asigna el núm 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 recién 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á diseñado para se r utilizado
desde un scrip t de interfaz, de modo que lleva a cabo u n a sola operación y
exhibe su aaiida de m anera sencilla. Se requiere de código adecuado de in ­
terfaz p ara form atear tanto su en tra d a como su salida. Tenga tam b ién 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 Sina-
t r a ' y ol valor “G randes éxitos", la invocación correcta seria:
5 ./cH*nt9_cxfm -a 'Frank Sinatra* •Grandes oxítos'

Luego de llevar a cabo la oporación requerida, c l i e r .t e _ c d m .c cierra la ba­


so de datos y salo. La función m0 d 0 _de_ em pleo le recuerda al u su a n o cuál
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 código fuente so lista a continuación.
r sorar.* .joi orograna .»n Intrnw t: rtcdscr.h •/
/•
• ztn p a n ta lla .i - fluttna» do n*no¡o do pantalla para la baso co datos 3* CO
n u jic a líí
•/
«ifndo? CCW_P4.SUl.U_H_ r Protoccion contra nultlp lo inclusión de «lM tntO k
IqusUs */
<d«rin« cmj>ami>ulu j\_
íin c lu o t « c u r m . i »

/•
• 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
• (ft«Jtrazar la pantalla prin cip a l. No se retorna ningún valor.
•/
vaio :ra 2 =r_pantalla(void¡;
i ) ¡ ) ' ' ) ) » > í / ; i J L & J ' )
-t;V
Caci'.ulo 2 2 : P royecto d e program ación

r
• £xr¡:&ir ¿n ososaj» ac La linea í s esTaío.
*/
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.

•(
ro¿c pr#p*rir_vefl»ana{wwOQw *vtmasia)r

/*
• ?refiarsr ur-a ventara oara ser vuelta a exhibir.

•/
v e is ae»trar_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 a«r tlu in a tte .

V
fO-.C •Ufliííar_r»g{cr'ar 'Dcif_cl4v«)¡

r
• OCterer la clave ee un reg-srro ; » r a buscar.

•/
vota c«scar_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 Programación 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 código 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 bién la modu-
laridad porque, como ya so mencionó, siem pre y cuando ia interfaz definido
en el archivo do encabezado no cambie, el código que im plom entn dicha in ­
terfaz puedt! se r rescrito cada vez que sea necesario. Hübluodo de implemen-
tacrón. es ju sta m e n te lo que se verA albora.
r to&Ore del orogr.vr.i ->n Intorni»t; 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 ; r 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 INüO* ‘ statuBW in; / • 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
p r in c ip a l */
wl.tOCM •v e n ta n á _ c e ^ t"a o a io ; ¡ ' Zor.a de e n tr a d a /a a ia c a de la ven tan a
p r in c ip a l ' I

mt L aicializarjiafttallíím 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 programación 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 , e**y • i , »>> ** V JL L ) (

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 ;

)
/* Sc5-«er,tarj 3or^3* ti*n« laca.' «t lig r u s y ia aalM» a« 0a:o9 •/
ií((»»-ta*a_í«_tratajo • 3er»Li(»?ajsr, «axy • 2, nxx, !, I)) »- NULL.* /
a t r s r r : c a jiir . illi. t ; rt* ? » M _ ftjr « a ¡c M ;

r it y r * •»;

>
/ • C c ^ ig y - a r « i t e c la d o •/
if{c& r* u< ) •• ifW j /• ?rocejar*roi l i entraca c» d ito s noiotros V
r» ttm •»;
: f ( k « r P M ( » íjf c r . nu£¡ .« e m j /• H a t n iit a r « i u n clo o o* c ia v o a - F •/

r* tu m - t{
i f i n o f o s l ) — £1W) /• Controlar la ja ltd a a* dacoi nosotros •/
r* tu rs - t;

r * t u r r «;

>

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¡; / • L¿M rj.- la s ste v e n ta n a j • /
« i» in (s títu í» 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 •»

v o ic tr a f jr _ p 4 r i'5 iia iv u ia )

era.- - t r - , - •r2-A i.*3;i- ^ l-E Ü B i'.ir r-i-Si;3car FS-flecuperar C5 -L is ta r


rie -S a lir* ;

r A E fin v iK ftW , 3 * . ’ V i‘ , "Kru; ;


y ) \
) ) ) ) ) ) ) > > ) ) > )

4 8 4 P r o g r a m a c i ó n e n L in u x Capítulo 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 ¡ vaid 9l¿aisar_ reg {ch ar #6'j'_cLava)


re ? r* $ t-(); (
> 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: ' t«grese c ia v * •);


w ;et 3tr:»arttarta_ 3 «_t>'3 bs 3 0 . 8 u f _ : I a v s |;
(
p o stra r jrtírtar* a(v afitan ají* _ írab aio |;
w e P 3 5 9 (s ta tu a * ifl> ;
i
nv«printw<9tatus»ir., o , 8 ' S s ‘ , nonsaj e);

wrefrashtJtatuawln);
ve id <J<tf«ar_res(Cftar *Buf_ciava)
r« fra s h ();
{
> :rt54!-a.-_.«*íí4.--.a(v«ri:ar;s_i9_:rj6aj'j);
«'r»p<-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 r«t< clava*);
( ■ gatatrfvtftí«na_í*_tna«:o, 5 « f_ c la v e ;;
* en m (v«ntana); sk5Jtr»r_nntar4( »ar.:ana_3a./f abalo);

o ch o ();

>
veis *c*:r*.-_r*$«nar •D ufjcU va, cn ar •Duf_valor)

*otd nos:rar_vonuna{»it\C(m ‘ ventana) (


•eraMivent»na_d*_:."ioa}'jJ;
(
nv»crint»| «•'".:ar.t_a*_:raoajo, 1 , *, *INToaPREfE: «is- , buf.oiavc);
n o o c * ia ( |;
*v»o.-int»<var.tui4_3«_t-'iw|o, 2. í . TITU LO : S i ', ouf_valor|;
«rrafratinlvontanai;
•o*trar_v*fltana(vantaftaj5t_traftajo);
ra f ra v i{);
»
)
«oíd lU T *r_.*^j{cflar • 5ur_cU v«, zt\tr • tw fjra la r, m t contaúor)
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 , ligol«nt»_y;

3reoarir_vantara(veo:anaje_traD aJo};
aw o i‘ Uttw(vM:ana_de.>traoa]o, t,« , 'INTaflPRETE: •>; ¡e » iiV « y»ntana_5 « _ tric a io , i u i y , aaxx);
if(c o rta c o r — • ) «;
nansa]a_a_ust:aria( 'Ingrese c la v e * |;
«eras»; * *ntira j s a . t r a c a j a i ;
*fl«ts:r(van?ana_3e_tranaío, su f_ cia v a ) ;
BvW‘ Iü»(v»nta fl«_3a_trifia io . ccntacar, 0. ACS_HLINE, xaxxj;
avwoPlntvr(ven:ana_de,trabaio, 2, vj, ‘ TiTiiLO: *);
rrtpriflT»(ventana_de_trao»io. ccntaacr t |, e, •¡NTeflPRETs*);
nenaaje,ajjsuarxo(*Ingrese valor *I ;
lywírxnT» 1 ventar,aj » _ : r asa) a, ccncsccr • 1, eaxx / 2. ‘ TÍTULO*)¡
*'gnstr<v9nuna_a9_tr3Da¡a, ouf_vaIor|;
s w “,lire (ve r:a n a _:e _:ric a jo . contaccr - 2, a, ACS.HLI.'tE, uaxx);
w«par_ventana(vantana_de_cracajo);
i
) siguia ite j = :c-r.*=:•:: - 3:
Program ación en Linux

BWjrirTw'víntanajJijjrabaio, sifluienT9_y, o, *Hs‘ , &uf.clav«);


nvwcrinrw|v«itana_ce_traoijo. s¿5ut*nt9_y, saxx i 2. ’ V s*, auf_valof);
Tvastfarj/^ntanafvflrttana^c^tracalo!;

vold r#cup«rar_reg(«!»ar *huf_clav9l


t
0reparar_ventaflí(w itana_fle_trab 8 |o ) ;
itv*Brint'»|v?otana_C9_tfaEajo. t, », 'INraRPflíTf-: »);
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 módulo 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 subveníanos utilizadas a través del programa y establece un estado del te-
dado que sea amigable con las ncurses. 'l\ü como so lo mencionó en los Capitulen
11 y 12, la mayoría do los problemas que «mplean ncurses deben interpretar la
entrada do teclado de m anera directa (sin intervención del kerael), y de ahí sur
vje la razón 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 espocílicamunte. Las subventanas que son creadas sim­
plifican la administración de la pantalla. Como se verá enseguida en el progra­
ma controlador de panUdlu, ol manejo do la enerada y la salida vía dos ventana*
separadas hace quo el retrazado de la pantalla sea mucho más 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 'co-
cdo* (cooiicd) y cancela los recursos de memoria otorgados a las tres subventa-
nas. Finalmente, esta función 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 condidón preexistente. t r a z a r _ p a n t a l l a simplemente
exhibe la pantalla ¡nidal que verán 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 informadón 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 inistradón de venta­
nas. preparar_ventana borra una ventana y activa el modo de envío de
caracteres 3 pantalla, hariendo que las pantallas que contengan datos ingresa­
dos sean fáciles 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 también stdscr, de modo que cual­
quier cambio qua haya sido efectuado quede reflejado en la pantalla del usuario.
Las funciones añadir_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 fundo-
nalidad necesaria p a ra añadir, elim inar, buscar, exhibir y recuperar regis­
tros individuales, respectivam ente. Las m ism as transfieren datos recupera­
dos d«sde la base de datos a la p an talla de ncurses. I-a fu ndón
l i s t a r _ r e g s merece u n comentario especial. La m ism a e stá diseñada p a ra
Csoítulo 22: P r o y e c t o de program ación 4 8 7

exhibir todo? los registros de la base de dato s (comparable a ¿a opción - 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
ningún registro h a sido exhibido todavía, 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 aería p erm itir desplazarse por la ventana
de trabajo si el núm ero total de registros a 3er exhibidos excede el número
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 continuación
/• xene'* 5*1 £T9griM «fl in c # r'Jtjjs u a r;o j:tíB .c •/
r
• ir<t*rfa:_u*v«rio_:o».; - Contraíaisr dt 3a*« 5s cato» Je CO a .» :c a l« bisado
en " t u r t a i.”
•I
H-KlvH <»tdli0.f-> *ar« ««te* •)
<*nu:d.f>»
•wclyc* «-getoot v /• »»ra ’oetopt */
» ;n c lu C * < ! tr in g .f t> r* »ir* *eacov «P « lib e 2 .1 .1 *1
* trK J w ti« • 5 « it5 r_ d e _ :< ja .T « a m u tra c io n de oa»e 3» d a to * *f

# ir .c li* J t • • c d K r .r » * /• Y a .ie jo de p a n ta lla *í

K ttlM -t2*

v o id pcoo_ 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*_valdfITAHWÍ0_9UF|;
zr.ir ••✓ a lc r * » ;
06* v a lo 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» espcciíicada •/
cociw* = íefcot(iPjc, argv.
lf\COt'.Sn a T I f

i f i c o r a n ; — * X .l ) {
•Odo_de_««pÍM(J;
> aisa t
/ ,»
« i i \ / J * J J J * -l
, J , ./ > .> ) > > > J > J J • J '
4&8 Programación en Linux Capcíuio 2 2 : P ro y e c to d e p ro g ram ac ió n 489

íf { a b r ir jjb (o p t a r } )) ( 3las
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 tía to a % s \ n \ o p t a r a ) 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 íí ;
} C1Í9 <£v _":3 i : ~Z: E lia in a r un registro •{
} 9 l i * ‘ r a r _ r s g ,'b u í'_ c lz v í) ;
> r ? i ; f l i - a r _ - í 5 i a 'j t ,_ c l3 v o ) :
bn jafr; i? ( vale r_re tomado > 9)
a s o <: / • U t i l i z a r l a o ase d« tíatos D redeterninatfa */ r-3CM :*_3_jS'.arior'::379 ra ^reentrada*);
I f fa b r ir _ d b ( V U L L | ) { ?1í « ií|v3 lo r_re tcm a íc < a>
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 * :- ; o*r.*aj «_a _jJuario (* Tuve lu^a-* error no a riv is to ’ J;
exlt(EX IT_rA lLU R 6>; 9 l«
} B tr.s4T«_a _jS 'j»rio Cil *?gis;ro ha J i t í o eliBÍnado*);
Onjak; br«a<f
d a f a u lt : /* 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 */
H CdO .Í8_ffl0l«o(i ¡ íys c a r_r«^(O g '_c la v «);
á re a * :;
3 ? flIlt(4 v ilO f. 8, U Z »5Í|C 8 T!J¡
\ r fw m an bioqut do m u cu -i valcr_r*tcrnado • ouJca.-_rea-'bv* _clav«, ¿va lo r);
if(vaior_re*.om*do > oí
¡ ' coron.’ a r n cu rse s V B«r.i4j*_i_gsuapiorClav« na <nccnt*»üa*|;
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 */ ♦lia i t (valor_r«tc.*nadc < a)
B u t i ( ’ € r r o r »1 i n l c u l k a r n eu rita s*); nflnj4ji_i_u»uar:3(*'wvo lugar « r re r no p r m s to * ):
c # r r a r j» < ) ; •Isa (
axitíEXir.FAILURE); 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.-
y F r a M r l a p a n t a l l a i n i c i a l */ a o s t r a ^ r e g p u ^ c l a v í . b a f jf u L o f ) ;
tra z a rjja n t a lla O ;
>
sreai;
/• t i laio principal do ccfl-andoa •( :aja KTr_F(5) : * F 5 :- «ecup«rar un registro •/
wnila( ( Tk«y - fl«tch{)> I* KEY_F(1©}| { .-*cue*rir_r*g(buf_c¿ave);
jw lt c h jf k a y J { M*set(*Valoc. « , s:«<sf ( 0 8 T ) ) ;
C158 ¡<EY_F(2} : C F 2: A ñ adir un r e g i s t r o */ /llar^rítornaas = recuparar_.~«$|büf_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 ¡; i f t v i i a r ratom ado > ai
v a lc r_ ,-a to rra d a ♦ aña 2 i r _ r e g f 6'j f_ c la v o . C y f_ v a lo r | , aer.ss33_4_J8uarioí ‘Clava no e rc o n tra c a " );
i* (v a lo r _ r s to r n a d o > 0 } í l i o i ' {valcr_rato m aco < 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 * ) ; n*ftsaja_a^VJario(*Tuvo lugar error no arsvisto*!;
a is e if( v a lo r _ r a to r n a d o < « líe
n6n33!«_a_usijarL3(*TüVü lu g a r e r r o r no p r e v is t o * 1 : 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 Programación en Linux

JCrintfíC-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 •(
lf(fcontacor = con tar_rtg s{)) “ 0) (
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 WJlL)
w .aa|«_a_uiu«rto( "Sr-or do nemcria’ );
t í {(va lo r* » * na lloc(sízo ot{ 06 r •) • contador)) — WJU|
iionsii|e_,t_\)juario(’ £rror do nonsrla*);

/• Asignarla valor a caca puntero •/


f o r c • •; i < contador; »* t) (
l«< (clav«s| 11 ■ nallcc(r/»MMÍ0_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 = líst3r_regs(slávea, valoras);
if|vaIor_retcmaao == 0 ) {
lensajeji^suanoCProoiena con el admnistrasor de tase de oatos*),
break;
)
• Exhibir los -egístros 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 ) ;

}
tér.saj9_a_uSLano|'Este es a l u ltin o registro* );
Capitule 22: Proyecto de programación 491

5 »*su lí: i ' Cía»* incorrecta, tn fo rn ar i us.iar;o ‘j


Sin í í f i n t r ’ l;
w-nk;
} /• Srttf sn*ctt(fk*y) •/
}

c«rr»r_sef); • C * r ra r la 3 «3 « 39 <JatOí */
eerr*r_rcvr»*»(J; • C#r-*r •! SU08Í3tit<M tí# C U T O S */

«* i:< € x :’ .5UCC€3S);

• I n s t r u c c ió n * ! 3« 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 5»ia a« dato»!*);

•*it!£x!*_F*:w í£ l;
)
m t e r f a z ^ u s u a r io _ cd m . c debería r e a t a r l e familiar al lector. El flujo de
este programa, y gran p a n e de su código, se asem ejan mucho al código 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 línea 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 opción 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 .tíb. Los argum entos u opciones in­
válidas 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 código 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.
) ) ) ) J * 1
Programación 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 acción 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 válidos
• F2: A ñadir un registro
• F3: E lim inar un registro
• F4: B uscar un rogistro
• F5: R ecuperar un registro
• F6: 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 línea do escudo. El éxito o fracaso de cada operación
se m u estra en la línea do estado por medio de la fiinaón m en sa}e _ a _ u su a -
r i o . Uno puede hacer fácilmente 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 itiría al usuario añ ad ir un registro, y si o p ea ra I o L podría 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 térp re te y luego el título del CD. En !a figura 22-2 se m u estra la a p a ­
riencia de la p an talla después de haberse añadido 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 cuantío se elim ina un regislro 3e m u estra en la figura 22-3.
Cawtulo 22: Proyecto de programación 493

F ig u ra 22.2. i n t e r f s z _ 'j s u a r i o_Cd<r, después de haber añadulu 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 fíld 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 después 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 función 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 búsqueda 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.
Programación en Linux

F ig u ra 22..5. í n t e r fa z_usu3rÍ0__cdm exhibiendo el resultado de una búü


q u td a f'xitoía,

F ig u r a 22.6. Apariencia de ¡a pantalla luego de una búsqueda 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 operación 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 idéntico.
El código 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 aplicación interactiva es casi idéntica a la de s u pruno de la linea de
comandos. Comienza por obtener el núm 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 línea 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 dinámicamente
en lugor de asignarlo estáticamente.

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 código 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 después que i i s t a r _ r e g s h a actualizado la línea de
estado para indicar que ha sido exhibido el últim o registro de la base de datos.
Capítulo 22: Proyecto de programación 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 sólida 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 práciica.
A unque un libro ie pueda m o strar los principios y modalidades básicas, la
experiencia es el m ejor m aestro. ¡Siga a d ela n te y programe!
í Parte VI
%

Apéndices
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
I J ,1

A
Recursos adicionales

Bibliografía comentada
ALLESA.VDRO RUBWl, L inux D tvict D riixrs. O’Rcilly, 1998, ISBN' 56592-292-
l. Este m el libro que tr a ta sobre cómo escribir controladores de dispositivos
para Linux; contiene vanos ejemplo* completos y útiles.
ARMAS KaLLZ DaLHEI>gx. programmíng with Qt. OTtoüly. 1999. ISBN 1-
56592 588-2. Por el momento. es ei único libro publicado sobre la pro­
gram ación con Qt Si uno pretende realizar programación formal con el tool*
kit Qt. esta libro es de empleo obligado.
B ill RücENBIatt, Leam íng ihe Korr. Shell, C/Reilly. 1993, ISBN 1-56592-054-6.
U na introducción tutorial a la interfaz de Kcrn, contiene varios capítulos dedica­
dos a la program aran de scnpts para esta inierfítt. Todo su contenido debena
poder ser aplicado a p d k sh , la versión de dominio publico de la interfaz de Korr.
BRENT B. Weu3£. Practica! Programmíng m T il and Tk, 2da edición. Prer.ti-
ce Hall, 1997, ISBN 0-13-616830-2. T d/T k es el lenguaje UNDG'Linux de
scn p ts que cuenta con más prestaaor.es. T d es la sección de modo cexto y Tk
aáade una interfaz X Window, Este libro es el texto recomendado para
aprender Td/Tic-
Brzax W. KkrmGHaN. D e ssis M- R ítckie, The C Programmíng Lan^uage,
edición. P rennce Hall, 1988. ISBN 0-393-9694-5-2. Conciso pero completo
m anual sobre el lenguaje C de programación, tal como se encuentra norm a­
lizado por ANSI e ISO, esento por la5 dos personas que crearon el C.
C am£ROS N ew Ha M, Bü_l R osensla TT, L ea m in g :he bash Shell, 2da edición,
O'Rcüly, 1998. ISBN 1-56592-347-2. U n a introducción tu to ria l a la in te rfa z
c a s f i , contiene varios capítulos dedicados a la program ación ¿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 Exerci-
íes ir. :'ne C Programmíng Language, 2** edición. Preatice Hall, 1989, ISBN
0-13*109653-2. E s:e libro contiene soluciones para cada ejercido que Kernig-
h an y Ritchie pocen - a su libro, The C Programmíng Language. Lam enta-
} l
500 Programación en Linux

blem ente. las soluciones suponen conocimientos de características del len­


guaje todavía no presentadas.
D onald K n u th , The A r t o f Com puter Program m ing, Volóme 1: F u n d am en tal
Algorithms. 3™ edición, Addison-Wesley, 1997, ISBN 0-201-89683-4.
D onald K n lth . The A rt o f Computer Programming. Volume 2: Sem inum eri-
cal Algorithms, 3ra edición, Addison-Wesley, 1998. ISBN 0-201-89684-2.
Don'ald K>"üTH, The A rt o f Computer Programming, Volurne 3: Soríing and
Scarchir.g. 3ra edición, Addisoa-Wesley, 1998. ISBN 0-201-89685-0. E stos tres
volúmenes son las obras clásicas sobre desarrollo de software. Son n eutrales
en cuanto a herram ien tas y lenguajes, pero el conocimiento destilado de 30
años de programación, así como miles de algoritmos, justifican absolutam en­
te la inversión (el conjunto de los tre s volúmenes cuesta más 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 anipulación 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 fín 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 clásica sobro xníñeos paro com putado­
ras. E sta versión oa en vordad u n a versión compendiada de Computer Grnp-
fuer. Principies a n d Practica. Si uno quiere com prender gráficos de computa*
ción. este libro, o au prim o máa 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 introduc-
ción tucorial a C para aquellos que en cuentran el lenguaje C de programación
dem asiado lacónico.
KURT W all, NLutK W.vrSQN, MajíK 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­
mación p a ra Linux.
LARRV WALL, TOM CHRISTIANSEN, R a n d a l L. SCHWARTZ, Program ming Perl,
2lla edición. 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 ación con Perl, versión 5.
MlCHAEL BECK. HaRaLD BOHMK, MlRKO D2L-U)7.KA, ULP.tCH K unitz, R o b er?
MaGKUS, DlRK V”ERívoRN’F,R, L inux K em el Internáis, 2íla edición, Addison-
Wesley, 1998, ISBN 0-201-331*43*8. De u n tercio del tam año de The Linux
K em el Book, Beck y com pañía b rin d an al lector u n a mucho mejor introduc­
ción al kernel de Linux.
Apéndice 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. Addi-


son-Wesley, I99S, 0-201-30821-5. Escrito por dos de los mejores program ado-
res 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 técnico y de l a versión 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 Programmíng, Wrox Press,
1996 E ste libro, aunque d esactualizado a esta a ltu ra , cubre técnicas básicas
de program ación en Linux/UNDC E stá m al titulado, adem ás, ya que ta m ­
bién cubre program ación en UNIX.
PaIKCK VcLKERDING. ERIC FOSTTR-*ÍQHNSOS\ Kevw ReICHARD, L inux Progmm-
nung, > 0 5 Press. 1997, ISBN 1-55828-507-5. Volkerding, creador de la popu­
lar distribución de software Siackw are, recorre el amplio panoram a de la pro­
gram ación 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 edición.
O'Rcilly. 1997. ISBN 1-56592-234-0. Si se desea apronder Perl, este es el li­
bro que se debe leer.
R£my C a ro . E ric Dumas, P ra n c k M év el, The L inux K cm cl Book. Jo h n Wi-
ley and Sons. 1998, ISBN 0-471-98141-0. Traducido del francés al inglú.s.
C ard y sus coautores explican casi cada linea de código 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 introducción La traducción
del francés 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 Olrcc-
¡ing R¿compilation. 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 código fuente.
WaRREN W. Gay, Sarros Teach Y cu m elf L in u x Program míng in 24 Honra, Mac-
raillan C om puter Pubiishing, 1999. ISBN 0-672*31582-3. Buen* in tro d u c­
ción x la program ación 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 clásica sobre program a­
ción -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 ación en Linux

tam iento a POSIX. Como Linux es u n clon de L^EX. la m ayoría de las técni­
cas m encionadas tam bién 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 información sobre Linux. E ste apéndice 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 (Asociación de M áquinas de Com­
putación)
nttp:/vw>*. acn.org/

Tho Free Softw are Foundation (Fundación 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 Electrónicos)
n -t o ://■**.i«»».o rg /

Linux.com
nttp:/,*w*. :inu*.car/

The Linux Documentatior. Project (Proyecto do documentación 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 periódico 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 acker’s Gu:de (La g u ia del k em e l de Linux para hac-


kers)
Pttp:/íirn».reOfia:.con;aiJ8í/Hyper.*<e«sí'g«t.'lfng.fitnl

Linux Online (Linux en Línea)


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 ,'
Apéndice A: Recursos adicionales 503

i ne L inux F rogrsnuner's Guide L a g u ía de program ación 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)
«tío: /. 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 CWi 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 ación UNIX)
■>tts: I . «*• U.N!f -faQ/crocríaiMP/taq/
Usenet FAQ» (FAQ [Pregunta* Frecuentemente Formuladas] de UieneC)
Rtt?:í «vw.lwvifiíla.Mo/fiíjs/
htt»://*wi fiq.org/
U seaix • The Advanced Compucing S ystem s Assocíation (Usenix - La Aso­
ciación de Sistem as Avanzados de C om putación)
http://OTv.uttAii.org/
Linux C e rn e r Development (C entro Linux: Desarrollo)
TTO: / «■». IÍ.1 VX•c*nt«r.arj/ar/5«vei¡x¡n«i':/

JUEGOS

The Linux G ame D evílopers Web R ing (Ei C uadrilátero de los prugram ado-
res 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 gráficos
-■zzz:¡ OTv.cis.oMa-srstí.Ki'nyBtríaxt, faq/uswet/gi'aaíucs
áfil«for*ats-fsc.‘ tco .rrr;
5 04 Programación en Unux

Mesa
3
h* í : 11■**». asee. « ta c . etiul «orianp /Mesa. fttnl

PROGRAMACIÓN 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 tífc . coa /s c c te ts /

The UNIX Socket FAQs (Las FAQ (P reguntas Frecuentem ente Form ulada^
sobre sockets UNTX)
h típ 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

Diseño 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

DISTRIBUCIÓN DE SOFTWARE
Construcción 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:/,'«i»w.gtK.3rg/

T .iíoriai de GTK
•<: t p : / /la m>n. con/- slow/gtk /
Acér.dice A; Recursos adicionales 505

C entro ríe desarroliadores de KDS


itts : *ww.f«.uniielD. ecu.au/-ssk/taie/devil/
LessTíf Project (Proyecto LessTif)
nttp: H***. Uiszxt .erg i
Trol! Tech's Q t ■Q t de Troll Tech)
Http:/ «nnf.troIi.fV3/
Página principal de Xíorms
http://tx-«C$.ptys.i»«.etfV/*forw/

PROGRAMACIÓN UNIX
S un Developer's Corniectioc .Conexión p a ra program adores de Sun

:rtrp:/ «v».3un.:ofl/a«-<*lí-0'f"3/devoloi5ars.nrrl

PROGRAMACIÓN 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 técnicos de sistem as X Wúidow)
* W .! **• r*?:ui,0*tiy*«t0n/KSit»i.ht»l
X Imago Extensión irifo (Inform ación sobro extensión de X Iinago)
n * T O ;.u a e ri.e tí.c c o /c rn ín /j/U o -jín /
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/
Debían
rictp: ■ «-*"».e*oi*vor<;1
Red H at Soft*.varo
h ttp :/ *»*.¡'wr*í:.co«>
S lackw are
■wn.sUcm»»rj.cai
nrtff: ***.:arsa. zza
S ta n p e d e
rizc:.. hsn.iZiaceei.erii/
Programación 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 - Políticas de adm inistración de sitios.
com p. L ang. c -C u b re program ación 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 programación
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 programación 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 inistración de un sistem a
Linux.
com p. s h o l i . p ro g ram m er -Cubro program ación de interfaces.
com p. u m x . adm m -A dm inistración do un sistem a UNIX.
comp. u n tx .p ro g ram m er-A n aliza la program ación 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, envío 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 línea 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-Programación y desarrollo con C


l i n u x c o n f ig - Configuración de sistem as
l i n u x -d o c - Proyectos de docum entación
Liriux - f s f - Fundación 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 ación con OpenGL en Linux
Apénele? A Recursos adicionales 507

ii f l y x • pkg - P a ra facilitar la instalación 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 ulüproceso 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 - Utilización 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 tilización 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 programación

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/ J*/

• 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 tooücit 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 í

• 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 lnáór. C f - de la m ayoría 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

• Sño. u n a im plem entación 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/

Certificación
• 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¡/
Programación 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 ráp id o d e a p lica cio n es L lS P /C om -
m on L ISP
nt t o: fpanz.ccnítflo^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 *.caí1/

• 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://*i«nburi.«ocm.cOB,'.xOWinv«lin/Froofluíldor/lnaíx.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 j«va• 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

Distribución 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/B«ot8ter.C9l?flEgisterafr«9

« 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/
Apéndice S. Herramientas adicionales de programación

• Code Crusador
stto- •««■•.cco.eiltecr.
• GNCFro. una versión 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/

Gráficos
General Graphics Interface, un sistema gráfico 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 estática de verificación de código
/ ’*v». jcj . ic* .o ::.#©u/Ulti:
Cbecker. para localizar errores de memoria en tiempo de ojecución
nttp: /'*•» .«rg/scfmre/cftfleMr/cnecJur "tBÍ
CCMalloc. otro perfilador de memoria
nt»:/.'iserse.ira v**.Ut-*r%w<cct¡tUocr

Misceláneas
• Lnsure+~. una herramienta estática de validación de ^.odigo •como
LCLint)
ntíj: I /••». par»soft -coai crocucts/lrsure/ ird**-nt>
• PowerRPC, una herramienta de desarrollo rápid» para ..¡uñadas .1 pro
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*
• 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 *
) 1 ) ) .1 ) > ' } } ' >' r ■' ' J ;
512 Programación en ünux

• 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 científico y m atem ático


• Trazado de datos (Data Plotting) DÍS.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 análisis 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 / «ww». 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;gr«sqi.org/
1 > J > > ) ) ) > > ) ) > ) ) ) ) ) 1 j ) )
4

índice
S ím b o lo s -g. opciones. 14. 21. 450
-help. opciones. 30
«ifdcfs. arch ivo s con. -i, opción, 37
22 •jN. opción. 37
tin c lu d e . a rc h iv o » que -k. op ció n . 37. 53
ronttonan. 12 •I. o p c io n e s , 14, 220,
$, p a la b ra * cla v e» . 411- 300,413. 421
41S •Ldirnjuno. opción, 14-
S, v a ria b le * . -46 15
.C. e x te n sió n , 9 •m, o pción do lín e a do
.ce. e x te n s ió n , 9 c o m an d o s, 450
.i. e x te n sió n . 9 •MM. opción. 15
.11, e x te n sió n , 10 •n, opción. 37-39
.o, extensión, 10 •O. opción. 14, 19-20,
Jj, extanaión. 10 23. 29
.«o, M to n sió n , 10 •o, opciones, 14, 450
/dov, filM y stcm , 70. 278 -On, opción. 14
t a r u o t ' Li u p to d a te . •p. opción, 301
m en saje d e e r r o r , 52 -peduntic, opciones,
< -1, valor, 84 14. 17-18
< std arg .h , 304 •q, opción, 301, 428
•a. e x te n sió n . 10 , 303 -r, opción, 37, 301-302,
-anvi. o p c ió n , 14. 17-18 414-416, 418-420
•b. o p cio n es, 468 -s, opción. 37, 10-42,
-c, op ció n . 11, 14,300- 300-301
301 -static, opción, 14-15
•D XOPENjSOL’R C E , -truditfonaJ. opción, 14
m acro, 347 -u, opción, 300, 413.
-d. o p c io n e s. 37. 52. 420
301, 428 -v. opción, 15. 300
—dele te, o p c ió n . 449 -W, fam ilia d e opcio­
-Dfooobar, o p c ió n de nes, 14, 29. 37, 39
lin e a d e c o m a n d o s, 14 -Wall, opción, 11.17
-E. op ció n . 10 -w error, opción, 15
-£. in d ic a d o re s (flajísj, •Wfile, opción, 37
19. 30 •W im plicit-m d/cactor
-f. opción. 19, 3", 414- (flag) de función. 29
415 -x. opción. 12
•fstack, sw icch d e v e r i­
ficació n d e e g es, 29
i
516
i } t i
Programación en Unux
j .1 y / ) ) / ) J )

A c ió n d e , s a lid a d e Revisiones (RCS),


a b o rt, fu n c ió n , 23, 87 c a r a c te r e s , 230- 411
a b r ir 234 directorios, 163-165
archivos, 140, 142 a d m in is tra c ió n d e estructuras de comu­
bases de dato Berke­ p ro c e s o s y m em o ­ nicación ioterpro-
ley, 204-207 ria , 122-123 cesos (IPC), 342
colas (queues), 356- a d m in is tra c ió n de FIFOs. 331-333
357 r a tó n , n c u rs e s, formatos gráficos a
FTFOs, 331 257-264 aplicaciones, 313
Gnu DeBugger a d m in is tra c ió n formularios, n cur­
(gdb). 426 pipes, de mapeo de memo­ ses. 269-273
322-323 ria. fam ilia de lla­ m akeñles, 35-36
programas con Gnu m adas para. 174 m apa en memoria,
DeBugger (gdb), da ventanas, ncur­ 175-177
426-427 ses. 253-257 m em ona com partida
acceso ile g a l, m em o­ a d v e rte n c ia s , g e n e ­ (SHM), segm en­
ria , 434, 437 ra c ió n c o n GNU ce tos, 345-346
acceso , g a n a r (gee), 17-18 menús. ncurses, 264-
a archivos bloquea­ a g re g a d o d o se g m e n ­ 268
dos. 182 to s d e m e m o ria procesos, 77*33
a información do a r­ c o m p a r tid a reglas, herram ien ta
chivos, 148-149 (SHM ), 347-351 makc de GNU,
n variables Juera de a g re g a d o d e tar* 40-52
rango. 434 h n lls, 449 RPMs (A dm inistra­
acceso s a g re g a r dores de Red H at
de bitrt, 134 archivos comprimi­ Package), 453*459
ilegales, 435 dos, 446 semáforos. 368-374
indicadores (flugs), bases de datos Ber­ sesiones. 193
open y creat, lla­ keley. 204-207 sockets do entorno
m adas u sistem a, bibliotecas do pro­ UNIX, 387-388
140 gram ación, 300- sockets. 380-382,
permisos, modifica­ 317 394*397
ción de. 152-154 colas (queues), 356- subventanas, 253-
a c c io n e s, ra tó n , 258* 357 255
264 color, ncurses. 250- tarballs (archivos
a c e p ta c ió n d e p e d i­ 253 tar), 446-448
d o s d e co n ex ió n , com entarios, makefi- ventanas nuevas e
383-387 les. 50 independientes.
a c tu a liz a c ió n d e tar* conjuntos de seña­ 253-257
balls, 449 les, 107 ARFLAGS, v a ria b le
A DCs (c o n v e rtid o re s cursores, 213 p re d e fin id a , 47
a n a ló g ic o -d ig ita - daemons, 191-200 A itk cn , P e te r, 139
les), 288 Directorios de S iste­ a lc a n c e d e v a ria b le s ,
a d d c h , n c u rs e s , fu n ­ ma de Control de 434-435
índice 517

alig n e d . a tr ib u to . 23 extensión de p resta­ d e tr a b a jo


a lm a c e n a je d e d ir e c ­ ciones de, 313 a rc h iv o s d e só lo
c io n e s. re d e s , 393* gzip. 51 a g r e g a d o .160
396 Ipedated, 196-199 a rc h iv o s d e tr a b a jo
a lm a c e n a je d e e le ­ m ake de GNL*. 33-53 descripción, 410
m e n to s e n b a s e s recompilación des­ modificación. 413
de d a to s B erkeley, pués de extensión. proüjam ieato, 420-
208-210 313 421
a lm a c e n a je te m p o r a ­ recursos científicos y visuaiización de dife­
rio (ca c h e ) d e tip o m atem áticas pa­ rencias entro.
e s c r ib ir d e sp u é s , ra.. 512 418-420
142 setgid y setuid. 66- a rc h iv o s e s p e c ia le s
a n á lis is d e a rc h iv o s 67 d e d is p o s itiv o s d e
d e e sp e c ific a c ió n . ar, c o m a n d o . 301 c a r á c te r , 133
455-458 AR, v a ria b le , 47 a rc h iv o s n o rm a le s,
A PI. V er in te rfa c e s a r c h iv o s b in a rio s , 132
p a ra p ro g r a m a s C o n c u r r e n t V er­ a rc h iv o s o r i e n ta d o s
d e a p lic a c ió n sió n S y ste m (CVS), a b y te s , 132
a p lic a c io n e s 412 a rc h iv o s rp in rc , 453-
añadido de formatos a r c h iv o s b lo q u e a ­ 454
gráficos a. 313 d o s, u tilid a d RCS a rc h iv o s Uir. 446-449
base de datos do CD descripción. 41 a rc h iv o s
musicale». código ingreso y extracción. a incluir, opciones y
fue ni* p ara, 463- 422-423 argum ontos. 15-
495 a rc h iv o s c o m p rim i­ 16
bases de datos, re­ d o s, c re a c ió n d e. a p ertu ra de. 140-142
cursos para. 512 448 ostento (log), c rea­
bastidores de aplica­ a r c h iv o s d e c o n fig u ­ ción de. 194-196
ciones. recursos ra c ió n . 303 binarios, C oncurrent
para. 509 a rc h iv o s d e d ir e c to ­ Versión Systom
compilación. 7-30. rio . V er d ir e c to ­ (CVS), 411
425-426 rio s bloqueados descrip­
contraseña. 65 a r c h iv o s d o dispo.si. ción 410
corriendo en Gnu tiv o . 133 ingresar y extraer
DeBugger (gdb), a r c h iv o s d e e m p a ­ de directorios
426-427 q u e ta d o , lista d o RCS, 422-425
creación de bibliote­ d e s u c o n te n id o cerrar, 140, 141
cas para. 301-304 co n l a u tilid a d tar, configuración de, 303
daemons. creación 446-449 Je biblioteca, opcio­
de. 191-200 a rc h iv o s d e e sp e c ifi­ nes y argum entos,
depuración. 426-435. c a c ió n . R PM . 455» 15-16
439-443 459 de especificación, en
cüstribución. 44o- a r c h iv o s d e r e p o s ito ­ paquetes RPM,
453. 504. 510 rio . V e r a rc h iv o s 455-459
' > y ) ) ) i / > j .) ) ; ) ) ) ) i ,i /

518 P ro g ra m a c ió n e n Linux

de trabajo. 410. 413, creación, de reglas, ASFLAGS, v a ria b le .


418-421 ■40-52 47
definidos con ^ifdeís. creación de un ar­ a s ie n to (log), a r c h i­
22 chivo make, 35- vos d e, d a e m o n s,
de3cnptorcs. cierre 36 194-196
de, 19*4 descripción de un a sin c ró n ic o , c o m ­
directorios. Ver di- makefile, 34 p o rta m ie n to
mctonos manejo de, 132-190 descripción, 94
eliminación desde norm ales. 132 llam ada a fork. 79
tarballs, *449 Revimon Control AT&T, 95
en trad a / salida Syatem (RCS), ató m ic u . 183
(E/S), llam adas a 410 a tr ib u to s
sistem a. 123 revisiones, 410 nlmeado, 23
escribir a. 142-L44 rpmrc, 453-I54 em paquetado, 23,
especial de bloque, *óln para urtndir, 160 26-28
especial do carác­ Ver tam bién vínculos no retom o. 23-26
ter y diapoüitivo, simbólicos; tar- no-vuelco y aync, 160
133* balls procesos, 62-77
especiales. Ver a r ­ a rc h iv o s, b lo q u e o a ttr ib u te , p a la b r a
chivos de disposi­ d e. 182-185 re s e rv a d a , gee, 23-
tivo a rc h iv o s , se cc ió n 26
extensiones, in te r­ (RPM ), 458-459 a ttr o n y a ttro ff, lla ­
pretación do cc de a rg u m e n to s m a d a s u, 251
GNU de. 9-10 clave, iniciali/.ación, a u d io c o m p rim id o ,
gráficos. formatos, 208 288
503 cmd, 371-374 a u d io sin c o m p rim ir,
impresión de infor­ facilidad y prioridad, 288
mación referente 197 a u d io . Ver ta r je ta s
a, comando rlog, GNU cc (gee), 14-22 d e so n id o
421-422 indicadores, 179
•.ndwdos con «inclu- llam ada a box, 238 B
de, 12 longitud y com:en 20 . B * tre e , b a s e d e d a ­
ingresar y extraer 177 to s, 205
archivos, Revisión opción, 196 b a c k tra c e , co m a n d o ,
Control System tipo, 363 429-430
fRCS), 411-413 valor, inicialización b ad m em , fu n ció n .
imncdificables, 160 d e .208 436-439
lecrora de, 142- arreglos B ailey, E d . 453
144 im prim ir prim ero B all, B ill, 137
tnakc ubicaciones en b a s e d e d a to s d e
código m ultifuen- m em oria asocia­ CDs m u sic a le s, có­
te. compilador. das con, 430 d igo fu e n te de
de programas semáforos, 369 p ro g r a m a s p a ra .
con, 12-14 AS, v a ria b le , 47 464-497
Índice 519

b a s e s d e d a to s b a s a ­ m ie n ta s p a r a . 300* b lo q u e o s d e a d v e r ­
d a s e n re g is tro s , 304 t e n c i a . 183
204 b ib lio te c a s e s tá tic a s , b lo q u e o s d e le c t u r a
b a s e s d e d a to s q u e 15-17. 303-310 o c o m p a r t id o s . 186
e m p le a n d is p e r ­ b ib lio te c a s b lo q u e o s d e e s c r i t u ­
sió n ih a s h ) de d a ­ convenciones sobre ra o e x c l u s iv o s ,
tos, 204-205 nom bres. 15 !S (¡

b a s e s d e d a to s de ncurses. 220-240 b lo q u e s d e d a t o s ,
B -tre e , 205 de programación, 134
B asadas en d isp er­ creación de, 299- b o r r ie r , f u n c ió n . 230
siones o hachea, 317 b orrar
204-205 ístáticas. linkeo do. registros corrientes
basadas en registro?. 15-17 de bases de dutos
204 readlme de GNU. 432 y cursores. 215
Berkeley. 203-217 recursos p ara. 509 directorios. 165-167
CD musicales, códi­ b ig -en d in n , c o m p u ­ archivos de tarbalis,
go fuente para. ta d o ra s , 392 446
464-495 b its m o d ific a d o re s elementos de bases
recursos de softwa­ de m odo d e a r c h i­ de datos Berkeley,
re, 512 vo, 135-136 210-211
Ver lam bitn Domair. bits colas do mensajes.
Ñame Sjutem de acceso. 134 365
(DNS) informados por co­ semaforoi», 3671-374
b a s tid o re s p a ra a p li­ mando SN0CTL_ evitar en archivos do
c a c io n e s, 509 0SP_GETCAPS 294 trabajo, durante
B erkeley, b a se d e d a ­ modificadores de ingreso a directo-
tos, 203-217 modo da archivo, rio RCS. 413
B erkeley, A PI ( i n te r ­ 135-136 b o x . f u n c ió n . 239
faz d e p ro g ra m a s bkgd. lla m a d a , 237- b o x , lla m a d a a m a-
d e ap lic a c ió n ) p a ­ 239 c r o , 238
r a so ck ets. 380*382 b lo q u e a d o re s, a rc h i­ b r k , lla m a d a , 123
vos, 183*186 b u g s (erro res)
b ib lio te c a r s a d l i n e .
b loqueo d e a rc h iv o s de memoria, tipos
GNU. 432
e sp e c ia le s, 133 de,435-436
b ib lio te c a , a rc h iv o s
de, o p c io n e s y a r ­ b lo q u eo d e re g istro s, corrección de errorea
g u m e n to s e m p le a ­ 185*187,189 con GNU cc (gee),
dos, 15-16 b loqueo 21-22
de archivos, 182-189 B u r n e t t , S t e v c n , 137
b ib lio te c a s c o m p a r­
tid a s, 310*312 ¿e memoria. 179-180 b u sca r
b ib lio te c a s de p ro ­ de registros. 185-139 ayuda sobre coman­
g ra m a c ió n , c r e a ­ b lo q u eo s c o m p a r ti­ dos de Gnu De-
dos, 1 8 6 Bugger igdb), 437
ción d e, 299-317
blo q u eo s c o m p u ls i­ paiabras reservadas
b ib lio te c a s de p ro ­
vos, 183 de Revisión Con-
g ra m a c ió n , h e r r a ­
¡ ) ) ) ) } > ) ) ) ) J ) ) ) ) ) )
520 Programación en Linux

crol System c at, co m an d o , 32Í-322 c lo selo g , lla m a d a ,


CRCS), 415-416 C a th e d r a l a n d Che 196
problemas en memo­ B a za a r, T he, 56 c lr t, fa m ilia d e f u n ­
ria, 433-441 CC, v a ria b le . 47 cio n es, 239
bytes, o rd e n d e , 392 C e rra r cm d. a rg u m e n to ,
archivos, 138, 141 371-372
C base3 de datos, 205- co, c o m an d o . 409-415
C con E je m p lo s (li­ 207. 215 co d ecs. 278
bro», 139 descriptores de a r ­ c ó d ig o e n e je c u c ió n ,
C P ro g ra m m in g chivos, 194 m o d ific a c ió n de,
L a n g u a g e, FTFOs, 333 433-434
s e g u n d a e d ic ió n . Gnu DeBugger. 429 c ó d ig o fu e n te
E l (lib ro ), 139 pipos, 322-323 compilación de pro­
c, o p ció n d e lin e a d e c e rtific a c ió n p ro f e ­ gram as con archi­
co m a n d o s, 446 sio n a l d e , L in u x , vos do, 12-14
c_close. fu n c ió n , 215 e n tid a d e s , 509 programa» p ara base
c_del, lla m a d a . 215 C FLAGS. v a ria b le de dolos de CD
c_get, lla m a d a . 214 p re d e fin id a . 47 musicales, 464-
c_ p u t, fu n c ió n . 214 c h , fu n c ió n , 237 495
en d o n a s de c h d ir, r u tin a . 163 SOffuiinionto de cam ­
p se u d o -c a ra c te - c h m o d , U am adu, 123, bios, Revisión
re s, 234 151-153 Control System
c a d e n a s, tip o s d e d a ­ c h o w n , lla m a d a . 123, (RCS), 409-423
tos e sp e c ia le s en 153-154 c ó d ig o m u e rto . 29
chair. puntero u una c h s tr, e n d o n a s de c ódigo
cadena de psoudo- p se u d o -c a ru c te - ejecutar, modificar.
car actores, 234 re». 234 433-434
chtyp»». tipo de ca­ c h ty p e , c a r a c te r e s fuente
rácter que rep re­ d e c a d e n a , fo rm a ­ baxe de datos de
sen ta un pseudo- to, 231 CD musicales.
caráctor, 231 ci, c o m a n d o , 411-415 464-495
ident, parám etro de c la v e /v a lo r, p a ro s, rastren de cam ■
la función openlog 204 bios, Revisión
196 c lav es, e n b a s e s de Control System
callo c, r u tin a , 123 d a to s , 204 (RCS), 409-423
c a n a le s e n d is p o s iti­ c lav e s, e n m e m o ria inspección de. Gnu
vos m e z c la d o re s c o m p a r tid a , 343 DeBufrger :gdbi,
d e so n id o , 281-285, c lie n te s , c o n e x ió n a 430-431
290 s o c k e ts. 383-388 modificación de. im-
c a ra c te re s , n c u rs e s cióse, fu n c ió n , 206 plementaeiones,
entrada, 243-244 ció se, lla m a d a , 123, 57
salida, 230-234 140-141,324 muerto. 29
case, ra n g o s d e. s in ­ c lo se d ir, fu n c ió n , optimización. GNU
ta x is, 23 167 cc (gee;, 19-20
índice 521

ratón, compilación. mkfifo. 332-333 (SHM). -341-372


258 om. 300-301 C o n c u rre n t V ersió n
reutilización. 299 p rln t. 430-433 S y ste m (CVS), 409*
c ó d ig o s d e re to rn o , res. 417-423 411
su m a n e jo en riog, 420-421 c o n d ic ió n d e c o m p e ­
n c u rs e s , 253 run. 42S te n c ia
códig o s SNDCTL.DSP- descripción. 79
de error. 124-123 .G ETC A PS. bits señales, 95
de retom o, ncurses. reported by, 293 c o n d ic ió n d e s a lid a .
253 sta t. 147-151 p ro c e s o h ijo . 84
c o lo re s, a g re g a d o a step, 434 c o n e x ió n a s o c k c ts.
v e n ta n a s con w natis, 429 383-388
n c u rs e s , 250*251. c o m e n ta rio s , e n m a- c o n e x io n e s a re d e s ,
253 k e file s, 50 394
c o m a n d o s d e im p re ­ c o m p a r a c ió n d e a r ­ c o n fig u ra c ió n c o ­
sió n . 429-432 c h iv o s d e tr a b a jo . r r ie n te d el m ix e r
co m a n d o s 418-420 do so n id o , v is u a li-
ar, 301 c o m p a tib ilid a d do /a c ió n , 281-284
backtrace. 429-430 b ib lio te c a s , m a n ­ c o n fig u ra c ió n , ur-
cat, 322-323 te n im ie n to , 310 chivo» d e e m p a ­
d y co. 411-415 c o m p ila c ió n c r u z a ­ q u e ta d o d e R ed
cpto, 446 da, im p o rta n c ia H a t (R PM s), 453-
cut. 322-323 e n L in u x , 8 455
dele!*. *32 c o m p ila c ió n c o n ju n to d e C o m p i­
disable, 432 de código p ara ratón, la d o r GNU M ejo­
echo. 42 258 ra d o . 28-30
en makuñlcs, 35 con ncurses. 220-222 C o n ju n to E x p e ri­
enable. 432 do program as. 7-30. m e n ta l GNU do
gdb (G nu DeBug- 426-427 C o m p ila c ió n . 28-
ger), 425-427 c o m p ila d o r d e C. V er 30
Help. 429 GNU cc, eg e s c o n ju n to s d e s e ñ a ­
id. 66 co m p ilad o re-s, sitio s les, 95. 107
idcnt, 417-41» Web p u r a d e s c a r ­ c o n m u ta c ió n d e p a ­
mío breakpom ts, g ar, 510 q u e te s , re d e s , 378-
432 c o m p re s ió n d e t a r ­ 880
in s ta ll 449-453 b alls, 448 c o n s ta n te s de tip o fi­
invocar al anterior. c o m p re sa , u tilid a d , le, 136
432 448 lseek , lla m a d a , 143
h lL envío de seña­ c o m p ro b a c ió n d e b i­ c o n s tru c c ió n d e p r o ­
les. 99-100 b lio te c a s , 308-310 g ra m a s
ldeor.ñg. 302-303 c o m u n ic a c ió n in te r- bibliotecas de pro­
ldd, 302 p ro c e s o s (LPC) gramación, 299-
list. 429. 432 descripción. 321 317
is. 9. 333 m em oria com partida RPM (A dm inistra-
522 Programación en Linux

dor de em paque­ g ra m a s e n G n u procesos, 77-83


tado de Red Hat), D e B u g g er (gdb), programación de bi­
458-459 426-427 bliotecas. 299-317
c o n s tru c c ió n , s e c ­ c o rr u p c ió n d e m e ­ reglas, herram ienta
c ió n (RPM ), 455- m o ria , 435 make de GNU.
456 e p io , c o m a n d o , 446 40-52
c o n s tru c c ió n d e a r ­ C P P . v a ria b le p r e d e ­ RPMs (adm inistra­
c h iv o s e je c u ta ­ fin id a , 47 dores de em pa­
b les, h e r r a m ie n ta C P P F L A G S, v a ria b le quetado de Red
m okc d e G N U , 33* p re d e fin id a . 47 Hat). 453-460
53 c re a r segm entos de memo­
c o n te o s do r e f e r e n ’ archivos de em pa­ ria compartida
c ia , m e m o ria c o m ­ quetada compri­ (SHM), 107. 347-
p a rtid a , 345 midos, 449 348
c o n te x to archivos tar, 447-449 semáforos, 368*371
descripción de. 62 bases de dato» Ber­ sesionen, 193
variables do, 434- keley, 205-207 socketa de entorno
•135 colas (tfueues), 358- U N K . 386-3887
c o n tr a s e ñ a , p r o g r a ­ 369 sockets, 381-383,
m a s d e, 60 comentarios en ma- 395-396
c o n tro l d e ta r e a s , s e ­ kofilos, 50 nuhventanas, 253-
d a le s , 93 conjuntos do seña­ 255
c o n tro l les, 107 ventanas nuevos e
dol proceso de cons­ cursores 213 independientes,
trucción de pro­ daem ons. 191-200 253-257
gram as. 33-53 directorio, 165-167 c re a t, lla m a d a , 123,
de semáforos, 371- Directorios de RCS 139
376 (Revisión Control c re d e n c ia le s d e u n
c o n tro le s , e n tr a d a - System). 411 p ro g ra m a , 62
/sa lid a . Ver lla m a ­ estru ctu ras IPC de o rd e n a m ie n to s alfa-
d a a ioctl comunicación en­ n u m é ric o s, o rd e n
c o n v e rtid o r e s a n a lo - ere procesos, 342 de c la sific a c ió n ,
g ico -a-d ig ita l, FCFOs, 331-333 204
(ADCs), lim ita c io ­ formatos gráficos en erm o d e , fu n c ió n .
n e s d e g ra b a c ió n aplicaciones, 313 242, 244
d e fre c u e n c ia s, formularios con c u o ta s d e tie m p o , 62
288 ncurses, 270-274 c u rs_ w in d o w , p á g i­
c o p ia d o d u r a n t e e s ­ makefiles, 35-36 n a d el m a n u a l, 253
c r itu r a . 80 m apas en memoria. c u rs c r, p u n te r o , 223
c o rre c c ió n d e e r r o ­ 175-177 c u rs e s d e BSD, 258
re s, GNU cc igcc), m enús, ncurses, 265- c u rso r, fu n c io n e s de,
21-22 269 n c u rs e s , 223
c o rre g ir. V er d e p u ­ ncurses. color, 250- c u rso r, lla m a d a , 213
r a r c o r r id a d e p r o ­ 253 c u rs o re s
creación. 213 variables. 42 p e d id o s c o n e s p e ­
movimiento con d el. fu n c ió n . 210 c ific a c ió n d e v e n ­
ncurses, 239 d e le te . c o m a n d o . 432 ta n a . 239
navegación de bases d e ls c re e n . fu n ció n , d e sp la z a m ie n to do
de datos con. 213- te rm in a c ió n d e c u rs o r, n c u rs e s,
215 n c u rs e s, 228*230 239
c u t, c o m a n d o , 322- d e p e n d e n c ia s , m nke- d e te c ta r
323 files, 35 acciones de ratón.
CVS. V er C o n e u rrv n t d e p u ra c ió n co n 259-264
V ersión S y ste m GDR. 429 .¡eriales pendientes.
d e p u r a r (d o b u g g in g ) 114-116
D con Electric Fence, d e te n c ió n do p ro c e ­
DAC. Ver c o n v e rtid o ­ 43S-440 sos, 86-89
re s do d ig ita l a con Gnu DeBugger d ie_ o n _ erro r, fu n ­
a n a ló g ic o (gdb). 426-435 c ió n . 23
D sc m o n s con mcheck. 441-442 d ife rim e n to d e co­
creación. 191-200 con mpr. 441-442 m andos pop d esd e
inclusión de bibliote­ habilitar, ncurwa. la p ila (sta c k ), 19
cas estáticas en. 221 d ig ita l a a n a ló g ic o ,
303 memoria. 435-443 c o n v e rtid o re s
d n ta tfra m a . p ro to c o ­ program as compila­ (DACs), lim ita c io ­
los, 380 dos. GNU cc (gcc). n es en g ra b a c ió n
d a to s e s tá tic o s , b a ­ 21-22 de fre c u e n c ia s,
ses d e d a to s B e r­ Ver también (rou- 288
keley. 210 bUshocting (solu­ d ire c c io n e s
d a to s ción do proble­ du fam ilias do soc­
estáticos, bases de da­ mas) kets Berkoluy, 381
tos Berkeley, 210 d e rw in . lla m a d a . 254 ligazón a sockúts,
laten o a de. 19 d e s c a r g a r (d o u n lo a - 383-387
D ata B ase T h an g . d in g ) redes, alm acena­
204 compiladores desde miento, 393-395
DB.NOSYNC. v a lo r Internet, -510 d ire c to rio s
de a rg u m e n to Red Hat Package cam biara, 163-165
flags d e fu n ció n M anager (RPM), creación y elim ina­
d b .o p e n . 206 453 ción. 165-167
d b . fu n c io n e s y p a r á ­ d e s c r ip to r e s , c ie rre descripción, 133
m e tro s. 206 de, 194 listado, 167-169
DB, in d ic a d o re s d e se m p e ñ o Revisión Control
ifla g s), 214 mejorar y optimizar System (RCS),
DBT. V er D a ta B aso código: con GNU cc creación de, 411
T hang igcc), "19-20 d ire n t, fu n c ió n . 168
d e ñ n ir reseñas, 29 disable, com an d o , 433
handiers de señal. d e s p la z a m ie n to de d isk s, e s c r itu r a de
106-114 c u rso r, n c u rs e s , m a p a s a . 179
5 * 4 Programación en Linux

d is p o sic ió n do v e n ­ sin modificar códi­ e n a b le , c o m a n d o ,


ta n a s , n c u rs e s, go, 57 433
223-225 protección de m a­ e n c a b e z a d o , se c c ió n
d isp o sic ió n , se ñ a le s pas, 179 (RPM), 456-457
d e. 94 ejecución de códieo. c n c a m in a d o rc s , c o n ­
d is t ta r g e ts , majkefi- 432-433 m u ta c ió n d e p a ­
les, 51-52 archivos de trabajo, q u e te s , 378-379
d is trib u c ió n d e so ft­ 410 e n c a p s u la m ie n to .
w a re . 445-160, 504, e d ic ió n d e có d ig o Ver sín te s is
510 fu e n te e n d w in . fu n c ió n ,
d is tr ib u id o r e s de makefílea, 36 n cu rsC s te r m i n a ­
s o ftw a re , 505-506 recursos p ara, 508- c ió n d e. 228-23»
di, in te rfa z , 312-315 510 e n to rn o , v a ria b le s
D N 5. V er D o m a in eges, 28-30 d e, 45. 302
Ñ a m e S y ste m doit, E le c tric F e n c e , d e ­ e n tr a d a /s a lid a (E/S)
fu n c ió n , 72 p u ra c ió n co n , 438- de archivos, familia
D o m a in Ñ a m e S y s ­ 14» de llam adas a sis­
tem <DNS), 104- e lim in a c ió n (ki- tem a. 123
407. V er ta m b ié n p ro c e s o s tnultiplexing de.
b a s e s d e d a to s do, 86*89 169-174
D S P.C A P , b its in f o r ­ e lim in a c ió n d e b lo ­ e n tr a d a /s a lid a , c o n ­
m ados p o r com an­ q u e o s e n a rc h iv o s tro l d e, 279-280.
d o SNDCTL_DSP- e x tr a íd o s . 422 283
_GET_CAPS. 293 e lim in a r e n tr e n a m ie n to , r e ­
d u p w in , fu n ció n , 256 archivas de trabajo, c u rs o s p a ra , 51»
d u ra c io n e s d e s e ñ a ­ evitar d u ran te in­ e n v ío d e se ñ a le s, 99-
les, 288 greso a RCS, 413 102
archivos en tarballs. E ra (E p o ch ), 158
44í e ra s e , fu n ció n , 239
E/S. Ver e n tr a d o /s a li­ colas de mensajes, e r r a r le p o r u n o , tip o
da 366 d e e rro r. 435
echo, c o m a n d o , 13 cursores, 215 e rr n o , v a ria b le g lo ­
ech o , fa m ilia de f u n ­ directorios, 165-167 b al, 126-128
cio n e s, 231, 242 elementos en bases e rro re s
e d ita r de datos Berkpley, verificación con GNU
permisos de acceso, 210-211 ce (gee), 17-18
151-153 regiscros corrientes códigos de, 124-128
directorios, L63-165 de bases de datos, control de, 379
archivos 215 adm inistración de
propiedad de, 153- semáforos, 371-374 dacmons. 196-197
154 e m p a q u e ta m ie n to herramienta maJie
marca da fecha y d e a rc h iv o s, s is te ­ de GNU. 52-53
hora. 158-160 m a s d e, 446-454, llamadas a siste­
unpiezr.encacianes 504, 510 ma. 126-127
índico 525

errarle por uno. 435 d e audio, 292 ex tensiones


Hamaca a pipe. 325 parám etros de dispo­ C, 22-24
retornados por fun­ sitivos de sonido interpretación por
d o n es de menú p a ra reproducir parte de cc de
post y u n pos;. 256 sonidos. 288-293 GNU de. 9-10
valores, fondones de puntos de detención, bibliotecas estáticas.
Socket*. 382-383 nom bres de fun­ 303
e rr o re s , c o n tro l d e. cionad y números
379 d e línea. 432-433 F
e s c r ib ir m nask, llam ada, f, o p c ió n d e lín e a do
a archivos. 141-143 193-194 com andos p a ra a r ­
a FTFOs. 335-336 volúm enes de dispo­ c h iv o s ta r, 446
3 pipes, 325-331 sitivo mezclador facility , a rg u m e n to
a sockets do entorno d e sonidos, 2S1 d e l a d m in is tr a d o r
UNIX. 390-392 e s tru c tu r a s d e in g re s o al s is ­
a sockets de Protoco­ cabos (stubs). 301 te m a , 197
lo do Control de packed, atributo. 23, fa lla s d e m e m o ria
Transm isión/ Pro­ 28 n im ia s , p ro c e s o s,
tocolo de Interne! EXDEV, có d ig o de 73
(TCP/IP), 398-401 e r r o r r e to m a d o fa lla s im p o r ta n te s
mitpas a disco. 179 p o r L lam ada a sis­ d e m em o ria , p r o ­
mensaje* a colas. te m a , 125 ceso s, 73
360-363 exoc. fu n c ió n , 80-83 fallas, d e m e m o ria ,
reglas, herram ienta e x h ib ir n im ia s o im p o r ­
m ake da GNU. configuración co­ ta n te s , p ro c e s o s,
40-52 m e n te del mez* 73
e sp e c ific a r d a d o r do aomdos, fa m ilia d e d ir e c c io ­
frecuencia del m u « - 281-284 nes, s o c k e ts B er-
treo. reproducción diferencias entro a r ­ kcley, 381
do sonido, 290 chivos de trabajo, fch d ir, r u tin a , 163
ventana, ncurses. 413-420 fch m o d , lla m a d a a
238-239 p alab ras reservadas siste m a , 151-153
e s ta b le c e r del Revisión Con­ feh o w u . lla m a d a a,
form atos de m uestra trol System 153-154
y frecuencia de (RCS), 415-416 fc n tl, lla m a d a a , 123,
mueatreo de soni­ valores de v aria­ 186
do, 289-290 bles. -433 field, fu n c ió n , 271*
funciones de alarm a e x it, f u n c ió n . 23, 86 272
p ara interceptar e x te n d e r la c a p a c i­ F IF O s, 321-338. Ver
señales. 102-105 d a d d e u n a a p lic a ­ ta m b ié n p ip e s c o n
niveles de sonido de c ió n , 313 n o m b re
interactivos, 285- e x te n s io n e s d e C, file, m odo, 134-137
2S7 G NU e c (gee), 22- file sy ste ra e x t 2 , 160*
núm ero de canales 24 163
> 1 / / > } i ) } ) ) 1 ) ) í )

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. racteres con ncur­ 223. 245-246,343-


86-89 ses, 230-234 344
flag, v a ria b le , 313 alarm , configurar hline. 238
flag s (in d ic a d o re s), p ara in terceptar horch. 238
19. 29-30, 139, 214 soñales, 102-105 inset, 393
f l a g s a rg u m e n to , badmem. 441-443 init, 226-228. 250.
179 border, 239 265
flags, p a rá m e tr o , v a ­ box. 239 insch, 232
lo res, 176 c. 214-215 k Jl. 88-89.101-102
flock. lla m a d a a sis­ o h .237 tibefence. 438
tem a, 123 cióse, 206 line, 239
fo rk . 323 dosedir, 167 mk, familia do, 165,
fo rk . lla m a d a a, 78- clrt. familia de, 239 323. 332-333
80 ermode. 242*244 mousemask, 258-
fo rm a to s cursor, 223 259. 261
chtypo. pseudo-ca- db o p e n .206 magbuf, 360-361.
ractere», 231 do control de m enús. mv, 231-232
de m uestra «lo audio. ncurses, 266-267 convención do nom­
obtener y estable­ do!. 210 bres. ncurses.
cer. 289-290 delscreen, term ina­ 225-226
gráficos. 313, 503 ción de ncurses, n c w jte m y new . m e­
fo rm u la rio s, c r e a ­ 228-230 nú. 265-266
c ió n d e. 269-274 d)Q_on_error, 23 newterm , uiicializa*
fre c u e n c ia s , lim ita ­ dirent, 168 ción de ncurses.
c io n e s e n su g r a ­ dlopen, 312 226-230
b a c ió n , 288 dldose, 3132 noecho, 242-244
fto k . fu n ció n , 344 dierror. 312 opendir, 167
fu e r a d e ra n g o , v a ­ dlsym, 312-313 pause, intercepción
ria b le s, a c c e so de, doit, 72 de señales. 105-
434 dupwin, 256 106
fu g as, m em o ria. 438. echo, 242 peloso y popen. 329-
441-442 echochar, 231 331
ful 1-d ú p lex , ta r je ta s endwin, terminación po.st_menu, 266
d e so n id o de ncurses, 228- pseudo, 225
descripción, 294 230 put, 208
grabación de sonidos erase, 239 readdir, 168
e n ,287 exec, 80-83 retresh, 223
fu n c ió n a la rm . c o n fi­ exit, 23. 86 rradir. 165
g u r a r p a r a in t e r ­ field, 271-272 sa_*. 110
c e p ta r se ñ a le s, ilación de nombres, scanw, 245-246
102-105 432 sem. 343,368-369,
fu n c io n e s ftok, 344 371-374
abort, 23,87 get, fam ilia de, 63- set_m enu_fonnat.
addch, salida de ca­ 64, 67-68, 212, 265
indico 527

seaockopt, 394-395 GET. v a lo re s . 371-372 GU Is (in te rf a c e s g r á ­


shm gct. 343.346- GETALL. v a lo r d el fic a s d e u s u a rio ),
347 c o m a n d o Cffld d e la to o llrits. 504-505
shruid, 348 fu n c ió n se R ic tl, gzip, u tilid a d , d i s t r i ­
sig. 109-110, 114 370 b u c ió n d e so ftw a ­
socket, 382-383 G tD s (LDs d e g ru p o ), re , 446-449
start_color. 250 64-66
sysconf. 71 GNU cc (gcc), 7-30 H
system , 69-72,77 com parado con eges. h a b ilita r d e p u ra c ió n
traoes. 429 29-30 ncurses. 221
unpost.m enu, 266 compilación de pro­ acciones de ratón,
utim e. 156 gram as. 7*21 258
vwscanw, 245 extensinne* de C. h a n d le , v a ria b le
waddch, 231. 242 22-24 p u n te r o , 312
wait. 84-66 ejemplos de. 24-28 h a n d le r s d o se ñ a l,
wech ochar. 231 opciones y a rgu­ 106-114
w fndoM , 261 mentos. 14-22 h as_color:\, lla m a d a ,
wgotch. 242 con m últiples arch i­ •>:,o
win, 238-239 vos de código h e lp . c o m a n d o , 429
wiaach. 232 fuente. 12-14 h e r r a m ie n ta m ak e.
Ver tambUn llam a­ G nu D cB uggor Ver h e r r a m ie n ta
das (gdb), 426-435 m a k e d e GNU
fu n c io n e s, lla m a d a s GNU. h e r r a m i e n ta h e rr a m ie n ta s
o. 126. 193-194 m ak e, 33-53, 432 añada- formatos g rá ­
beneficios de su uso. fico» a, 313
G 34 base de datos de CD
g a n a n c ia . 281 invocación. 37-40 musicales, código
g a tilla d o . 294 rr.akeüies. creación fuente para, 464-
gcc. Ver GNU cc de. 35-36 495
g d b . Ver G n u D eBug- manejo de errores. bases de datos, re­
g e r (gdb) 52-53 cursos para. 512
g e n e ra c ió n d e a d ­ reglas, creación de. bastidores, recursos
v e rte n c ia s con 40-52 para, 511
GNU cc (gcc), 17- g ra b a c ió n d e s o n i­ científicas y m ate­
18 dos, 287-288 máticos, recursos
g e t, fa m ilia de fu n ­ g rá fic o s para, 512
cio n e s. 63-64, 67- añadir form atos grá­ compilación de. 7-30,
68, 73-76, 223, 242, ficos x aplicacio­ 426-427
245-246 nes, 313 contraseñas ocultas,
g et. fa m ilia d e lla m a ­ caracteres. 232 66
d a s a s iste m a . 122- form atos de archivo, corriendo en Gnu
123 503 DeBugger (gdb),
g et. fu n c ió n , 212, g ru p o s , p ro c e s a ­ 428-429
343-344 m ie n to d e, 76-77 creación de bibiiute-
, f J } ) ) ) ) } } ) J t f ) ) ) > t
52S Programación en Unux

cas p ara, 300-30-3 id e n t, c o m a n d o , 417- 19. 29-30, 139, 214


áaemon3, creación 418 Lnct, fa m ilia d e fu n ­
áe, 191-200 id e n tific a c ió n d e v a ­ c io n e s, 393
depuración de, 426- ria b le s , 434 in fo b re a k p o in ts , co­
435. 438-443 id e n tif ic a d o re s de m a n d o , 432
distribución de, *45- p ro y e c to , 344 in fo rm a c ió n s o b re
453.504,512 id e n tific a d o re s , 343 tiem p o s, en p ro c e ­
extensión de presta­ do cola de mensajes, sos. 69*72
ciones de, 313 356 in fo rm a r a c c io n e s
gzip. 51 de procesos, 62-63 d e r a tó n , 258
Ipedated, 198-200 de proyecto, 344 in g re so d e c a d e n a s ,
raake de GNU. 33-53 •Id irn a m e , o p ció n . n c u rs e s , 245*246
beneficios de. 34 14-15 in ic ia liz a c ió n
invocación de, 37- TDs d e g ru p o (GEDs), de argum entos clave
40 64-66 y valor. 208
malte fitas, crea­ tD s d e u s u a r io de conjuntos do pa­
ción de. 35*36 <UIDs), 64-66 ros do coloros, 250
manejo de errores ID.s e fe c tiv o s, 64 de ncurse3. 226-228
d i, 52-53 IDs r e a le s d e u s u a ­ in icio du p ro g r a m a s
reglas para crea­ rio y d e g ru p o . 6-1 en G nu D eB ugger
ción de makefi- Illogal o p tio n - m e n ­ <gdb), 428-429
les. 40-52 saje do e r r o r , 53 In it. p ro c e so . 62
recnmpilación des­ In ip le m e n ta c io a c s In it.p a ir, fu n c ió n , 250
pués do oxUínaión modificación 3111 va­ in itsc r. fu n c ió n , 220-
do prestaciones, ria r el código, 57 228, 265
313 p rocosos, 61 in lin e , p a la b r a r e ­
sctgid y setuid. 66- im p re sió n s e rv a d a , 23-24
67 do información de in m o d ific a b lc s. a r ­
Ver también recurso» archivo, comando c h iv o s, 160
HIVAL, v a lo r s u p e ­ rlog. 421-422 in o d e s, 147
rio r d e ra n g o en prim eras posiciones in sch , fu n c ió n , 232
se n te n c ia c a se do mem oria aso­ in s e rc ió n d e c o m e n ­
ran g o s, 24 ciadas con a rre ­ ta r io s e n m ak efi-
h lin e y h o rc h , fu n ­ glas, 430 les, 50
cio n e s, 238 in c lu sió n d e a r c h i­ in sp e c c ió n d e c ó d i­
h o s tn a m e s en D N S vos, o p c io n e s y a r ­ go, G n u D o B u g g e r
(D o m a in Ñ a m e g u m e n to s, 15-16 (gdb), 429-430
S y ste m ). 402-405 in c o m p a tib ilid a d e n ­ in s ta la c ió n d e t a r ­
h u é rfa n o , p ro c eso , tr e v e rs io n e s d e g ets, m a k e file s, 51-
84 b ib lio te c a s, 310 52
in d e p e n d e n c ia de in s ta la c ió n , se c ció n
I te rm in a le s , n c u r ­ (RPM ), 456-158
id. c o m a n d o , 66 ses, 220 in sta ll, co m a n d o ,
id e m , c a d e n a , 196 in d ic a d o re s íflags), 449-452
índice 529

insxaiación/desinst3- c h iv o . G NU cc. 9- to s, in ic ia liz a c ió n ,


la c ió n , s c r ip t, s e c ­ 10 208
c ió n d e (RPM ), 456 I n te rro g a c ió n a d is ­ k ey (clave), a r g u ­
in te rc e p c ió n p o s itiv o s m e z c la ­ m e n to d e fu n c ió n
de acciones de ratón. d o r e s d e so n id o m sg g e t, 357
259-261 p o r c a n a le s d is p o ­ K h a ttr a , T aj, 441
de señales. 102-114 n ib le s . 281-284 kill, c o m a n d o , e n v ío
in te rfa c e s g rá fic a s in v o c a c ió n d e s e ñ a le s , 99-100
d e u s u a r io (G U Is), de la h erram ienta kill, fu n c ió n . 88-89,
to o lk its. 504*505 m akc de GNU, 101-102
in te rfa c e s p a r a pro- 37-40 k illin jí (e lim in a ­
¡Tramas d e a p lic a ­ de 1a utilidad tar. ción)i, p ro c e s o s de,
ció n (A PIs) 446-448 86-8»
adm inistración de del comando install.
señales. 106 450-453
prcgram srión de jo- io ctl. lla m a d a , 279- L, o p c ió n . 421
nido. 277-294 280. 283 la n z a m ie n to d e p ro ­
socket Berkeley. [PC (c o m u n ic a c ió n g ra m a s e n g d b
3780-352 in te rp ro c o so » ) (G nu d e b u g g u r).
in te rfa c e s descripcióo. 321 428-429
de manejo de archi­ m em oria compartida la te n c ia d e d a to s . 19
vos. 138-154 (SHM). 341-374 lazo d e e s p e ra . 345
de MIDI i Musical IP C S y ste m V. 342- la zo s w h ile , p e lig ro s
In sin u n en t Digi­ 374 d e , 26
tal Interface). 278 IPC , o b je to s, 342 lazo s
de programación de IP C . v a lo r e s . 371-372 desenrollar, 19
aplicaciones <API) IP C . Ví?r c o m u n ic a ­ tipo ag u ard ar acce­
adm inistración de c ió n in te rp ro c e s o s so, 345
a ñ a les, 106 while, peligros de,
programación de J 26
tonidox, 277- J o n e s , B ra d . 139 Id.so, id e n tific a c ió n
294 ju e g o s , p ro g ra m a s d el n ú m e r o d e
de ratón. 258 de v e rs ió n d e l lin k e r,
de sonido, program a­ garillado, 294 302-303. 310
ción de, 277-294 recursos p ara pro­ Idd, c o m a n d o , 302
di, 313-316 gram adores. 504 LDFLAGS, v a ria b le
gráficas de usuario p re d e f in id a , 47
(GUI), toolkits, K le e r
504-305 K e rn e l, m o d o , 120 de archivos. 141-143
I n te r n e t, re c u r s o s K e rn ig h a n , B ria n . de F I f Os. 335-338
p a r a p ro g ra m a d o - 139 de pipes, 324-330
re s , 502-512 k e y (cla ve), a r g u ­ de .sockets de entor­
in t e r p r e ta c io n e s de m e n to d e fu n c io ­ no UNIX, 390-392
e x te n s io n e s d e a r ­ n e s d e b aso d e d a ­ de sockets de Pruto-
irc ce

- . ¿i
'
:
- ' ib •
iir-íi:u- tr '
IC ? I • • / ' V t . . i V <■( i m
-l II ' -•*’
• -i *• ' nr* 1 i i. • -

• ~ .11•- •I• **• s***i ¡ líTi'.nl il' • - i- ' «.


•TTK/ |.1*.| ,H' I ¡|

. rir i.^ -r tu n il* >


i*. l"-i *». |iii"...it: I
11r -I • 1 i •
M 'l'i 'V ( i . ..
trv í - 11'
l i l i í u i . 1 1 ,i>* i- ;t|. i. . • • .1 ' ' " ' 'UI.'
,i } ;; -i-i ' " *•
n' l i ft*:•
ii. ■ 'i M - m .■•» --i I n r . i . l i • ;i • ••></ i.. . .
■ '
• ••■•*■ , 1' t t r»- - -m i •! )«• • • - • •i' i ' «i
tu 1 1 ....¡; j:-i. :• i{ ls :
"i ** • . ti* .«ir i :•••*'
.. . t/ Vil .t : • ‘" I :;v -l
..I 1 | l I »!•• I (II 1-UÍiM - ■' ! ¡ -í
tlllilllL . .M U l.,1

,i. i i
, ;;; .
ÍV»| l'U-*)» 1 M. - •' r . i | •' " ii... -

ir. •. :fr«•» SMni/


,1» 'M.t | .•

: .is_.i l I
n m r i , 'i. >'
rv_\ '• Ji — ; i t :» • l . )• ali . r - ; «■
•i t
l*Vn . J 'T
I! r . ' i »•!'*•.• ’ i- rn 1 '
¡•lili • ' - „• .-
■ :
L;.;-'" > i ii
I I >1 ti - -1=? • •• '
• fllíl *1 I IV
;■> • At-JV i-t
¿r.i.'.i - .?* » •I O l'. j¡ r ’ C t . |’ I .
i*[.
, ) ) ) ) ) ) ) ) ^ 1 ) > ) > y > >
532 Programación en Linux

m odo c ru d o (ra w ), 243 D ig ital In te rfa c e N OM BRE .DESVA­


m odo u s u a r io , J20 (M IDI), 278 RIADLE. v a ria b le
m odo, p a r á m e tr o de mv, fa m ilia d e fu n ­ d e fin id a p o r u s u a ­
la lla m a d a o p e n . c io n e s, 231-232 rio , 42
139 n o m b re s
modos N de bibliotecas com­
ennode, 243*244 n a v e g a c ió n d e b a se s p artidas. 310
erado o sin procesar de d a to s B erkeley, de función, fijar.
<rr.iv}, 243 213-215 432
de archivo. 134-136 n c u rs e s , 220-274 de hosts. en Domain
descripción. 344 d e n e g a c ió n d e s e r v i­ 1V ane System
kem el y usuario, cio . a ta q u e d e, 177 CDNS), 402-405
120 N e tsc a p e , lin k e o de de señales. 94
m ó d u lo s. 302 b ib lio te c a s e s t á t i ­ n o m b re s, c o n v e n c io ­
m o u sc m a sk , fu n ­ cas, 16 n e s so b re
ció n , 253-261 N etuinrh P rotfram - bibliotecas. 15
m p r, d e p u ra c ió n triing series, (lib ro ) funcione3 de ncur­
con, 441-142 385 ses. 225-226
m p ro tc c t, lla m a d a , n ew _field y now- n o n -se e k a b le , tip o
12:5* 175,179 _forin, lla m a d a s , de a rc h iv o , 126,
m retn o p , lla m a d a , 271 321
123,180 n e w j t c m , fu n c ió n , n o r e tu m , a tr ib u to .
m sg, fa m ilia d e fu n ­ 265 gee, 23*26
cio n e s, 358-360, n e w .m e n u , fu n c ió n . n o ta c ió n d e c im a l
363-368 266 c o n p u n to d e d i­
m sync, lla m a d a , 123, n e w m a sk , lla m a d a , re c c io n e s d e re d ,
175, 179 137 393
m u e s tra s , 288-290 n e w te rm , fu n c ió n , n u e v a s v e n ta n a s ,
m u ltim e d ia , r e c u r ­ in ic ía li/.a c ió n de c re a c ió n d e, 253-
sos p a rtí p r o g r a ­ n c u rs e s , 226-230 257
m a d o re s. 504. Ver n e w w in , llu in u d a, n u il, se ñ a l. 100
ta m b ié n ta r je ta s 253-257 n u m e ro s e c u e n c ia !
d e so n id o nm , c o m a n d o , 300- de u so de r a n u r a .
m ú ltip le s a rc h iv o s 301 343
d e c ó d ig o fu e n te , No ru le to m a k e tur* n ú m e ro s
c o m p ila c ió n d e g e t (m e n sa je de de linea, establecer,
p ro g r a m a s co n . e r r o r d e ‘ta r g e t’). 432
12*14 52 de redos. alm acena­
m u ltip le x in g , E/S, n o -b lo q u e a n te , lla ­ miento, 392
169-174 m a d a d e E/S, 170 de revisión de archi­
m un, fa m ilia d e lla ­ n o -d u m p , a tr ib u to , vos. 410
m a d a s , 123, 175- 160 de señal, 94
177 n o ech o , fu n c ió n , 242- secuencia! de uso de
M u sical In s tru m e n t 244 ran u ra. 343
o de utilidad tar. 446 o p e n . lla m a d a , 1 23,
O . f a m il ia d e i n d i c a ­ —deiete. 449 1 3 9 ,1 4 1
d o r e s < fla g * ), 139 -Dt*oo=bar. 14 o p e n d ir , f u n c i ó n , 167
O , f a m ilia d e o p c i o ­ -E, 10 o p e n lo g , lla m a d a ,
n e s p a r a f o r m u la ­ -fS ¡e. 37 196
r i o s . 2 7 1 -2 7 2 -f, 414-415 o p t im i z a c i ó n , c ó d i ­
o b je to s c a r g a d o s d i­ -filag, 19 g o , G N U cc (g e e ),
n á m i c a m e n t e , 312- ^ .2 1 19-20
316 -ggdb. 14, 21 o p tim iz a c io n e s d e
o b je to s -Help. 30 c ó d ig o p o r o m i­
cargados dinám ica­ -i. 37 s ió n d e h i l o s d e
m ente. 312-318 -I<nombre_directo- p r o g r a m a , 19
IPC. 342 rio>, 14-15 o p t io n , a r g u m e n t o
o b t e n c i ó n d e la c o n ­ -jN. 37 d o l la m a d a o p e n -
d ic ió n d e s a lid a -k. 3 7 .5 3 lo g , v a lo r e s , 196
d e l p r o c e s o b ij o , 84 -1.414. 421 o r d e n d e b y te s, 392
o p c io n e s d e lin e a d e -L<nombre_direc to­
com andos n e » , 14-15 P
comando install. 449 -leuraes, para compi­ p n ck o d , a tr ib u to , 23.
GNU cc tgee), 14-22 lación con ncur- 2 6 -2 8
herram ienta m ako sea.220 p a d r e , p r o c o s o , 84
de GNU. 37 -Ifoo, 14 p a la b r a s r e s e r v a d a s ,
utilidad U r. 446-148 MM. 15 2 3 -2 6 , 4 1 4 -4 1 6
o p c io n e s •n. 37-39 p a n ta lla »
-ansí. 14. 17-18 -o file, 14 do «curses. 223
<, 11. 14 -O. 14. 19-20. 23, 29 trazado de líneas de
-d <nombrc_dirpcto- -On. 14 color en, 251-253
no>. 428 •pedantic, 14, 17-18 p a q u e te s , c o n m u ta ­
-d. 37. 52 -q. 42S c i ó n d e . 3 7 8 -3 7 9
de comando ar. 301 -r. 37, 414-416,418- p a r á m e tr o p ro te o -
de comando build, 421 tio n d e la f u n c i ó n
480 -s. 37, 40-42 tn m u p , 176
de comando install, -static, 14-15 p a r á m e tr o s
450 •traditional, 14 db, 206
ce comando Idconñg. -u, 413. 420 llags, parám etro de
302-303 -v, 15 la, función mmap,
de comando Idd, 302 -W. 14. 37-39 176
de coman do nm, 300 -Wall. 14, 17 modo, parám etro de
de función ñald, 271- -«■error, 15 la función open,
>72 -Wñle. 37 139
de GNU cc (gee), 14- -Wno-def. 29 para configuración
22 -W-:gn-compare. 29 de dispositivos de
de herram ien ta ma- -Wundeí. 29 sonido, 288-293
ke de GNU, 37 -x.12 pid. parám etro de la
> 1 i ) J ) ) ) ) l ) I i

534 Program ación e n Linux

función kill. 88 p ip o s c o n n o m b re , adm inistración de


protection, parúme- e q u iv a le n c ia con llam adas de. 122-
Ero de la función a rc h iv o s, 331 123
mtnap, 176 p ip e s sin n o m b re , atributos. 62-77
sig. parám etro de la 132-133, 322-323 cliente. 381
ftinción kill. 38 p ip e s, 132-133, 321- como xombie, 84
tuneout. parám etro 331 creación. 77-83
de la función se- po li, lla m a d a , 123 oliminación. 86-89
lect, 170 p o p e n , fu n c ió n , 328, manipulación. 77-90
p a re s clav e /v alo r, 331 servidor. 381
204 p o p s d e s d e la p ila , p ro g n a m e : C o m ­
p a ro s re ta rd o y acu m u ­ m a n d n o t founri,
clave/valor. 204 la c ió n , 19 m e n sa je d e e rr o r.
de inicial ización de p u n te r o s d o a rc h iv o , 53
pares de colores, 250 p o sic io n a m ie n to , p ro g ra m a c ió n a v a n ­
P a rk e r , T i m. 137 143-145 z a d a en el e n to r n o
p a u se , fu n c ió n , in ­ POSIX, b lo q u e o s, UNIX, 30-1
te rc e p c ió n de *e- 185, 3$4 p ro g ra m a c ió n de
ñalos, 105-10*5 POSIX, IPC , 342, 356 C o n tro l d e P ro to ­
p elóse, fu n c ió n , 329, p o st_ fo rm , lla m a d a , colo d e T ra n s m i­
331 271 sió n P ro to c o lo de
P e re n s , B ru ce , 438 p o ü t.m e n u , lla m a d a , In te r n e t (T C P /IP ),
p e rm a n e c e r a la es­ 266 392-405
c u c h a d e c o n e x io ­ P P ID . Ver ÍD d e p ro ­ p ro g ra m a c ió n
n es. so c k e ts, 383- c eso p a d re de Protocolo de Con­
387 p re p a r a c ió n , secció n trol Transm isión/
p e rm iso s d e acc e so , (RPM ), 456-457 Protocolo de in ­
151-153 P rim e ro q u e E n tra , ternet (TCP/IP),
p e rro r, fu n c ió n , 126- P rim e ro q u e Sale. 392405
128 Ver F rF O s de u u je ta s de soni­
P erry , G rcg , 139 p rio rity , a rg u m e n to do. 277-294
p e rs o n a liz a c ió n d e d el a d m in is tr a d o r p ro g ra m a d o re s , r e ­
E le c tric F e n c e. d e in g re s o a l s is te ­ c u rs o s p a ra , 502-
438-139 m a, 197 512
PLD <ID d e p ro ceso ), p ro c e s o h ijo , 62 p ro g ra m a s
62-64 p ro c e s o h ijo , o b te n ­ añadido de formatos
p id . p a rá m e tr o , 88 c ió n de la c o n d i­ gráficos a, 313
p ip e , lla m a d a . 324 c ió n d e s a lid a del, bastidores, recursos
p ip e lin e s (s e c u e n ­ 84 p ara. 509
c ia s d e p ip es) de p ro c e s o p a d re , ID compilación de, 7-30,
in te rfa z , 323 (P P ID ), 62-64 428-429
p ip e s con n o m b re , p ro ce so , ID del corrida en Gnu De-
133. Ver ta m b ié n (PED), 62-64 Bugeer (gdb), 428-
FIFO s p ro c e so s 429
¡ndlc© 535

creación de bibliote­ p ro to c o lo s o r i e n ta ­ RCS. V er R ev isió n


cas para. 301-304 d o s a c o n e x ió n . 379 C o n tro l S y stem
daem ons. creación p ro to c o lo s s in c o n e ­ rc s c le a n . c o m a n d o .
de. 191-200 x ió n . 379 420-421
de base de datos para p ro to c o lo s re sd iff. c o m a n d o .
CD musical, código de redes. 379-330 418-420
ftiente para. 464- Protocolo de T rans­ rc a d . lla m a d a . 123
49-5 m isión/ Protocolo rc a d , lla m a d a . 325
de base? de dates, re­ de In te rn et (TC- re a d d ir, fu n c ió n . 168
curras p ara. 512 P/IP), 392-405 re c o m p ila c ió n d e
de c o n lrü e ñ a í. 66 p rp id s. 43-49 a p lic a c io n e s d e s ­
depuración. 426-435. p s e u d o -c a ra c to re s , p u é s do s e r e x te n ­
438-443 231 d id a s. 313
distribución. 445- p se u d o -fu n c io n e s , re c u p e ra c ió n d e c o ­
453. 504.510 225 m a n d o s p rev io s.
extensión de las pres­ p u e rto * 432
taciones de. 313 descripción. 396 re c u p e ra c ió n d o ole*
gr.p. 51 para M usical Instru- m e n to s do sd o b a ­
Ipednted. 193-200 m ent D igital Inter- se s d e d a to s B erko-
make de GNU. 33-53 face (MIDI), 273 ley, 212-213
recompilación tras p u n te r o s re c u rso s
realizar una exten­ cursor y stdacr. 223 para programadores
sión. 313 de posición en archi­ de Linux. 502-512
recursos científicos y vo». 143-145 utilización de, proce­
m atem áticos para. p u n to n d u d e te n c ió n sos. 72
512 c o n d ic io n a l. 432 R ed H a t p a c k a g e M a­
setgid y seuud. 66-67 p u n to s d e i n t e r r u p ­ n a g e r (RPM), 453-
p ro lija d o , secció n ció n . e s ta b le c i­ 160
(RPM ), 456-460 m ie n to c o n G n u re d e s p o r c o n m u ta ­
p r o lija r ta r g e t, 40 D e B u g g e r (gdb), ción do c irc u ito s ,
p ro p ie d a d d e a r c h i­ 432-433 378
vos. 153-154 p u t, fu n c ió n . 208 re d e s
p ro te c c io n e s d e m a ­ almacenamiento de
p a s e n m em o ria, R direcciones.
m o d ific a c ió n de. r. o p ció n d e lín e a d e Protocolo de Con­
179 c o m a n d o s, trol de Transm i­
p ro to c o lo s c o n fia ­ 446 tió /i/ Protocolo
bles, 380-381 ra s tre o d e u n a fu n ­ de Internet (TC-
p ro to c o lo s d e d a to s ció n . 429 P tlP ), 393
basados en paque­ ra tó n , in te r f a z d e, almacenamiento de
tes, 380 n c u rs e s , 257-264 números de nodo.
p ro to c o lo s d e se ­ R a y m o n d . E ric . 56 Protocolo de Con­
c u e n c ia d e d a to s, res, c o m a n d o . 422- trol de Transmi­
380 423 sión/ Protocolo
, I ¡ ) ) ) } ) ) ) 1 ) ) 'I > ) }
.g r a...aC.V.J eti dnux

de internet (TC- R e v isió n C o n tro l s a lid a m is c e lá n e a de


P/IP). 392 S y ste m {RCS), se ­ d a to s , n c u r s e s ,
conexiones, 394 g u im ie n to d e m o ­ 237-240
conmutadas por cir­ d ific a c io n e s a l c ó ­ s a lid a , r u t i n a s d e ,
cuitos, 378 d ig o fu e n te , n c u rs e s , 230-240
conmutadas por pa­ 409-123 s a lid a . Ver e n tr a d a -
quetes. 377-379 re v is io n e s /s a lid a
protocolos, 378-379 de archivo?, 410 s a lir
recursos de progra­ exhibir diferencias de archivos, 139. 141
mación, 504 entre archivos de de bases de datos,
re d im e n s io n a r a r ­ trabajo, 418-420 205-207. 215
ch iv o s m a p e a d o s R itc h ie . D e n n is, 139 de descriptores de
en m e m o ria , 180 rlo g , c o m a n d o , 420- archivo, 194
refreg h , fu n ció n , 421 de FIFOs, 335
n c u rs e s, 223 RM, v a ria b le , 47 áe Gnu DuBugger,
re g is tro d e b a n d le r s rm d ir, fu n c ió n . 105 428
d e señ al. 109-111 RPM (R ed H a t Pac- de pipe». 324-325
re g is tro s c o rr ie n te s , kago M a n a g er), S a m s T each Y o u m c lf
elim in a c ió n d e sd e 453-460 C in 21 Dtiyx,
b aso s d e d a to s, ru , fa m ilia do m ie m ­ q u in ta e d ic ió n (li­
215 b ro s do la e s tr u c ­ b ro ), 139
re g la s e x p líc ita s, tu r a s d«* p a tr ó n S am s T each Y o u m e lf
m akofiles, 1 8 ru s a g e , 73 L in u x in 24 h o u rx
re g la s im p líc ita s. R u b in i, A le ssa n d ro , (lib ro ), 137
m a k c files, 48-49 258 S a v o lu in e n , H a n n u ,
re g la s p a tr ó n , m ak e- ru n , c o m a n d o , 428 279
files. 49-50 ru s a g e , p iitró n d e e s­ sb rk , lla m a d a . 123
re g la s, 35.40-52 tr u c tu r a , 72-73 scanvv, fu n c ió n , 245-
re p a r a c ió n d e p ro ­ r u t a d u ac c e so , p ip e s 246
b lem a s Itroublen- sin n o m b re y con SCCS (S o u rc e C o d e
h o o tin u ) n o m b re , 322 C o n tro l S y ste m ),
bugs. con GN'U cc r u tin a s c h d ir y feh- p ro g ra m a p a r a
tgcc), 21-22 d ir, 163 c o n tr o l d e v e rs io ­
problemas de memo­ r u tin a s d e e n tr a d a n e s d e c ó d ig o
ria, 435-443 d e d a to s , n c u rs e s, fu e n te , 409
Ver también d ep u rar 242-246 se cc io n e s, a rc h iv o s
re p o s ito rio s , 411 d e e sp e c ific a c ió n ,
re p ro d u c c ió n d e so ­ S RPM . 456-459
n id o , p ro g r a m a ­ sa, fa m ilia d e e le ­ s e c u e n c ia m ie n to ,
c ió n d e . 287-294 m e n to s d e e s tr u c ­ 379
re s e ñ a s , d ese m p e ñ o , tu r a s d e p a tr ó n si- SEEK , c o n s ta n te s ,
29 g a c tio n , 110 143
re u tiliz a c ió n d e c ó ­ s a lid a d e c a d e n a s , se g m e n to s d e m e m o ­
digo . 299 n c u rs e s , 234-237 r ia c o m p a rtid a , 346
Índice 537

se g u im ie n to d e c a m ­ desenrollar, lazo, 19 sig , fa m ilia d e lla m a ­


b io s e n el c ó d ig o s e ñ a le s p e n d ie n te s . d a s, 109-110,114.
fu e n te . R ev isió n 94, 114-116 123-124
C o n tro l S y stem se ñ a le s , 93-116 sig, p a rá m e tr o d e la
•RCS), 409-423 duración de, 238 fu n c ió n k ill, 88
se g u ir el v in cu lo . 134 llam adas a sistem a, SIG, so ñ a le s, 97-99
s e g u rid a d , re c u r s o s 123-124 s in c ro n iz a c ió n d e
p a r a p ro g r a m a d o ­ s e r v id o re s b a s e s d o d a to s
re s , 504 conexión a sockets. B erk eley , 215-217
s e le c c io n a r 383-388 sin ta x is
handlers de señal. denegación de servi­ SIdS. palabra re se r­
106-114 cios, 177 vada. 415
ventanas. ncurses. llam adas a sistem a, ar, comando. 301
233-239 121 attron y attroff. lla­
se lcct. U am ada, 123, syslog. llam ada, 196 m a d a s 251
170,345 sesiones como g ru ­ c, fam ilia de llam a­
som , fa m ilia d e fu n ­ pos de procesos, das y funciones.
cio n e s, 343. 368- 76-77 214-215
374 creación de. 193 casi* ran g w . exten­
se m á fo ro s b in a rio s . s e t.f ie ld .b u f f e r , lla ­ sión de sentencia
368 m a d o , 271 caso, 23
sem á fo ro s, IP C S ys­ s e t_ fic ld _ u se rp tr, lla ­ cloje. función. 206
te m V, 368-374 m a d a . 272 conoxiones a sockets.
*emi d ú p le x . 322 * ct_ m o n u _ fo rm a t. 383
sem i-d u p le x , ta r je ta s lla m a d a . 266 cursor, llam ada. 213
d e ftonido SETA LL, v a lo r del db opon, función,
descripción, 294 p a r á m e tr o , som id 206
grabación de so n id o d e la fu n c ió n sem - definición de v aria­
en. 237 c tl, 372 bles, 42
se n te n c ia s case, sc tg id , p ro g r a m a s , del, función, 210
sw itc h , 24 66-67 di. fam ilia de funcio­
se ñ a le s b lo q u e a d a s , se tsid , lla m a d a , 192- nes, 312-313
94 196 establecimiento de
se ñ a le s c o n fia b le s , s e ts o c k o p t, fu n c ió n . puntos de d eten ­
95 394-395 ción, nombres de
se ñ a le s e n tr e g a d a s , s e tu id . p ro g r a m a s , funciones y núm e­
94 66-67 ros de línea, 432*
se ñ ale* g e n e ra d a s , SETVAL, v a lo r d e l 433
94 p a r á m e tr o c m d de exec, función, 80
se ñ a le s n o b lo q u e a ­ la fu n c ió n se m c tl, exit, función, 86
d a s , 94 371 fork, llam ada, 78
se ñ a le s n o c o n fia ­ sh m . fa m ilia d e fu n ­ get, función, 212
b le s c io n e s , 343, 347- has_colors. llam ada,
descripción, 95 348 250
Programación en Linux

identificación de va­ das recursivam en- de. 191-200


riables. 434 to.43 depuración, 426-435.
Í£it_pair, función, wencloae, función, 138-443
250 261 distribución. 445-
mstafl. comando. s ín te s is d e fu n c io n a ­ 453,504. 510
450 lid a d . 57 extensión de p resta­
¡nvocación de GNU rin te tiz a d o r e s d e t a ­ ciones de, 313
« tgcc), 8 b la d e o n d a s , 278 gzip. 51
ioctl. llamada. 279 sis te m a s o p e ra tiv o s , Ipeáated. 198-200
tóü, función, 38 re c u r s o s p a r a d e ­ make de GNU. 33-53
!d, lomiiia de coman­ sa rro llo d e , 504 para contraseños. 66
dos. 302 S N D C T L _D S P _G E T '• recompilarión luego
roakefiles, reglas, :i.‘5 CA PS, c o m a n d o , de extender las
tukfilu, comando y b its in fo rm a d o s prestaciones. 313
función. 332-333 p or. 294 setgid y aetuid, 66-
tr'3^. fam ilia do fun­ s in te tiz o d o re s d e s o ­ 67
ciones. 357-358, n id o . 278 s o lic itu d e s
363-365 rtockaddr, p a tr ó n de de conexión, acepta­
nm. comando. 300 e s tr u c tu r a , 385 ción. 382-387
n o m b r e _d e _v a - so ck et, fu n c ió n , 381- de operación de des­
RÍAS LE, variable 383 plazam iento. es­
d efinida por u su a ­ so ck eta, 381-401 pecificando v enta­
rio, 42 s o ftw a re na. 239
PJP0. llam ada, 325 añadido de formatos so n a m e , 310
popen y pelóse, fu n ­ gráficos a, 313 SO IJN D JVUXF-R, fa ­
ciones. 329 baso du datos de C’D m ilia d e rn a cro s.
P u t. función. 208 musicales, código 280-281
resciean, com ando. fuente para, 464- S p e c ia l E d itio n
420 495 U sin g L in u x (li­
sem , fam ilia de fu n ­ bases de datna, re­ b ro ) 137
ciones, 368-371 cursos para, 512 S R C D IR , v a r ia b le
sbrnnt, llam ada, 348 bastidores, recursos rc o u r s iv a d e e je m ­
shrnget, ñmción, 347 para, 509 p lo . 43
Socket, fundón. 381 científico y m a tem á ­ .st_blksize, m ie m b ro
3ian_color, función, tico, recursos p a ­ d e e s tru c tu r a de
250 ra, 512 p a tr ó n s ta t, 148
sw itch, sentencias compilación, 7-30, s ta c k s (p ila s). 362
de, 24 426-427 s t a r t , a r g u m e n to d e
-ync. llam ada, 215 corriendo en G nu fu n c ió n m u n m a p .
sy siem , función, 77 D eBugger (gdb), 177
v ariab le de expan­ 428-429 s ta rc .c o lo r. fu n c ió n ,
sión ¿imple, 44, creación de bibliote­ 250
•389 cas para. 300-303 s t a t, c o m a n d o . 147-
'•'ariables expandi­ daem ons. creación 151
Indice 539

s ta t, lla m a d a . 123 sy stem . fu n c ió n . 69- n e t), 392-405


s ta ru s. p a r á m e tr o de 7 2 ,7 7 te r m in a r
fu n c io n e s w a it y ccurses. 228-230
w a itp id . 84 T procesos. 86-89
s td sc r. p u n te r o a e s ­ T. o p ció n d e lin c a de tie m p o d e C P U d e
tru c tu ra de po­ c o m a n d o s . 446 u s u a rio . 69
tró n WTNDOW, 223 ta b la s d e sím b o lo s. tiem p o d e C PU d el
sto p , c o m a n d o . 434 426 s iste m a , 69
Stev-ens, R ic h a rd . ta b la s d e sím b o lo s, tiem p o n o rm n ], 69
302.384 c o m p ila c ió n co n tim e o u t, p a rá m e tr o
s u b v e n ta n a s . c r e a ­ apoyo de d e p u ra ­ d e la lla m a d a sc-
ció n d e , 253-255 d or, 426 le c t, 170
SubW in. lla m a d a . T a c k v tt. J a c k , 137 tim es, fu n c ió n . 69,
253-255 ta m a ñ o d e v e n ta n a s , 71-72
s u p re s ió n de m ap eo s n c u rs e s , 223 tim e s ta m p s (m a rc a s
de a rc h iv o s. 177- T ape A rc h iv a r (ta ri, do fech a y h o ra )
178 446-149 m o d ifica c ió n e n
s u p r im ir ta r, u tilid a d p a r a a rc h iv o s, 158-160
archivos de trabajo, d is tr ib u c ió n de to o lk its par:» in t e r f a ­
«vitar d u ran te su s o ftw a re . 446-449 ces g rá fic a s d e
ingreso a directo- ta r b a lls c o m p r im i­ u s u a rio (G UIs),
n o RCS, 413 d a s co n irrip , 448 504-505
archivo* an tarballs. ta rb a lls . 446-149. Ver TO PD IR , v a ria b le
449 ta m b ié n a rc h iv o s re c u rs iv a d e e je m ­
colas de mensajes. ta r g e t ‘t a r u e t ’ n o t plo, 43
364 re m a d e b e c a u s e of tra n sm isió n d e s e ñ a ­
cursores, 215 e rr o rs , m e n s a je de les, 99-102
directorios, 165-167 e rr o r. 53 tra n s m is io n e s b a s a ­
elementos de bases ta r g e t p r e d e t e r m i­ d a s e n b y tes, 379
de datos Berkeley, n a d o . m a k e file s, T ra n te r, Je ff, 287
210-211 36 trazar lineas
registros com entó# ta rg e ta fic tic io s, ma- de color, en panca-
desde bases de da­ k efiles, 40-41 Uas, 251-253
tos, 215 ta r g e ts , e n m ak efi- especificar ventanas
semáforos, 371-374 les, 35-36, 40-41, para, ncurses, 238
sw itc h . s e n te n c ia , 24 51-52 tro u b le s h o o tin g (r e ­
sync, a tr ib u to . 160 ta r je ta s d e so n id o , p a ra c ió n d e p r o ­
sy n c . lla m a d a , 215 p ro g ra m a c ió n , b lem as)
sy n lin k . lla m a d a . 277-294. Ver ta m ­ bugs, con GNU cc
* 123 bién m u ltim e d ia (gee), 21-22
syseo n f. fu n c ió n . 71 TCP/EP i P ro to c o lo problemas de memo­
syslog, se rv ic io p r o ­ de C o n tro l de ria, 435-443
v isto p o r el dae- T ra n sm isió n / P r o ­ Ver cambien d ep u rar
m on sy slo g d . 196 tocolo d e I n t e r ­ tr u n c a d o d e a rc h i-
1 ) 1 ) 1 > ) ) ) ) ) ) > J ) ) ? )
540 Programación en Unux

vos, 145-147 p a ra depuración de option. argum en­


tr ú n c a te , lla m a d a . Electric Fence. to de llam ada
123 438-440 openlog, 196
ty p e. a rg u m e n to d e G nu DeBugger de variables, exhibi­
la fu n c ió n m sgrcv, (gdb). 426-435 ción y modifica­
363 mcheck. 442-443 ción. 432-433
mpr. 441-442 v a lu é , a rg u m e n to de
U para distribución de fu n ció n p u t d e b a ­
u, o p ció n d e lín e a de software, 446-449 se d e d a to s , in ic ia -
co m a n d o s, 448 u tim b u f, p a tr ó n de liz a c ió n , 208
UID s (ID s d e u s u a ­ e s tr u c tu r a , p a r á ­ v a ria b le s a u to m á ti­
rio), 64-66 m e tro d o fu n c ió n c a s, m a k e fíle s, 45-
uiim ic. lla m a d a , 123 u tin io 158 47
u m ask , lla m a d a , 137- u tim o , fu n c ió n . 158 v a ria b le s d e e x p a n ­
138. 193-194 sió n sim p le, m nke-
u m a sk s. 332. 359 V fíleSt 43-45
d e s in s ta la r. ta r g e t. v , o p c ió n d e lin e a de v a ria b le s d e fin id a s
m ak e fíle s, 51-32 c o m a n d o s , 446 p o r u s u a rio , m a-
UNIX BSD. 95 v alo re s k efile s, 42
UNIX do AFMT. fam ilia dé v a ria b le s e x p a n d i­
recursos de progra­ macros de formato d a s re c u rsiv a x n e n -
mación. 50<1 de audio, 289 tc , m a k efíle s, 43-
sockcts de entorno de cmd, argum ento 45
de. 385-392 do función sometí. v a ria b le s g lo b ale s.
u n lin k . lla m a d a . 123 371-372 126
u n p o s t .m e n ú , fu n ­ de error, funciones v a ria b le s p re d e f in i­
ció n , 266 de socket.. 381-382 d a s en m ak e fíles,
U sen e t, re c u r s o s p a ­ de facility y priority. 47-48
r a p ro g ra m a d o re s , argum entos de v a ria b le s
503 adm inistrador do alcance y contexto.
uKtat, lla m a d a , 123 ingreso al siste­ 434-435
u tilid a d e s m a, 197 de entorno, 45, 303
gzip. 51 de llags y protcction de makefíles. 41-48
make de GNU, 33 parám etros de fuera de alcance íno
beneficios do, 34 función mmap, visibles), 434
creación de make- 176 globales, 126
files, 35*36 de funciones w ait y identificación, en
creación de regias, w aitpid, 84 gdb. 434
40-52 de handie, argum en­ LDFLAGS, predefi­
¿avocación de. 37-40 to do la función nida, m ake de
manejo de errores. dlclose, 315 GNU. 47
52*53 do indicador, argu­ packed, atributo, 23
p ara creación de bi­ mento de la fun­ v e n ta n a s in d e p e n ­
bliotecas, 299*302 ción dlopen, 314 d ie n te s , c re a c ió n
> 1 ) >

ín d ic e 541

d e . 253-257 v ín c u lo s sim b ó lico s. w a i t p i d , lla m a d a . 123


v e n ta n a s , n c u rs e s 134. Ver ta m b ié n w b k g d , lla m a d a , 239-
adm inistración. 253- a rc h iv o s 241
•257 v is u a liz a r w b o r d e r , lla m a d a , 238
disposición. 223-22-5 conñguración co­ w e c h o c h a r , fu n c ió n ,
especificación de lí­ rrie n te de. mez­ 231
neas de trazado y clador de sonidos, w e n c lo s e , fu n c ió n ,
solicitudes de ope­ 231-284 261
raciones de des­ diferencias e n tre a r­ w g e tc h , fu n c ió n . 242
plazam iento, 238- chivos de trabajo. w h a t is , c o m a n d o ,
* 239 418-420 431
v e r c h . a r g u m e n to do p alab ras reservadas wi n , fu n c ió n , 238-
m a cro b o x . 238 de Revisión Con­ 239
v e r ific a c ió n d e tro l System w in s c h . f u n c i ó n , 2 3 2
s c r ip t , s e c c i ó n • RCS), 417-418 W o rld W id c W eb , r e ­
(R P M ) , 456 valorea de variables. c u r s o s f o r p r o jír a m -
v e r ific a c io n e s 432 m o r s , 5 0 2 -5 1 2
entrad a y salida de v o lú m e n e s d e m e z ­ w r i t e , lla m a d a , 123,
archivos, Rsviuon c la d o r d e so n id o s 325
Control System f ija r i n t e r a c t iv a -
> RCS). 411-412. m e n t e , 2 8 5 -2 8 7 X
422-423 fijar. 281 X W in d o w p l a t a f o r ­
errores, GNU cc v w s c a n w , f u n c ió n , m as 86,
(gee), 17-18 245 extensiones. 22
v e r s io n e s recurso» de progra­
bibliotecas, incompa­ W mación, 504
tibilidad entre w a d d c b , f u n c ió n ,
versiones, 310 2 3 1 ,2 4 2 Z
control de. Revisión w a i t , f u n c i ó n , 8 4 -8 6 z , o p c ió n d e l í n e a d e
Control System w a i t , ll a m a d a . 123 c o m a n d o s , 1 46-448
(RCS). 409-423 w a i t p i d , f u n c i ó n , 84- / i p , u t il id a d , 4 4 8
v fo r k . lla m a d a . 80 86 z o m b ie . p r o c e s o . 8 4
1 J ) ) } .1 1 > ) ) ) } ) > ) .) i ) > > i > 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
Educación O b r a m o s acercarnos más a nuestros lectores.
Po.- favor, complots y onvle por correo o fax esta tarjeta.

Título 3et Bbro:

A u t o r -----------------------------------------------------------

AOQvivrxío «fi. ■ ■■ ■■■ -----

SoSecocr^j los i e o a s Sos o u e io interesaría rsciOir información

□ OtvUgacKin Cie^tirioa
£

0
¿

Afimm^ra&On

Q econom ía
□ Maricíting

□ Eloctr6nica
*

Q C om putaoén

□ Negocios
l

Q Textos L n jw s-tB ro s

□ Otros
□ M anagem en:
^

£
1

_ ---------
----
. -----
Puesto: --------------------------

C.P.: --------
Dom cíjo.
Pax:

E-meH:
P learso n
E d u c a c ió n

Pearson Educación Cono Sur Fearson Educación de Chile


Av. ñeq.mienlc de ics Patñcxos 1959 Av Manuel Montt 1452. Providencia
( 12 6 6 ) Cap«al r^iorz. Tel. (562) 269 2059
Tsl (5-1-11] 4309-6 ?0C Fax '¡582) 27-1 S I 58
Fax (S¿-11)4309*615-9 E-mail: ¡r.fopearSpearsonetí.Cl
E-madc nta'3peafsoned.coin.ar
Pearson Educación d » Colombia
Pearson Educatlon S.A. Carrera G3 “ 22-55
Casa Juana de América Sania fii de Bogotá D.C.. Colombia
Av. 8 d9 Octubre :JC61 Tol. (571).105-9300
11 SCO, Montevideo. Uruguay Fax (571) <505-901 *
Tflb’Fax (02)486-1617
Pearson Educación Esparta
Pcareon Educatlon Carlbbonn 120 Nurtez do Balboa. Madrid 28006. España
Monte Malí. su¡to21-8 T«!. (3491} 590-3432
MuÁ02 Rivera Avenuo Fax (3491) 590-34.18
H a » Rgy, Puerto Rico 009:8
Tol. (737) 751 -1830 Penraon Educación México
r * * (787} 751-1677 Callo Cuatro No. 25 2do Pino
E-maü: 3wicar1b®carít».rvít y Fracc. Industrial Aleo Blanco
awiphprSUcaifeo.net 53370. Naucolpan do Juáror.
Estado do MÓJóoa México
Poarson Educación ControamCrlcrt y Tol. (52) 53670700
Panamá Fax. (52) 53870813
Barrio La Guana. Moravta
75 motma nano. Pcaruon Educngno do Brasil
Oal Ponen Ncru» col Club La Guana Ruó Emilio GoaldJ 747. Lapa
3an José. Costa Rica OSOG5-110 Sdo Paulo •SP, Brasil
Tai. (506) 23S 72 76 Tdl. (011) 861-0201
Pax (500) 280 65 69 Fax (011)861*0634
S-matl: onvwonrj'asal racsa.coxr

Vous aimerez peut-être aussi