182307480-programacion-en-linux-kurt-wall-pdf.pdf

  • Uploaded by: Fausto Flores
  • 0
  • 0
  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 182307480-programacion-en-linux-kurt-wall-pdf.pdf as PDF for free.

More details

  • Words: 263,333
  • Pages: 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

/ 519.68 WAL

datos de catalogaciónbibliográfica

Wall. Kurt Programación en Linux con ejemplos -1ª ed. Buenos Aires. Prenti ceHall. 2000 568 p.; 2-1x19 cm Traducción de: Jorge Qcria ISBN: 9S7-9460^9-X L Titulo - L Projroraación

Associate Publisher Dean Miller

Executlve Editor i e f f Koch

Acqufsltlons Editor G retch en G a n s e r

Development Editor S e a n Dixon

Editora M a n a Fernanda Castillo

A rm ado de in terio r y tapa P érez Villainil & Asociado* T raducción; .Jorge Gvrin Producción: M arcela M angareili

Managlng Editor Lisa W ílson

Proyect Editor Tooya S im p so r.s

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

Copy Editor Kozia Entísley

Copyright 0 2000, All R ighU Re*erv
Indoxor Cberyl la n o e s

Proofroadcr B enjam ín B crg

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

Edte libro no puede te r reproducido totul ni parciulm antc e n n in g u n a for n ía, ox por n in g ú r. medio o procedim iento, jo a 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 producción i m ol perm iso pravio p o r escrito do la editorial violn derechos reservado*, ed degal y const ituyu u n delito

Technlcal Editor Cam eron Laifd

Team Coordlnator Clnay T eeters

Interior De&lgn Karon Ryggles

Cover Ooslgn D uar.e R ader O 2000. PRA fiSO N EDUCATION S.A. Av. R egim iento de P atricios 1959 (126(J), Buenos Aires. R epública A rgaa& na 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ú. Im preso en Q uebeoor P erú , en el me3 de noviembre de 2000 P m n e ra edición: D iciem bre de 2000

Copy Writer Eric B o rg ert

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

>

J

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 ............... ........ — .....................................— ................................. 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 ...............................

P a r t e II

1 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 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 ........................................................... ......... ................ 5 S e ñ a le s ...............« .....................................................................

61 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 P a r te V'

13 Programación de T C P rtP y s o c k e ts ..................................... 377 U tilid a d e s d e p r o g r a m a c ió n e n L in u x .............................. 407 19 Seguim ientos de cambios en el codigo fuente: el RCS o Sistem a de C ontrol de Revisiones................................... 409 20 Un toolkit de 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

P u rtu I 1

2

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

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

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 .................................................... E jem plos...............................................................................

14 16

Extensiones dul GNU C ...........................................................

22

E jem plos......................................................................................

24

Utilización de e g e s ..................................................................

28

Mejoras a g e e ....................................................................

29

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

id U .

Ix

3

P a r t e II 4

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

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 ro g r a m a c ió n d e s is te m a s ................................................

59

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............................ .................................................. Program as s e t u i d y s e t g i d .......................................

65 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...............—— ............................................—.- .............. 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

S

6

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 ........................................................................... Definición de un h an d ler de ? e ñ a le s .........................

105

E jem p lo s.........................................................................

106 107

E jem p lo s..... ...................................................................

111

Detección de señales p e n d ie n te s...................................... Ejemplo ...........................................................................

114 114

L lam adas a s is te m a ............................................................ 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 Utilización do llam adas a sistem a .....................

7

119

121

122

Llam adas a sistem a comunes ....................................

122

Adm inistración de señ a le s.. ......... ................ ........... Códigos do reto m o de los llam adas n sistem a ......

123 124

E jem plos.......................................................................... 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

A dm inistración básica de archivos en L in u x ................. C aracterísticas y conceptos ........—...................................

131 132

El modo de un archivo ................................................

134

124

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..........................

8

139

A p ertu ra y d e r r e de archivos ........................................

140

Ejemplo ................................................................................

141

Lectura y e scritu ra de archivos ...................................... Ejemplo ................................................................................

142 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 ...... Ejemplo .................................................................................

151 152

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 ..................................... Ejemplo ............................................. ................................... Trabajo con d ir e c to r io s ...............................

U50 161

...

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 .................................................................... El turnando Id d ............ .....................................................

301 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.................................................................. Creación de una biblioteca e s t á ti c a ...............................

303 304

Ejemplo ................................................................................ Empleo de una biblioteca estática .................................

304 308

Ejemplo ............................................................................... Bibliotecas com partidas ......................................................... Construcción do u n a biblioteca com parada ...............

P a r to IV

308 310 311

Ejemplo .................................................................................

311

Empleo de una biblioteca com partida ..........................

312

Ejemplc................................................................................... Objetos cargados dinám icam ente .........................................

312 312

En qué consiste este tipo de objetos ..............................

312

La interfaz elX .....................................................................

31-1

Empleo d« !a interfaz U l .................................................. Ejemplo ................................................................................

315 315

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 ...................................... ..................................... • Pipes (conductos) .......................................................

321 322

A p ertura y cierre de p ip e s ................................................

324

Ejemplo ................................................................................

325

L ectura y escritu ra de pipes ............................................

325

Ejemplo ................................................................................ U na m anera m ás sim ple .................................................

327 329

)

)

XV

Ejemplo ............................................ .................................... F iF O s ............................................................... ...................

330 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 .......... Ejemplo .................................................................................

347 347

Adobamiento a u n segm ento de m em oria com partida E jem p lo s..................................... .......................................

34# 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

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

359

Ejemplo .................................................................................

E sen tu ra de un m ensaje • una cola

361

Obtención de u n m ensaju presente en una cola de m ensajes ........................................................................

363

E je m p lo ................................................................................. Manipulación y elim inación de colas de m ensajes ...

363 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 ................. - ................................

P a r te V

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 ................................................................................ U tilid a d e s d e p ro g r a m a c ió n e n L in u x ........................

403 -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 ................................. Utilización del método RCS .............. ....................................

410 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 .............. Ejemplo ......................................................................................

413 413

Opciones adicionales de linea de comandos

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

414

E jem plos.....................................................................................

414

Palabras reservadas de RCS ........ ........................................

415

S l d S ...................... ............................................................... $ L o g :m e n s a je S ................................................................ Ejemplo ................................................................................

415 415 415

O tras palabras reservadas de R C S ................................

416

El comando i d e n t .............................................................

417

Ejemplo ................................................................................ Empleo de r e s d i f f .......................................................... E jem p lo s.......................................... ................ ...................

417 418 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 ................................................................................ M emoria D e b u te n » .........................................................

436 437

Empleo de mpr y m check .................... ..................... —• Ejemplo ..............................................................................

441 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 A

497

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 ..................................................... índice tem ático ................................................................................

512 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 [email protected]. 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,
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 íírtema’ 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 sockets") 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 imbarible 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* bibliografíu e información adicional «obro programación para Linux. El Apéndice B i‘Herramientas adicionales de programación") proveo información sobre matenal 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
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 compiladon. 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 acv 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 probram 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. cumpilará, 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

TEMPLO

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: >• \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 subdirectono 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 cott^ 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, .i

Cócsgo fuente ce lenguaje C . cc

Código rúente c e lenguaje C*— Cócigo fuente ce C creorccesaco

continúo

Programación en Linux

Tabla 1.1. continuación Extensión .i i .S, . $ .o .3 . .so In v o c a c ió n d e g C C

Tipo do archivo__________________ Código fuente de Cv+ preorocesaoo Código fuente de lenguaje ensamblador Código oajeto compilado Cód'go do biblioteca compilado p aso a paso

En el p n m e r ejemplo, hubo m ach as cosas que tuvieron lugar do m an era e n ­ cubierta y el lector no las vio. g e e prim ero corrió h o L a. c por el prcprocesador, cop, para expandir cualquier m acro que pudiese h ab er e in s e rta r los contenidos de Ion archivos incluidos m 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 ¿tapaUro 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

¿M¿

o ar:ni»o_jaI:fla

) ai program a h o la del ejemplo anterior, avance paso a paso a tra 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 •_

•* :* m m t **»:pcs

íTalioá

po j )

:

ts o a t fpos_t

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

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

i-".: fcrfOT

( R t i *_straart| * _ straan|

{FÍLt •_stre a a )

ítíe m *ci<: c:ci',err_.cio
e i:» rr

;

;

i^IL* *_ü rs a ir ;

cPI!_£ * _ a t r ís ii)

» ir - i'_ .o ;c c « ¡ c

e«:en*, voia par**" i_coost

i FI lE

¡

* _ stre a B l

•_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 12

t

t

r

i

,j

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 linkeario t entro sí para cre a r n o m b ro p ro g ra m a . * ,,

v /iE ) ^ pgí

E je m p lo

Supongam os que so desee com pilar n u e v o * h o la , que utiliza código prove 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 encabezado. 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

2 '•;rr*:

13

" 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

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

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 Compltor sm OnkOúf. Defino un macro de proprocoindor f oo con jn valor b a r en la linnd J'» Comando». SllOa 'a ruta de acceso oí directorio espociricooo on < -u ta _ d ir •ii comlen/o de ia lista de directorio» en que gcc busca los ar­ chivos .i incluir por la proaancia do directivas « I n d u c e

-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 • lfo o •5

Unkea bibliotecas estáticas. LinKea ia biblioteca foo. incluyo en el archivo binario información estándar ce depuración. 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.

ggcb -O

-On -a n s í

Optimiza el código compilado. Esto es equivalente a especificar - 01 . Especifica un nvel ae optimización n. 0<*n<*>3. 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. 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 aiseñadores fiel C originan. Suprime ccdos los mensajes de avenencia.

tra o itio n a l

W

-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
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
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
:/ 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_atD 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 .

eiEMPio

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í: 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

*1 _ ;

r

17

■^ 5 V £ ja o Iá _ Iic

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*
-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:



s a lid a

In funcUon

M in ':

s«dant.c:6: «am ing . raturn tyjx of ‘ naln1 la no* 2.

int*

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 s a lid a

c

doca not su p p o r:

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

lo n g '

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 * — -•* s a l i d a

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

lo.ng lo rg *

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 ompleo 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

)

/

rel="nofollow">

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: 1

}

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

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

i - 5; prllUf< t - 0;

ií; , l|¡

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
E je m p lo

ejemplo

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 tamaño dei programa no-optimizado. S qcc -03 wnsajes.c nostrar.c -o nuevoJioia 5 is - i íiuevojiola ■ x

SAUOA

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

OPCIONES DE DEPURACIÓN

21

'

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 |T *

;:c •; *oí*.e •« HoUjj 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 rosponda al e stá n d a r ANSÍ/1S0, algunas do estas extensiones pueden so r m uy útiles P ara en co n trar un tratam ien to completo do los extensiones del pro­ yecto GNU, el lector con inquietudes puedo referirse a las 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 espocifcadorea 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íaero. elim inando así el costo de una lla m a d a a 'ana función. Las funciones inUne 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 iuncionws que no reto m en g c c I* perm ite j uno especificar ol a trib u to n o r e t u r n pura dichas funcior.es. que actú a como u n a joi\al para que el compiludor op­ tim ice la 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_*
! ' «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 siguienteYAí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 ( IIM P I.0

l Este ejemplo ilu stra «•! empleo do la palabra reservada m l i n e . El progra­ m a ite ra por un lazo 10 voces, increm entando una variable con cada 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 ;

l

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 estn 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

•«■«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 s iio o f(c ía r) • S );

“ei t lu A o

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

t i a u r s*$uM c,*rr«$:a{5| - W & ytW \iT, *1 ta*ar.o ss

• rasaros ccficarativcs 2a i « fpriíir? s :i« ¡* oar
j n « f j'MCte<5|; rerum a, i

* *

ion? - se aytesi-i', si;esr(ls<\g) rel="nofollow">¡

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

2os «itr-jc turas

•!

*1 taaaftc aa La estructura conpacTSfla -

há aytas'.n',

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

27

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
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 ­ crcg.- 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 ObtemSie r i e s-’J o a = ó e s e g e s . se-^á ;a '.e -^ cr- 2.35 de g c o . t o

e g e s « to talm en te com patible b a c ía a tr á s con g c c , de modo que todo ¡o que se dijo en este capitulo sobre g c c tam b 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 uinnuñ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
- 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 consinacció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 j editor sit'efiáo eor-»ie
)

}

i

)

. i . »

;

)

/

)

f

)

>

>

>

J

Program ación en Linux

E je m p lo

E JE M P L O

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

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

37

*

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 n I n o = < ir « _ d i r 5

«

Hf i l e r d i

•«

• jn

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). zst-'tx los comandos que ejecutaría make 3¡n en realidad fijecutartos. útil cara eomorobgr un makefile -irtaco ncr-bre^tíir 3 13 '.sta de directoros Corda bu 3 car$ nake os makefiies incluidos. 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. 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. Deshao»i'ta todas tas reglaa integradas en ma*e. Imorwre gran cant-dad de información para depuración, 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.

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 •:c

• 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

rzi j Udf«nM]«3.: -5 ío s T r ir . c -ü -I . -i., -ia e n s a jíá

La o p een -tfn o n _ a rc h iv o le indica a m ak e que 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.

,

40

,

/

I

t

t

/

)

I

t

t

I

I

I

)

)

t

t



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

SAUOA

cc -g cc

s e c a n :.c

-o podan*

rc stra r.c nen3a;*?s.c -a mievoJióU

-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*

cc

-g

no_rstorno.c

: s r.ot ' í n t '

-o oo_retomo

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

c< '5

g

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

•« conpac ta»-

-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

c j c m p io

.•••4 .* • • ^

I Referirse p ara este ejemplo al m akefile a n terio r Sin el ta rg e t .PHONY, g en al directorio c o m e n te ex istiera u n archivo denom inado p r o l i j a r . el tnrg C t p r o l i j a r no funcionará correctam ente. wwc» x o lija* i 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 *-

SAl~ A

£1 comando especial .PHONY p r o l i ] a r obligó a make a p a sar por alto la presencia del archivo denom inado p r o l i j 3 r. E n circunstancias o rd in arias. lo mejor 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
y

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

volcar : ecnc S(PRCGflA
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 make m u estra en p an talla los comandos a m edida que la5 va ejecutando. En ausencia de • s , la saiid a hubiera sido: S w * velear aere flr&gi cr:g2 prcg3 prog4

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 rel="nofollow">.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 •{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.
Como seria de esperar, make detectó ol empleo recursivo de CC y se detuvo.

rel="nofollow">

j

) . j

) ,

)

) .

) . ;

/

i

i

i

>

*

f

f

j

1

*

t

>

Capítulo 2: Control dei proceso de compilación: el make de GNU

1

45

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

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

s-

^

CC *= -g

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

s P .\j S4Ll DA

^

c

0 rtlí'-s

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

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

Este makeBle u tiliza lu variable SHOME que hereda de la in terfa z como p arte de una regia p ara construir el ta rg e t fo o . ( JCMPLO

•W . SlHC«£[/?OO.C JCC $IH0M£¡.•fOO.C

a f c A » »

0 S{NO*l/fOO

*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

1

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

óopondonua do

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

ARFLAGS

[nc/cadores oera el pregrama de msTtenir*entO -ie innivos compactados

rv

ASFLAGS

Especficacoíes de opciones cara el ensarrblM Cí

CFLAG5

Espec»fic8dorBS

CPP^ l AGS

£soecr?cacores ce cocones oara c¡ prepracesador Ge C No nay

l OF-AGS

Espea Piadores de coclores cara e¡ linker

ce oocores pera el compilador de C

•f

No hay No nay

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 tine 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 &? $
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

eje m p lo

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

1

l

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

49

S Jici ce

c:

-e s r s ic s .c -a c«Di4 s.o

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

EJEMPLO

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 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 arehivo 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) $
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

gcc j a u d a

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

o irtprpids

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

m n 'i o

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. nou . M lj.c i n i t í i l : n o li

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

n e i*

’ .o

: z n

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

h o la .c

-o r o is

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

* * «0*

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

) 52

j

,)

)

)

i .)

i

)

)

y

)

)

>

)>

f

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<-
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
Lo que viene Este capítulo le presentó al lector d comando m ake, explicándole por quó rosulta ü 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.

• 56

;

/

/

/

/

v

J

Programación en Linux

El programa de base de datos de CD musicales proyecto que se com pletará en este libro es u n program a de base de datc> p ara CD musicales. E n realidad, el mismo ya se en cu en tra completo. £1 lec­ tor irá recorriendo su 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. £1

He tratad o de hacer este program a lo m ás m odular que fuese posible, se p a ­ rando por lo tan to la in terfaz do usuario del ad m inistrador de base de dato s y colocando el 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 CBencuil 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.

J

l h » x / s x h t d - ¿i

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* tiempoejocuchui 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íslení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 pad 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 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 aplicacicí'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

10 do

p id _ t

g e tp id ( v o id ) :

padre dn proceso ■Ddo usuario real

p id _ t uí<j_tg

g e tp p id ( v o id ) ;

10 do usuario

u id _ l

g e te u id (v o ld )¡

proceso

10 do

10

afectivo

de grupo ro.V

10 do

grupo ofectlvo

F u n c ió n

g e tu id ( v o id ) ;

g id _ t

g e tQ id (v o id );

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 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 *

EjeMPLO

. . f» .*J@c ••••• ^

SALIOA

: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 GIDs seguirán coincidiendo, como lo muestra el siguiente ejemplo: 15 5U ¿B_:«CtQr Psss»aro: $

1C .n_Iaccar

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

.;U -ia a (U lJ4 -i0 1 ) gi*0UC*=lWlU5uarÍ03>

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 hac e a ig u a la s a i L'ID y G ID de! arch ivo e n lu g a r di- a ;<*. del p r o p ic ia r o . gi c o n tra ejecu ta n d o ol p rogram a. El propc p rogram as s e t u i d y s e t g i d e s otorgarlo p e r m iso s e s p e c ia le s al v isu a n o q u e e s té ejecu ta n d o el program a. Por ejem plo, co n sid erem o s el p rogram a p a s s w d , u tiliza d o para m odificar c o n tr a se lla s


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'~



/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 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 . 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 &3

.1

r

/

/•

f

y

)

/

/

,t

t

y

/

t

f

<

)

}

I

J

1

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>

/

«inclutís =:nclu 06

t

[

f

w

d

í

y

(¿pmi.t&f

in r *aln(v£id)

( :nar *nor._3cce30.¡

s trjc t 53S5»d •auntecojé?' /• Obtención d e l nonbro de lf((rv3R.acceso *

ceso •/

getloginnl) == w u .) <

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

r ¡Cuidado: */

>

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¡:
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)

1

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 procesadó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 ma*. oa* 120.

‘ Qué

es una llamada 3 siste­

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 ostirvai cuaJ Unut trata o* contornar, soto especifica tim e s . Sin embargo. «tary-ytra a !ai y a {r y ? a < iy ti una daaenpaín m ía compteu» úe ’a utilización ríe ro­ tunos por parta o« un orocnce 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 ejecuciSaTf 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

70

<

)

J

t

)

I

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 í» «includo «uniste.R>

/;

»aio calcuiar_sot^ndo*(«)*r \

/

In t MUifvoWl

i

V

^

H f'*'

clccK _ti;

/

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

'H 'i

1 * * 6 ° '

JU. ce*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; p rin tfC V s ; w .2 í segundas\n*, escena, (flo s t! tic s insumidos

:ics_3or_s35.; i

-)

M ,

V

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»

ds CPU(Kr«icario: se C*J ocf( i s t i a : 2* :.-oc»50 lítjo jío di CPU K - ¿i-jjrip: ■jsc á* ZP'J pori m t u :

usa

ljo

a.M s*5u*ao* 3.08 g u r í e s Z.3* seguraos 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 eostantex 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» { cel procoso psore • (u-usar}/ clodt_t tt * .u tt* ¡; r Tlenco a* JSC oe clock_t tes s t i « ; ls=syst«oT’ /

r rieapc 3e uso ce

t= s_c-jtit«; (c=dulflfen) *

/• *le o » <39 UM a*

zlockjc ¡CsefcUsraj.*/

/• Tieoco Ca a$0 de

>; Ins¿*o. estos vs'.ores ¿on ñcs de reloj, no e l núm ero de segundo.-:. Pa ra conv 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_~ICSJ1E 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. , 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; long ru_naxjorja;

l ‘ tannfto de ««n o n a corpartlda •/

-u.MXiarj*;

/• tataflo do datos no conpartidoa */

long r u _ * l n f l t ;

I ' toiraAo do p ila 00 coapartlda V f rocíanos do paginai •/

Isng r u j i a j f l ; ;

/• fa lla s do pagina »/

long rujmwap;

/• pornutaciones •/

Lon-g

long ru_tr.oiock;

/• operador,os oe entrada on 0103.10 •/

long •‘u jjyb lo ck ; long '■u_»»g9«j;

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

ieng r u jijg rc v j

y

long ni_nsignaii;

r iertalus rocioidas •/ r ospaciflc3dore3 voluntarios ce contexto v

.ong ru„nvc*«; long "ujUvcsw;

nensajes ríjciDiaou •/

.*• 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;

lortfl

tv jis o c ;

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

/

/

/

/

/

/

/

/

'

/

^

/

.*

•'

#'

Caaííulo 4: Procesos

1 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 Origirar. 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»

1

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 * ) ;

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

y

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
} vais o icu lir_j40unoos(dur ’ cact^a. l
( prirtf(*% s: Hl2\n*. ;»a«ca. v»Ioc_ofeíefllOo);

i 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 bnrgo. 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 íi'.iJ 2ü>2 ’srtiT ácicres Cí sagina: •

, <

♦ji v i “»

;

' .f

.

> '3/^

T ai como lo d eia a z claro la ¿ alid a de ¿*ca corr-da de m uestra. la inform 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. Supongamos, por ejemplo, que el lector c ó m e s e la pipeline (secuencia"de pipes) de co­ mandos l s -1 / u s r / i n c l u d e ¡ S O rt | 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
/

/

/ / . /

/

y

/

/

/

/

/

/

¿

Capítulo 4: Procesos

*

s

j 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 estuv i» e n corriendo en u n a term inal X Window y se cerrase la v e n tan a del term i­ nal m ientras las mismas estuviesen 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 implem entado por las diversas funciones w a it. C r e a c ió n d e p ro c e s o s

Loe program adores necesitan a m enudo cre a r nuevos proceso» desde den tro de mu* program as. Por ejemplo, aupongaraos que usted ere as o un program a que adm in istre u n a base de dato s d e 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 rel="nofollow"> , 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 ocurrie 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.

.i

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 padre. y reto rn a Q_ai proceso hijo. Esto significa que a ú n si uno llam a ra a f o r k una sola vez, la m ism a re to m a dos vece». El nuevo proceso que crea f o rx es una copia exacta del proceso p ad re, ;.-xcepto por su PID y su PPID, f o r k realiza u n a copia'complet.a del proceso p a ­ dre, incluyendo los UIDs y GlDs reales y efectivos y los IDs de grupo de pro­ coso y de 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 ’ /• e it M i* v o

V

/•

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

V

Capítulo

Procesos

79

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

g etsid.'H ; 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 tumbié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 cnrrien d o en ese m cmsr.tó en el siste m a o porque ei proceso que tr a ta de gene­ ra r procesos descendientes h a excedido e'. 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.

/ '

80

/

/

y

/

i

>

J

)

/

)

}

)

)

)

)

)

)

)

)

)

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
Í

ln : o*od«(coi»8t char *pa:h, somt cnar *arg. criar «const«nvp|); tnt 4<«cv(cor.s; char *path, char *con»t argv[||; tnr *x*cv*(const cnt *iiacvplconsi

char char

‘ satn, char ’ cons: jr g v J ], char‘ conit«nvp||i; char 'const *rgv(}>;

e x e c reem plaza com pletam ente la im agen dol proceso que efectuó la llam a­ da con la del program a iniciado por e x e c . En tan to que f o r k crea un procv so nuuvo. y por ¡o tan to 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

#¿.TCluCt «anista.fi» linCigO# <sttflib.h>

81

^

•m ciüCf < stdio.n» int *ain(
{ 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 p

s /*»K»t M k if U tH * r > t

g*tn«M.C

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

s r p r i d i .c

r*su» 0 2 .C

''tiv tti.C

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

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

E------lEMPwO , .

testeffv.c ■/

V '

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

83

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
/

í

>

/

y

f

y

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 ;

J.

tiL:(Ei:T_9XC£SSi;

}

X *coiv3lci6rt, 0J¡T

lA

1

C~

"& 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);

. r r-c

y-tx' •

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 -
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 kernel, que cierra archivos abiertos, libera recursos de mem oria y lleva a cabo cualquier o tra ta rea de lim pieza que sea requerida. Como este libro supone que sus lectores poseen conocimientos de C, consideramos que la 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

¿¡D CiCMfLO

El siguiente program a m uestra el com portam iento de la función a b o r t * Hctizn á»l jr jjfiM «o in tí^ K f abort.c ^ f • iw t ir .c

• > a -,«s :fa l i ü t t M i i u i : « o a iSort

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

•nt ati-nhoiSl < itxjrto; • El 3r 5í.*ia2 na c s M 'ia ü c£4r

•/

t«i:tE*:'_5JjCCcSS>;

> p ’i t K r '• • •' ^ sabida

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

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

/ 8S

/

j

y

j.

j

f

y

.1

/

,/

\

/

f

i

r

)

\

i

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
> *Ui í r U t i U n r ftNOHANG w a nacer retornar a wait ínrediatajrsnta •/

;

i

)

t

j

)

)

i

)

Caoituio 4: Procesos

i

)

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 asmcró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 POSCC 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-

/ 96

,

>

(

t

/

i

I

7

'

>

f

)

)

»

•'

1

'

1

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 a b o r t deí sistema (POSlX)

Proceso termina y graba una imagen de ¡a memor-a (core dump)

SIGALRM

Una señal ce 3portad ara {títmr signad gororada por la función a ia rm del sistema (POSlX)

^rocoso termina

SIG8US

E' proceso trató de utilizar memoria mal alineada o sin alinear (4.2 BSC)

Proceso termina y graba una imagon de la memona (core domp)

SIGCHLO

Un proceso hijo se ha detenido

Ignoraría 0 terminado (POSlX)

SIGC0N7

El orocoso debe continuar 5l está detenido (POSIX)

Continuar (ignorar si el proceso no está detenido!

SIGEMT

Error tío bus

SIG FPE

Excepción de punto flotante (POSlX)

Procoso termina y graba una imagen de i« mamona (core dump)

SIGHUP

Proceso recibid un corto de linea on su terminal de control o su procoso de control muñó

Proceso tormma

S IQ t L L

Comnndo nogal (POSlX)

Procoso termina y vuelca (graba) una imogen ce lo memoria (cona aumo:

{HafdVraro)

Proceso termina y graoa una Imagflrt de la memono (coro dumpi

S IG IN F O

_o mismo que SIGPWR

Ignoraría

S IG IN T

Ü3uario gonoró una ¡ntorrupcór. de teclado (POSIXJ

Proceso termino

S IG IG

Se recibió E/S asincrónica (4.2 BSD)

Ignorarla

siGior

Error de E/S. Igufll aue SIGABRT (4.2 BSD}

Proceso termina y groba imagen do la memoria (core

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 un arch/va

Procoso termina

S IG P IP E

Procoso trató do escribir a un conducto sfn lectores (POSIXJ

Proceso termina

SIGPOLL

Ocurrió suceso encuestaole (Sistema VI

Procoso termina

SIGPROF

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

(Junio)

continúa

)

)

)

)

)

)

)

)

j

i

y

t

)

i

)

)

)

)

)

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

i

J 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 de suministro eléctrico ( S is te m a '/)

Ignorarla

SIX U17

Usuario ge-em ung sai^a

Proceso termina y graba una imagen de a memoria (cora dume)

ceses e tsd a d o ;P03IX) SI&S5GV

Proceso trató «e reíereroar memona

Proceso termina y graba ura msgen de 13 memora (core ¿ump) msccesi&ie (POSIX)

S IG S T K -L T

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

Proceso termina

S IG S TC P

S e t o 00 ceteooón !.POS«?

Detención, ignorar

S IG S YS

Argumento incorrecto pasado a njtina

Proceso termina y graba una 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 detención generalmente Curarte una depuración de cód'goj (POSJX)

Proceso termina y graba una imagen de ia memona [cora /htnio)

S IG TS TP

Usuano generó una detención desde ei teclado tPOSiX)

Detención

S IG T T IN

Proceso trató d*'eer desde s t d i n mientras corría en seguido >4no (POS>X)

Detención

ro se puede ¡nterceotar o

S IG TTG U

Proceso intentó eseno^r a S td O u t mientra» corría en segundo piano (POSIX)

Detención

SIGUNUSED

Sertai no utJtiaca

°roceso termma

SIGUfiG

Conooón de urgencia en un s ocK e t (4 2 asoi

lgpor«rla

SIGtiSfiT

Se*a< I definida por ei -suano (P O S «;

Proceso termino

SIGUSA2

SV-aJ 2 dtftnála por el osuaro (POSIX)

Proceso termina

SIGVTALñM

Alarma de ntarvaios expiro (4.2 3S0)

Proceso termina

S I Srt I NCM

3 tamaño de una ventana temí mal cambió (4.3 3S0, Sun)

Ignoraría

SIGXCPU

Proceso excec.ó a cancdad re ¿ampo ce CPU Que COtfa utilizar (4.2 5S0)

Proceso termina y graba una magen de :a memona fcore dump)

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 cernina y grab3 una imagen de !a memoria (core dump)

Proceso trató ce acceder o m a n ic u ia r u n a rch iv o m a y o r q u e ei 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, incluyundo SIGEMT. SIGCLD. SIGINFO y SIGLOST. no e stá n im plem entadas (¡por lo que ol hecho de que no obBtanto so en cuentren docum entadas on la página 7 (señales) dol m anual constituyo un misterio!). Los siguientes pArrafbs 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 *¿nclufl« « K t Jio .n * t i a z l M < s : 2 l;s .rv >

inr asm
tsnurasion */

5 ;

• C irc o

¿ to s <M un a ID n j í jr. d ifllc o para s i ca ro 2a

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

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

} sis* {

í

• i : srogniea » áccaentra er s i oroetse " i j c ‘

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 «impló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

S A II0 4

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

El empleo de la 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í*

«í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

/• E nvU r ufta

maro"/

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 «a iip id (h * ]o , JJüU, <J J;

ae salida 'I

„____

102

Programación en Umix

y 9xit!tX rr_3X Cc33);

f

) E stá es la salida que se obtiene de un p a r de ejecuciones de este programa: i Joatitiijó í.ivianco S:í>0<'.0 a a n £ 1 proceso 071 toáavia í x ís h

M I____ ja u o a

E lin ir jn d o 871 « ,/oatafii.)o Enviado SIGCW.0 a 979 El {irocuso V9 todavt*
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 siroplT 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 , 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 temporita 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 n rM H

.0

1. E ste program a establece una alarm a de cinco segundos, después de lo cual term ina. /• 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 » :
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 !• toao par* la alarva íi p i r * •/

s u fic ie n te •/

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

^ SAU^

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

E ste program a establece una alarm a de cinco segundos, observa si ya su haoí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 c l c ck* (.reloj despertador/ lo generó el k e m e l. no el program a a la r is a . Por « a 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 p a ra cancelar la segunda alarm a.

J

104

I

)

/

J

Programación en Linux

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

r

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
£ 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

)

)

>

Capítulo 5: S eñales

)

J

) 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 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, inicializa 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 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 108

)

1

)

.

)



)

,

)

)

)

.

)

)

J

)

)

)

)

)

1

)

)

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«rrorr9_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* ) ;

J

)

i

)

i

i

)

)

)

i

)

)

)

)

?

y

»

t

)

)

)

y

>

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

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

i

109

*'

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

y

>

110

t

)

)

)

)

)

)

)

)

>

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 comportam iento exacto dei mismo. E je m p lo s

1. El p n m e r ejemplo M n ollam eote bloquea SIOAU^ 7 SíGTHflU sin proceer 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 */ •ircltffl# <S43rai,.t>

8iocy«* un coo'ufl» se

*lAc!utf« <jMU6.n> ♦ircluO*

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 í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) ; m t caln (vú id )

<

/• lanQ lu r de señales

)

?

}

)

)

)

)

}

)

?

)

)

1

)

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

1

)

>

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
< 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? $(pldo? [■<111 tntercsotasa S10USS1 S A L ID A

.1 01c<j'jear_usuarío| |

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
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 protonpada en < s lg n a l.h > . El prototipo de s i g p e n d in g ‘ s es: tn» u-j8endi.ig(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

V » me lúa e <sys/typfts,h>

D lv e r t ir ^ n to con sigp en d in g

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*
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
>

>

rULv»

1

'I

)

)

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

)

}

■)

)

)

)

)

)

)

>

>

)

5)

5

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

/

120

I

}

-

)

'

)

*

-

)

'

)

}

)

'

)

)

'

}

)

)

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

l ... . . , 1. - ^

Obviamente, un sistema operativo Linux ostá compuesto de m uchos cientos de porciones do código, tales como utilidades y program as de aplicación, bi­ bliotecas, controladores de dispositivos. Iiiesy3teras, compiladores, interfaces GUI 'grsphicaí user inizrfacs), administradores de ventanas y, por supuesto, el propio kernel. Sin embargo, codo esto 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^ do llar aLsiatema en-.síT r-— El código de moda kenwl aunque so encuentra protegido de los efectos pottmci al monto devastadores de loa programas de modo usuario mnl osen tos, tie­ nen total acceso a todo el linterna. Puede ut ilizar, o inutilizar, cualquier coso. EjomploH de 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 ite .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 aplicació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 funció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 irrelevantc. 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)} ( tetara V I' Tuvo lugar un error, aiísinistrnr aquí r *l># I

/• 0 ^donlY: A&rir sola para

í* la »9r*.ura
D "• T s jg ) ^ tj(M p io

) Ente ejemplo saca partido del hecho do que las llam adas a sistem a exitosas retanunO. U condición i f evaluará a vordad < 0} | /* O.POCNLV: A artr jalo pira iictura •/ ;• ,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 {tipee 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 e »ste .

ES3CH

Ese jxcceso

SIftTfi

Fue ¡ntemumoica una llamada a sistema.

EÍO

Tuvo lugar aigün tice de error oe E/S ¡generalmente relacionado con el

EUXIO

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

no

re « o s w .

£ 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 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.

se le oasó un nú-

6ACCESS

Fue denegado e< acceso a un orcnivo u otro rocurso del sistemo

EFAULT

a

SN073LK

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

ESUSV

'jn oroceso trato ce montar un dispositivo que ya so encontraba menta­ do o atentó desmontar un íilesystam corrientemente en uso.

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

tío

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
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 arch.vo que • ' •o es un terminal. Este error es el quo genera e' famoso mensaje nof a typarwritor Cesto no es uno maquina de escribir*).

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

EROFS

Un proceso Intentó escnblr

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 excece 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.

realizar búsquedas.

n un fílosystom de tipo &0.o4oc?ura.

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 utihz-ar la variable global firm o que se encuentra declarada en < e r r n o . h>. To­ das ias llam adas de sistem a y muchas funciones de biblioteca la asignan un valor a e r r n o cuando tiene lugar u n error. Existen tam 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

EiCMPlO

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

o*

fopeo: *
Como se puede aereo ar, resulta impresa topen, la cadena transferida a pe rror , seguida de des puntos y el mensaje de erro r asociado con errno. perror permite implen: én tar de m anera m uy sim ple pero suficientemente informativa una rudim entaria 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 enta 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 ,

fp r L itffs t o e r r ,

Lnt orr/iun)

"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

)

>

)

}

Caoílu'io 6: Llamadas a sistem a

i

i 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 habitualm 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 kernel) 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 [ [ ]): sievíPLO

S

cat /«Ci'pass»a ¡ cut

-Ci

-d :

¡

ha3d

-5

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 cuntroledores (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.

) 136

/

)

J



}

)

f

J

f

¡

f

)

t

J

)

>

•'

1

'

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 Represensimbólica tación octal S_IRWXV 0000703

Modo de acceso que permito determinar

POSIX

El propietario o'al archivo cuenta con permisos de lecwra/escritura/ejecución

SI

S_IRUSR

3300400

El propietario dol archivo cuenta con pe'miso 00 lectura



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 íectura/oscmuro/oj'ocución

S!

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 lectura/uscntura/ejecución

Si

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 RepresanModo do ejecución de archivo simbólica ración octal quo permito determinar

s_isuro 300-1200 S JS G ID

0002000

s_rsvrx «001 000

Eatabicco 10 de usu3r¡o (UIQ) (modo s e tu id i Establece iD de gruoo (CID) ímodo s e tg id » Modo pertinaz (sfrcí¡y). Guarda archivo en memoria aun cuanco ya haya sido ejecutado, ce modo ce ganar en velocidad ce acceso la siguiente ver

POSIX Si

si No

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

.1

)

i

)

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 Reoresensimbólica tación octal S_IFWT

0 I7 0 C 0 0

SJFSOCX 0140000 S_IFLNK 0120000 S .'F flE G 0100000 SXFBUC oosoocc s . zfoxr 00*0000 s _ ifcm r 0020000 s _ i f : fo 0010000

Modo do accoso quo permito determinar

__

POSIX

Méscara oara com probación oe cualauier tioo de arehrvo
No

Ü arenno o s un Socket

NO

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

No

E arcMvo e s convencional

No

E. arcruvo 09 un dispositivo de Oiooue

No

E «retuvo 04 un OlrectOóO

No

El archivo e s un dispositivo do caracteres

No

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* Tacy 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

S . U

139

V«_UB*SV

J i t í * * * t e r 10 * **3 Í2 2

La % f» i -*ss* es 5 éí S 1» - l feo

............................... ^ » u rt_ n ll j*«rs a sJyl 2* 19:93 ico Como ¡o m u estra la salida de este program a, la nueva um ask queda e sta b le ­ cida a 866 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 formili: 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.**#, u it f s u t f i n ; fa, a tro cr ata:

»:at *3uf);

Como el lector podrá observar, a ta t e sp e ra que en f ile n a m e se le tran sfiera el nom bre de un archivo, m ientras que f s t a t espera que en fd ae le 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 TvLü^guege. Seconc Editic»*.. de 3rfar. Xemigjisft y Dennis Pittfte. C 2 > ltsr-z.i. X a-eg 5 = f ry . o Texfi 'terself C in 21 Zsys. ffrm Earaor.. ce Pe-

i 140

i

;

/

)

)

,t

)

}

f

/

/

)

)

)

)

)

>

J

J

J

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 proiotá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 Descripción

Indicador

Valor

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 orgen fie datos

0_ROWfl

0002

£1 archivo so abre para lectura y osentura

0_APPEN0

OC08

0_RAN00M

« 0 10

Ut esentura de datos so reolüa siempre 3- final Cei arcnlvo 0 drcnlvo se aore paro ser accodido de manera discrecional

o_seq ü en t:al

3020

El arcnlvo se abre

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

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

(aleatoria)

para eer accedido de manera sec-jonoai

lo creo

coniinúa

J*

/

#

i

y

;

)

)

}

/

)

i

)

i

J

)

Capítulo 7: Administración básica de archivos en Linux

Tsbia 7.4. Continuación Indicador Valor 0_M3CTT7 0_MCK3LCCK OjSYNC

)

1

>

141

Descripción

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) ¿ore e¡ arc^wo en rrotío no-blcqu*. de -OCO que ur.a ecturg retomará cero bycas en lugar de un bloque '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

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

fJEM ?LO

« 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«

«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 ;* v «r ; k u 7 . i ) ptrror(*9fl«A*)¡

L

0 -RUNC

0 WRONLY, 6-*41 « í ) (

)

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 solamante. 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
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

tf(:c* scrio tC r_ fiu U

/fl#v/rolí •/ * 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 ) ; a s ie r r o */ 5 X lt(s .x rr_ F A !!.llR s);

/ • C « r r a r e s : a a r c h iv o , ya $ue lo Itaoianas

) • « r t r : e l a rc h iv o / t « 0 . í - o . s a r ’ l i * d * S C f;o to r •‘ c o ra - = ;o e r ' t a p / f « > . M r * . 0 caEAT , 0 TflUt>C

OJOTCNLV,

S «ÍÍ < ») { í-é rro n * 5 « * - t a f l r 'c c . s a r * : ; • í l C i * : c 3 s : r ¿ a t c r _ f u-er:e ■; * -a y qu e c e r r a r l o s eos i r c n iv o s a o ie r :o s

:v,c5

;= !:• * c l o s a ( d « s c r i o t c r _ n a ll } ; a * i r { £ X i : -K lU < tZ r.

> • .te - ■-==■:= i zy'ts • 1 v é 2 - ; £ - : * i s i r -.asta

i=ctür3_oicrLcura.c. ’ ? 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)

)

144

)

>

)

)

.

O

}

}

>

)

)



>

í

>

j

)

>

)

J

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

O

\ 'r .

^

E je m p lo

145

'

El siguien te ejemplo lee 10 by tes desde el archivo de ingreso de d ates despué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>

íio :ltí9
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
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
•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); r e s t a n t e s Ot U s e r i a c « ~ !M ’ /

l ‘ S a lt s a r s n l e s 90 o y ts s

> •::o5=(asscnptoj’_éntrss= i; : lo s g í d es c - i c t o r _ i a i 1 « s >; í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:

s a l ió a

El siguiente comando de interfaz noo perm ito ver el contenido do tmp 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

C JtM 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 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# r

E-*. « a in (), argc in fo raa *1 nu*aro 5« irgua 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: £

\ ^ . \ r ____

5 A lio *

S is -1 t e s r .t x t - r• - r ■ r - 5 tru cc t c a t . t x t 22C« S iS -1 t i í t . t x t r r -

1 «urr_* 2i l

u S * ri

! *wrt_«ail

ase rs

5656!J u l 2-i55:56 t a s t . t x t

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 espeeñ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

.

148

y

,/

/ .

j

I

f

l

)

>

)

>

>

}

1

t

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):

----------SA L,D A

.p e : flc g u la r = ¿ le Ucda: ( 0 $ 4 í . ' - r w - r - r - ) U id : (S«a/KUrt_W 3il> Cc v í c í : 3 , 2 Inode: 53 4 555 U n ks: I A c c e s s: 3 3 t Wodtíy CTtang#

G íd : | 1M / u s c r s )

J-j í 2-t 1 6 :0 2 :5 0

tW 9(W ¡M « .0 0 :1 5 :5 6 1

S a t J u i 24 ’.6 :« * :2 9 S a t Ju L 2< I6 :0 « :Z 9

19 9 9 ÍW 3 3 0 .00: U : 5 7 l i g 9 9 !3 s 1 0 0 0 .M :U :l7 )

El comando S t a t lee 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, loinodes 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 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

:n o _ t J t _ i n o ;

/ • nu.noro a a in o o o

'I

w > a a _ t ic_nc-cJ;

r

a lir .k ^ : s t j U i n k ,

/ • lu n e r o d e m e o s ¡Ju ro s ’ /

•/

wcJO t fa l a rcnivo •/

■j¿d_t s t_ u ld ;

/• UID aei

5 ic _ t s t j i o ;

/* ¡jIO a e l p r o p ie t a r io a e l )• u p o ce C i s o a s i t i v c •!

attv_z s~

"d e v;

s t _ s iz 5 ;

p r o p ie t a r io

I ' ta ñ a ra t o t a l sn

col

b y tes

a r c n iv o

•/

a r c n iv o " f

'

;

)

i

)

)

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

’ o<^ 5 t _ 6 1 k s i2 « ;

■jrsi;*e: lo.-; :

ik

/ .

:ice_t 3t i : i s í ; :i=5_: st_ sti« e;

)

149

’ t w a flo i e a lo c u a p r e fe r id o */

oueero * fifia

/'

c*e

i e blesues oe S12 sytes V 5 * 1 u I t in o acceso c e ! a r c h iv o • /

• n z " i ¡ r-ora a la uLtiaa rcdificacior del arcnivo */ • fscna / -.era -e i u i tí t c cmcio del cor.-enico ce i ir.&ae

El miembro s t _ 3 l k s i z e inform a el tam 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*
•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
«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_
strcpy(:ip«j3e_arcniva, 'Dispositivo ae bloques*|; alse LÍ(S_ISPIFO(uodo)) s-rcay 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­

/

152

)

)

I

t

.1

J

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 *ir.ciud* < i y s í jt a t .h >

finclude <*•/»/typaa.n> •w c lu fle Lnt aain (ve id )

( « d e _ t noca • 0 755; in t 2 8 s c r ia :o r _ a r c r .iv o ;

I ' Crear «1 arenivo i f (!deacriptor_arciuvo - opea{'archivo,vacio*, 0J5RGAT, perron *0330*1; exie<EXIT_FAIUIftE|;

) 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 * |;

< o;

{

Cap'T J.c 7: Administración básica de archivos en Linux

«*ÍC(EXl7_FAllüR£|;

153

'

> * Zcr-^r i s W t M t 'i s

: o r i o s p e ro is c -s y a s o c i f i c t c o s */

- i i r c ’i i v o . / a c i Q ') ;

•*1? CEXI~_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

L0

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

'

154

i

J

?

)

i

)

)

)

)

i

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 #tflcluc* «Liciufl» #lndufl« •toclutfe

<3táli0.^> <3MiO.!>> <syi/»tat.n> <3y#/typ»9.n> «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 • nuevo. archivo - r ■• f ■ c • nuevo.archivo i exi:

i raat 1 ku rt * a ll

ro o t users

0 J u l 24 2t :n 3 j u l 24 21:11

Como se puede apreciar, el program a prim ero creó el archivo. £ n la corrida do 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

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
• irc i¿ u « íy s /^ i.K » •incluir <jy« i:«! ft> » l* íijd «

uxlw a» <wni.»ta.ft> vtncluM «induce «ícr.ti.n> •ni

íum irttct

( Ahora * 'MN1JMÍ, n ru e t ^tL2<xr ouf; in\ 3*icriptsf_ir; 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 160

,

)

)





)

)



)

)

)

)

)

)

)

)

}

)

t

)

1

1

I

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 enLe 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 habitualm 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 . S u pro­ totipo es el siguiente: :nt r c c t if in t fa, in t rsquest, voia -ar-gj;

)

)

)

i

)

)

)

)

)

)

)

)

>

}

1

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

) y

i • )

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 leguramente no te v y. s cemootar de '-a manea que se Escrito aquí Si usted utiliza « t a s 3r-_=C33 en un programa serpeo zsrz ser » rte&e. cece 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
¡ ¡ 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 ocurrirle 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 */ r» • «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:

” s a l id

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

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 ado (sise) de buffer de • 1 y haciendo el propio buffcr igual a NULL, la llam ada a g etcw d seguirá teniendo éxito porque 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 fifld o d t <íT2ÍO.H> • in clw flt

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¿


) *

“ jo o ia r 4 ir SWS* **5

3a 1 1 o a

91n/

ooc/

♦*«/

Isg/

pro|«cts/

trcl

tnpí

* ;*»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-inte 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Ü/ ü=X

l El prim er program a orea un directorio cuyo nombre es transferido como ú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í!

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/ejecució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: /-

\7V7SALIDA

\ I/ 1í / f 3 ) /

■=!

5 ./nuevo a ir foo

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

2. El siguiente program a elim ina el directorio cuyo nombre le es pasado como su ú ^ co argum ento. r

v in o re 25i sragraita i r interne t: d e ld ir . c */

ÍT I mT lÓ • e lir .m a r _ ijir .c - E iin ir.a ur. d ire c to r io

•l ♦induce

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

s a l id a

iliiiiu r

d i-

to 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-

, 168

,

)

)

)



)

)

)

)

;

)

)

)

)

)

)

>

>

1

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
a.n 4 n (»¡'W^_LC«O_'
PRECAUCION $<3io mo 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 . directorio

Sintaxis: l u t a r d ir notónj

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

«inciudo 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

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

)

163

'

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 ) | i r i.- :-

*V :Í : «ts

1-

KVL'.I

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 ropetirinmcnte a r e a d d i r para recorrer la secuencia de caracteres preaenU* un el arch i­ vo de directorio h asta que ñnalm entc t i to m a NULL y ol program a abandona ol laxo. En cada 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 conceptualm ente sencillo de comprender, el m ultiplexing puede re su lta r dificultoso de im plem entar de m an era eficiente. Afortunadamente, Linux cuenta con la llam ada seiect para facilitar las operadones de multiplexing. s e i e c t es una m anera de aguardar sin consumir dem a­ siados recursos del sistem a a que muchos descriptores de archivo modifiquen su 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:

; 1 72

;

j

)

)

}?

)

)

)

i

)

i

)

)

)

.)

;

)

>

)

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

♦Include <3tdio.n> ♦in d u c e «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 ; a c t u a lic e s e la o t •/

r

/ • C opla de c ; t o o o se rs a ara <}u# la

A o r ir lo s p ip e s */

I^ ((c a s c r 5 _ a r c íiiv o í0 | « 0 p an {’ p i p e r , OJMXWLY , O_«JN0LCCK)> < C| a a l i r _ j i _ « r r o r ( ‘ E rro r a l w r i r p i s a i * ) ; i r ( ld * s c r 5 _ a r c n iv o p | = o p 8 n ( 'p ip e 2 \ G _fiX «Lv ¡ OJtONBlOCKI) < d) s a l i r j » i _ a f r o r ( * E r r a r a l a o r i r p ip e 2 ‘ ) ;

f I n i c U l U a r conjunto de ¡t e s e n p t o r e s con n u e stro s d e s c r ip t o r e s de a rch ivo */ C D _ ¿ £ a O (ic ]w _ u e sc rsi; ?D .SE T .;(;escrs_arcn ¡.vo [i>!, 4 c jt o _ d e s c r 3 ) ;

R)_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

• lo s

s i

Í^ J S

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

173

lw r

de



• _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
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.

> 17S

f

}

/

)



>

)

>

:

)

)

)

)

)

)

)

)

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&igdas 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 mapoado 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 entoció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 pnvilegios 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 •laclvct «sys/stac.n»

i i x h a t «vrustc.rw «iitcluoe *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

3 tru c t

.j o : 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 realira 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 • US_SYNC

Program a u n a operación de e«critura y reto m a 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
p _ * .5 :< w o i;

’icar,

i r : «IocScaiI(ín: 'la c s :; i-it 1.:i: ;

3 i:e _ :

Io n );

) 1 80

I

f

).

\

I

)

)

)

f

J

)

?

)

)

)

)

>

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ógico 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 memoriu. 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 rrtom 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

e4CMi>t.o

El program a que sigue, c a t jn a p o a d o , im plom onta el comando c a t u tili­ zando m apas de archivos en mem oria. Aunque* e sta es una im plcm entación 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

>

>

)

*

*

>

}

;

C a e d le 8: A dm inistración avan zad a d e arch ivos en Linux

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 j t a t e w f .s iz a a« a ta ta v í */

/• S« oot«n<jra j * l .m in oro

/• Vap
» 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 ^ £ ) ;

>

; 181

j

)

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>ociore 3 en que e' cesempeto resulto crucial o cuando uno está en'rent&ao a ope'asftyves v> ticas o<-. chanto a tiempo. los archivos n-ac^sdos un memoria pueden representar jna evi <Jc*:o .«rttoja el ñapeo e - memoria puede 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 cuxJqu 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 procosos que lleve a cabo su program a no sean Interrum pidos pnr otros procesos ajenos a i mismo. Si uno abre el archivo an tes de proceder a bloquearlo o lo cierra 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 bloqneo/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: li

'zen írc n tv o a sloq u to t*oI«arcc *1 tfloicao or 0_6XCU la l l r u s s 3 zasc ' r t C l U y a rrre =- ESXIST) ;:ro procesa sartie^e aioqi^aao « 1 a-rer.ivo

tls e tro

a iS B O

c lo c ^ e a o c

ti

arc n z v o

irenive

izr-.r lle v a *

a

:ti“ « r

e i

i ’ J lf á r ana i f

z iz c

e i

p ro c is a n s n ro

a d ic io n a l

re c -ja ric o

a rc h iy o

3*svi-iCbl5r. a. ir c n i. c :a blOQuíO

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 segundo 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-

) ) 134

) )

i

J 'J

J-

)

)

)

)

)

)

)

)

)

)

}

)

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
’&ífléo de ~‘ o rk ‘

E je m p lo

EJEMPLO

Este program a crea u n archivo de bloqueo, y luego tr a ta de bloquear el a r ­ chivo principal u n a segunda vez. El segundo in ten to fr a c a s a r! E l propósito 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 ílnclude <*cntL.h» einclude '«rrn o .n > *inclu

r Por la posible presencia de EEXIS" •/

í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) conprobarenoa •)

r Ocurrió alQun otro orror que ro

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
r

Capitulo 8 : Administración avanzada de archivos en Linux

owt*{ '0cjfi*i3 un errar no pr*ylsto*)i eise 3 -jts ’ i s t a pro grau s crcceas a c lo q u e a r a l a r c h iv a ‘ i ; f r

185

J P ar3 a i e s t a s

ÍC5 M n » 'c t« *•

• -asaltadas i m m * suorUlrse. si prcgra.na nunca íeSena l l ? ; r “asta í í -j í . * :lo s s ; 3 5 5 :r ic :o r_ s r c íiv o > ;

j - l ir » . : aryv ’ :! l ;

' D e svin cu la r a l archivo da bloqueo v

3 *i*.{£xr*_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 cornwpcmdiente 4 mainO, el programa ¿ e rr a ol dnscnptor do archivo y desvincula (aupri • me) el archivo do bloqueo, desbloqueando así el archivo principal.

B lo q u e o d e s ó lo c i e r t o s r e g i s t r o s Aunque los archivos de bloqueo son sencillos de utilizar, tienen v a n a s des­ ventajas im portantes: • C uando un archivo <e bloquea, nn se en co n trará tampoco disponible pa­ ra otro- procesos que m eram en te q u ieren leer tos datos del mismo • El indicador 0_SXCL es confiable solam ente en los filosyscems locales, no en filesystem s de red a l e s como el NFS • Los bloqueos son 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 , 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: o ff_t i _ s :a 't ; off_t I_lar¡; pia_t I j í i d ;

/• SeginnLng o* ioc* •/ r Staf'ttng off$*t of lock */ /• Nunoer ar ¡jytss to lock */ /• Process holdlng lock •/

l.ty p e puede ser F_RDLCK p a ra un bloqueo de lectura, F_WRLCK p ara u n blo­ queo de escritu ra o FjJNLCK p ara lib erar el bloqueo. I_ w h en ce puede adop­ ta r uno de los siguientes valores: SEEK_SET, SEEK_CUR o SE=K_END. que tienen el mismo significado que en la llam a d a a ls e e k . l _ s t a r t m dica el

C a c ítJo 8: 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 esc n tu r a sobre u n a p arte de un archivo y un bloqueo de lectura sobre o tra p a r­ te S j 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 • i/'Clw.J» • ir e iv o t • IflCluO#

«unut0.l*> « fc fltl.t» <»talio.n» < *ttio.h*

• irclji* 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 188

)

)

f

)

)

J

)

i

)

)

t

)

/

)

)

í

t

)

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 .

>

1

)

í

)

>

)

)

)

)

}

)

)

)

¡

)

y

)

)

j

)

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

t

)

i

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 apeo 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.

i

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 resTstrodol .¡.Htemn (que a menudo en el archivo /v a r/io g .-m e s sa g e s). Este tema so cubre en ‘‘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 prim 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

f

Jf

MPLO

El siguiente daom on crea un nuevo archivo de registro. / v a r / l o g / I p e c a • t e d . lO Q , y escribe la focha y hora al mismo cada minuto. A 5n de que el daeraon funciono, debo sor iniciado pur ol u suario root. /• Ipedated ( U 7 7 1 no e x i s t e en I n t ? r n « t . Lo que hay B íjO IdUflílCO “.oubro OS 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

un»

•/ 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 • 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
l ptd_: pid, s id; sor as sesior- •)

/• pía - icentir'icador oe procesa:

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

Jid « iden tifica-

C a p itu lo 9 : D 3 e m o n s

i« ((U 0

* « ts id O )

< 4;

{

o trro rj • » : * « • ) ;

} / * a c o n i r u a c i o r . , ^ a cer cu» e i c i r a c t o r x o c o r r i e r e 5 i r * c ; o r j o r a i i •/

u« r r a c a j o sea « 1

tf { < c ft S t r { * / * > ) < a i < p*r.-«f('CP<J i r * j ;

* i; t( a : T _ F A lv ^ € ) ;

> /• iM ic L ili 2 i : í 0fl : i l ooflo d* ircnivo V u m w h ): / • C * r r * r i t a i n , SttOUt i H U r r • /

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 | if ( D « f “

• U oogu ye • t))l

* 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£|;

J 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);

{

1 9 5

i 196

j

)

j

; •

)

i

)

l

)

)

)

>

f

)

>

>

>

}

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 . 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___________________________________________________________ Descripción Valor de facility M e rm e s de seg'jndad/autonzaciOn log_ auth» r : v •/ a t

LOG_CRON

D a e m c ^ s ce reiG»; c r o n

LOG_DA£MOí J

Otros daemons Oe sistema

L<X5_K£RN

T e n ía is
LOG_LOCAL{3-7J

Reservado oara

LOG_L?B

Scosisterra de imoresora en rinea

tOG_UAIt

Suraistcmo do correo

L0G_NcWS

SuOaistoma do nofcelaa de Usenet

-js o

local

LOG_SYSLOG

Mensajes s e rra d o s por

LCG_USER

Usuarto predeterminado

LOGJJUCP

Sistema

sy slo g d

UUCP

p n o r i t y esp eaiiea la im portancia del m ensaje. S us posibles valoren son listado* en la ta b la 9.2. Tabla 9.2. va¡ores postales para el argumento onenty del administrador de inxreso ai sjstem a Descripción Valor de prionty 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 rel="nofollow"> «IncLudo <sys/stat.H>

flndtrf* <stdiib.n> íin clu d» •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 ; dor de saaion •/

oíd * icuntificaaar do procoso;

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?
* 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 » < í )

<

sic - iden tm ca

)

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 t o r io r * u •;

O ir e c W lo so rris a te de trsoaja sea e l a irs c -

lf((c*ttir{*/*}) < *> { *7*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 0_CR£*T

0 J» G M U

oo*fl{’h » r log/lpadat«l.loQ\ 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

;

,

9

í

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.

; 204

;

,i

i

)

r

i

}

)

)

)

?

/

)

>

)

J

>

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 secuencial; se puede in se rta r nuevos registros en tre registros existentes o agregarlos al final de loa mismos. Las bases de datos basadas en kashes al­ m acenan ¡os registros en u n a tab la h ash p ara p e rm itir una 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
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 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.

204

f

)

i

)

)

J

) />) J ) ) ) )

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 *-

5

f^ccm

Nur-.C'*' Q i'a b sje ¡O 0.B€CNO ?

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 accedidos 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 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
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; éste 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 clavep a ra todas las operaciones de base de datos subsiguientes, porque casi toda la interfaz con ía Berkeley DB tiene lu g ar utilizando punteros a fundones contenidos en el mismo. C ie r r e d e u n a b a s e d e d a to s

P a ra cerrar u n a base de datos, utilice Ja 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 3inz-'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 . )!»

i l ’f ¿H> CifMfto

E je m p lo

E ste program a. a b r i r _ db. abre y c ie rra uno base de datos en el directorto com ento de trabajo. tí-aer» 3*1 srograii *a 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 progrurna 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

is A cjímplo

£1 program a del ejemplo siguiente añ ad e u n registro a la base de dato s c reá­ da por opendb: 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, S p u n ta ra jío i ;

w jl l .

NUU,

}

)

J

I

t

}

f

/

)

)

j

j

i

Capítu o 10: La API de base de datos

v a le r

i

y

209

(

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
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,
>

{ 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:

jIlT o*

itesu lta de especia: im portancia o b serv ar que, en este ejemplo, los caracteres n u i l 0; de term 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.

)

i

Programación en Unux

210

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 coocxr.ón obl ¿«tona, poro hacerlo 'e ocrmte ni orojjrarador utll w r las funciones de se ida ce lecuerci#* do caracteres (« r e .rn í) ce la oibiiotcca 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 correctoniente ¡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

.3:< r rsto-nsas - « o _ : o « f - a e \

C8 C»&ats,

io-.r»«<-o_5ü};

211

su.1 . « j a .

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.

• 212

»

/

/

/

/

/

J

]

J

t

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 inform 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. IlíM P tO

/ • Norbre c e l prc<jr3na «n I n t o r r a t : fls td b .c V

/* • o b :« n * r_ r» g is T ro .G - OEtflnar un r o g ü t r o d ® unB 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, 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 ) ;

n u il ,

)

J

.*

)

J

.i

>

t

I

'

.1

Capítulo 10: La API de base de datos

/• Asignarlas valores a clave y valar •/

> 213

^

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 .- , e ls 9

'C i í v f

*s

r<

e n c 8 fitra d a \n * ,

(c h a r

’ J c la v e .3 a :a ) ;

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

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

_____ i a l io a

M

Ccaplliclon

i* ^

r« «

P ara aseg u rarse que la operación que vaya a realizar g e t tenga éxito, el 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 DB_l_A$T

Retorna do la baso do datoa «I primor regíntro 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 alrnuconadoa en m em ona son autom .lti enmonte descargados a disco M ientra# so tr a ­ baja con la base do dates, uno puodc d e se a r asimismo volcar a diuco el conte­ nido do la m em ona. La llam ada n ecesaria p ara esto 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 /* •

•I i if lC lü Z »

- 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

«ítíliS-f1»

iineli^s <str¿rs.K> ? L - c l.:*

‘ a a.b *

)

)

I 216

)

)

I

)

)

)

}

)

)

)

)

)

)

)

)

)

)

)

)

)

J

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

L a salid a de este program a es la siguiente:

) 217

-■

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

iA¡ |0A

-o i u p l e

• Se p y rad o - c * ? r c g r « a ■ JtM P L O

lC u r u s

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

tinclMdt «curses..'> ifit tuinirois; {

coa

o c u rso s

lla n a a t r a c « { )

)

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

. . . <4 r~ ^ * A t i OA

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 ’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) ...

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 ¡nformació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 reprftser.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.

)



224

1

1

>

>

>

>

>

>

>

>

j

j

,

,

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
¿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$
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 :

)

) 228

)

)

)



)

'

)

J

)

J

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, inicialico 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
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 inidaü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

M* L0

El siguiente program a de dem ostración, n u e v o t e n n i r a l , ilu stra la ¿niciaiiración y term inación de las ncurses por medio de new term y d e l s c r e e n . /• 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 intemctuando con u n term inal distinto. Sin embargo, la entrada de datos seguirá siendo obtenida de s t d i n y la salida dirigida a s t d o u t. respectivamente, por lo que ios punteros a FILE para o u tf d y i n f d siguen siendo s t d o u t y s t d i n . Antes de que el program a pueda u tilizar s e r , sin embargo, debe convertiría «n rI term inal corriente: de ahí In llam ada a s e t _ t e r n Si la llam ada iraca3», uno debe aseg u rarse de todos modos do llam ar a endw in y n d e l s c r e e n a fin de liberar la mem oria asociada con s e r ; a ello so debo la presencia dol 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 ncurses asum e el control de la salida al term inal. A fortunadam ente, las ru tin a s de E/S de las ncu rses'ae comportan de m an o ra m uy sim ilar a la de las ru ti­ nas de E/S e stá n d a r presentes en < S t f li o . h>. de modo quo la curva de aprendizaje p ara ¡as m ism as es tolerablem ente 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 , protocipada 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 dlV?>-c.as 3 e ccrTserjiT^rto -»*a ¡ss fundones que administran cada uno de arreos i¡. res £$Í3S d<»erenci« je corre<*t3r en este cootulo Cuando y 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 especificada 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 retresh 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

}

)■ ) 232

i

>

)

)



)

.

^

)

>

)

)

>

>

>

>

>

>

>

)

1

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



ACS_VLINE



ACS_8L0CK

Línea horizontal (—) Línea vertical ( | ) 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í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 ). 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

¿ül í T cmTT o

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 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 ¡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

•I t in c ió n

•incide*

« irrso .ü »

I-J K lwfl* ••Jtlifcr.J.n* ; r t ¡uW(
( 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, ?.

rs frts n O ; slt« p (3 |; ip p _ e* ltn ;

>

2‘

A_3CU3¡;

; a l i d a de

car«ct*r«s

*/

)

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 inadas cada una de ellas en un cero binario). El siguiente es un Listado p a rd a l de las fundones que operan sobre cadenas de pseudo-caracteres: ín: adacns:r(cors: chtype *crstr); : n : a S d e m i t r í í c a s t cntype ‘ c n s t r , i n t n j; l r.z watfCCTsrriWlNOCW

certSt cn typ e ’ c ^ s t r ) ;

in t waaccwtstriwiNDO# * » u i, c s n s t s h ty p t * c n s t r , ir.t n ) ; irte t v id S C ü jt r iin t y , .n t x. s o n st en ty e e 'c h s t r ) ; i r : j v a a c c m s t r d n t y , in t * , 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 ,

l « t 3 V » M » t - |t n t i . ir.: in i

in t n );

Iftt « . ic o » ; c n a r * » : r ; r | ;

y, « v m c fiH rn iN O a tó

:n :

x, con*?

* * tn ,

w t y

:nar in t

* jír. *.

tn t n |;

í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

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

\o * | ;

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 macro. de modo que la sintaxis necesaria p a ra llam arla no requiere que tan to ynax como xmax sean punteros. La llam ada a mvaddnstr con un valor para n igual a 2 0 obliga a que la cadena im presa sea tru n cad a antea de la letra ■*f de “truncada.” Luego, el program a c rea la nueva ventana, ventana _tem p, con las m ism as dim ensiones de la pan talla corriente. Luego im prim e en :a nueva v entana un m ensaje, d ibuja un borde a todo lo largo de su p e rí­ m etro y Uama a r e f resh p ara exhibirlo en p an talla. A ntes de term inar, la llam ada a d e lw in p ara la v en tan a recientem ente creada libera los recursos de m em oria asignados. La salida de este program a He m u estra en las figuras Ll-5 y 11-6.

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
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 ent*. 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 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: £1

mt mt mt mt mt mt mt mt

ent«|voio); •»!«); citar(«oía); «cieirí»!*»» *»mj; clrto&otivow); •cIrtoüot(«I>eOü •n o ): cl.-towMvoio); •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

E JE M P L O

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­ 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«; *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
.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

• y r.z t -2 f-ssn(); í

1?í

s

3

-

i,

«a*

- 23)

> 241

/ 2 , * S c r;9 d ib u ja d o 35 n a -iara s í f r é i l l a ’ j ;

(3);

:l53r(); A C S.V '-ífS ACS r t i n e

Acs_acofW£f« :

A_3C'-0.

ACS_VU?<E ¡ A _ 30 10 , ACS_HLIKE

i 3 0 0 ), ACS UtCOWEfl ; A 301.0, ACS UBC0RN6H

A _ 30 10 ,

A 301.0,

aJ b l d .

*cs.uíccfi.ss?i : A_90-0>; / 3 • t . (JOJ3X - 2 S | / 2 . - 3 0 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

lir-clx* tiacluCt <«rmo.!v» •ix lu M VtilfeM.i»* JHt MlPCrOií) < iflt c, i • in t

C;

r f l& x , f t i í i ;

c t.tr

•luco» ’ptfittro.vw .w a; a p c j in it o ; :n » a e (); ; a : s a í i ;j:c íc r ,

,n « i,

lf{{puBT«ro ««ntSiU >U_|

);

suOñfl(ttáser, 2, *0, y-ux / 3, (xmx • 4 3 )/ 2 )) "

s * lir_ s ¿ _ * rro rfJu b »w * | ; Inte.*''*:

I* e r r j j u i t , sn la v « r * U « presente en

•)

& 5 x ( p » m , A C S .W IH g ,

*CS_ h l : \ c ) ;

»vjrt0Mtr(p
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
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

/

Capitulo i i : Manipulación de pantalla con ncurses

/

/

t 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í».»»» 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'}; tncarne» •/

r *rr_q uit,

« 1 :a v#ralon proíentf *n

p rm t* ( *lityrese su nc: *); 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*
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
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 . */ • fcít* prog-*aaa m junto cor. ; o j d * l C a p itu lo t t v

(¿IMPLO

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 * »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, BLAttOJtfOM)* 5.

tftir

3, Cl>.N_*EOAO- «, S. t í lí. N B f lO - 7, AUASt'.I.O.SEGPO* 8

• s y r» tíra _ t4 0 s ra ;

a p c _ in it(); • D rtc r u r ir

t i

if(lfu s _ c a lo r* ())

p r i« it» t* E a M



u r* in a l

ic o ití

c o lo ra s

•/

{

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

i-* -su r recció n

: • c o la r s= l a s

s a l i r 5i _ r r r o r ( • 3 T í r t _ c o l o r , t ; In te rn e t

o c u rse 9 •

— íflfi • « rrjjy it,

in

.a v e rs ió n p re s e n ta

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

9n

.. 252

/

>

/

/

¡

t

.1

j

t

)

)

i

)

y

f

)

j

1

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
!• g rr q u it, on la versión nr esente on Internet

fcrtr. = i ; (i <• 3; i**l { de la o«Q. 250 •/

/• Estos sor lo í códigos de los colores »n ;a

lista

-enaítiourtero c n d ^ i, ACS 0LOCX, naxxl; oaj. 232 •;

/* Ver *ibla de ACS en Cíp. 11.

»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 aplicad 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 correapondientes 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.

}

1

)

)

}

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 subventan 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 referenciada por O fig . La esquina superior izquierda de la v en tan a hija se h alla locali­ zada en los coordenadas D eg in y, b e g in _ x relativas a la p antalla, no a la v entana m adre, derw in se comporta igual que subw in, excepto que ln ven­ ta n a hija se ubica en la¿ ooordettadas b o g ín _ y . b éf)in _ x relativ as a la vontana m adre referenciado por o r i g . no a la p antalla. E jem p lo El program a siguiente crea una vontona hija, escribe cierta cantidad de tex to en la 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 » »uB-v*nt<m* •/

para gestión ae

V ilr.c h .u o < 5 td lia.li> ifin ciu d * < c u n « 3 .n > *;n cluce <errr.O-ft> •ir s r lu o c

«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, s a i i r ^ á i j í r r o f ^ 's u t r n i n ') ; in te rn e t ' /

10, z, 3))

■tokgdfventanajtija, 1 •}; «p rin tw ív tn ta n a j’. i j a ,

w ll)

I ' « r r q m t , en la v e rs ió n p re se n te en

*\flSUB-VSNrw
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

s ím o

'

i j

;

y*at , 133»J,

39t»-*s*.y« s : : s : • P llíf n

2 5 5

<

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 ;

rel="nofollow">

•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 aubv 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 « 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 ¡) —

s a lir j¡:_ e r r o r |

IOMrn«c •!

n vv«jrim w {puft:ero.,ven tana1 5 , 1 ,

MULLI

/ • • r r j q u i i , en lo vo rsio r. pre«„*r.:e «n ‘ 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 «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:

/* v e r TaDla an A'JS en Cap

11

C sqí' u 'o 12: Programación avanzada con ncurses

;5tci*yxí£tc3cr, yvax, xnax);

257

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 0J0cutará 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 Mayú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 diser 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 BUTTON1..PPESSEO

Acción que es Informada

_

________________________

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 .

- :. i y ,- ^ 1 ejIM Pio

E je m p lo

Este program a d em u estra el procedim iento básico de intercepción o interpret¿ción de acciones de ratón en un p ro g ram a ncurses. ' -.5K - Í ;s l o r a r a n » an I n t im o s : ¿ s a n o u s e .C */ /* • - z . r u _ r .c 2=-2t5Tts : c . r i í i

L

s e n c i llo 25 -in te rc o c c ic ? 3= ic n o n a s da •joüsc

> 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); ü o tgn a j ijo ra tó n •/

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

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

• n il« ( 't o u p p o r ic o d ig o _ a 3 c i: • Q etclM ))) I - *S ' l { t f ( C 3 * li$ o _ a K ii — XEV_WjUSE| { ge:.TX iu seiA accion _raton |; i# L tc n ( a c c ic n _ r a :fln .p s :a c # J ( caso BUTTOSI_CliaED :

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
} r o fr« s h ();

i > r c c o r « a k {) ; a p p _ e x ltO ;

D s sa c tiv a « d o cb roak */

5 * / S a l i r •/

>

>

)

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 . Tioeando ’s* o ’S ' se desactiva el modo e b r e a k y se sale del program a. La figura 12-4 m u estra la salid a o b tenida luego de oprim ir cada 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

t J t 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 ­ 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*
< 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; c c T e r*$ a * r a t a o v * v o r im s ( 2 , t ,

'•

in te rp re t a n p u lsa c io n e s Je t e c l a s y

' V c k 'ía j • • • \ i r t n ’ ) ;

& © *<st4 sc-. * c s * c s _ - i . t r < c > :

/ • Csts&lKtr l a «u»»a ventaba •' :f ! ( 5 c '’ t e o _ r t r t í i j * n t w t n fU . *3.

trro rC frw w iri'ij

'0 1 ) • * HUU.) |

/• *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 * f t i l « f ( t o c p c * r ( e a r » e t * r .a » c u * g e r c a i ) ) )

op ^ i a i

i

a

S

•/

* -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

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é);

a c c i.o fl_ * a t a r .y ,

J

264

)

!

I

>

!

)

f

)

l

}

)

)

)

>

)

>



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 masmas 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
i*: fr«o_tt«*i:TQi •»*■); nemj ’.'lu in t *r*«_wny|tÉMj int ir t int ‘«nu); m t wj^criverfUEJiil • m n , in t c);

cnar •a « s « r:e tlo n } ;

iMEXj •««<.. ifltin: coI j )¡

n Q w _ iien asigna u n a nueva e n tra d a de m enú y la inicsaliza a p a rtir de los 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 terminación

do

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* 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;; M t - y ü 3e ratón ‘ ’

'-t i~

;* t» 3

/*

i t s m terprsTar pulsaciones 3e te d a s y

2 i ZSKJ '

* ; r '- . - : r - : _ : r r . = : a s = cervezas; •D^t«ro_ca*vei¿s: ou.-nero.cervszas - - )

) } )

\

t

¡

y )

/

y

)

)

)

)

)

'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 ,

•');

)

)

)

P ro g ra m a c ió n e n U nux

*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* lf{ c c < íig o _ a s c ii =*

k é y jx w n

I {

; ; c c d l g o j j s c i i »* *EY_NPAG=¡

íieru _d P iv*r{n i_f»*n u l r e q _ o c w w t b i | ; f l í « tí{ c o ú ljo _ « c ii -

K E rjJP ¡ ;

KEY_?PAG£)

rsn u jjr tv*r (tr1jionu, 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 alfanum é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 hacea cargo de m teractu u r con. el usuario. Laa ru tin a s de campos son com para­ bles a i as ru tin a s de ítem s de la biblioteca de m 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 •/ais »fi.dlO _i> ser3tr(FIE L O Ff i 8 l d J ; FOMI v.*w_fomíPIELD " f ia lt ís ) ;

jqíú

•üssrptr);

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 C _ * C TIV E

3 campo es e*riC*dO. 3 campo será visitado d u a nte el precesam-ento. Un ;amco invisible re puede Se' visitaGo.

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

C_PASSOK

Valida la fech3 sólo

buffers para cada campo se fijan al tamaño origina; del mismo. $< é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 »:rclud» #tnclu<J# »:rciud» nrc'.ufle

<curs«*.h> <$Wli8.h> 'utllícn»,l>*

r »ara tsprinc<) */

:n : n*in(vouti

< FOBM •(‘enrularlo; FIEU) *canpos(Si. tr.t co a ig o jia cll. 1 - 3 ; /• In icia r las cursen •/ apfl.tnttO ; cDraakf).

/• Activa nodo cbreaK •/

'xaypacistascr, rsuE}; natcfl«s da ratón •/

/* f'ernitB íntararotar polsacionas de :a c ia í y

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

)

)

C aoftuto 12- P ro g ra m a c ió n a v a n z a d a c o n n c u r s e s

WLH; í¿ 3 C « S [ 2 ; -

>2, 2 , t ,

S € t _ f i ;l i 3 _ 5 u í í * r ! ^ « p C 3 { 2 ¡ ,

) 273

' S, J i¡

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 ;, H ftt llil " r* fr* s r(); p a n t a lla •/

* =3*.i fu n c in r ¿ e j.3 i '. fa m u L a r lo l i s t o p ara e x n iO lr an

• é s t a fu « c :o r es la tjue v e ra a -je ra re n te uoico o l fo r m u la r io en

/• Dar cooienjo i l U i c í# CfiMfldM

•(

fO * n _ iJriy « r (fo r n u U riO , flW JJV L JiQ O E ); ■ n ti* (M « p o « r(c o d tg o _ w c X a • g vtefiO ) ¡ « key _f <: • }i { i f ( : o « l f f c . * » c u •« <EY_up ; ; c o o ig o _ a * c li —

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),

i .:% < s í _ f 5 r * í *5 «h j la •' 10 ); fo r o u la r ie ) ; fo r ( t • 9; i < 5 ; 1 —J ■, r a a _ f ie l( i can eo s! i ¡ i ;

tc /o tc u tsic r, fíls s ); rvccoreaxt);

i

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 sintetizadores 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 :np u t/o u tp u t consroi control de en trad a/salid a y es utilizada p ara m an ip u lar un -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,

/ 2S0

,

)

)

)

)

I

\)

)

>

)

i

}

>

)

)

)

)

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
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 a c* «¡-««p ío qu* « h i t e

• * « t to o _ a « :c u c o r .c •

• lo » r a la * * » S O fr i* o ít a á * lo » c o n tr o la » 3 # l w í c l a d o r .

lt* 4 rra .i'c r ( |«f f_trancjr&eit*l.eo>il • SuJiw.t» eocificaao por Xurt ifait (<»aU>x.Tiijílor.coei */ •ireluce • Copyri;R: (c i l99-»-3S

«í.’Klwae <s:o:o.ft> t i r c l ' - c t <s>»ríoc:1..-.>

«ificlyc* « 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 ;

n e ic la sc r ’ t

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

)

Programación en Linux

íití n iv e l;

283

Capítulo 13: La API de sonido: OSS/Free

prr._5 U t.'( ! «

/ • N iv e l t e 1 v o l j n e r - /

1) i fuM t# _g nO aciW M :

/• 45e encuentra

a c tiv o ? • /

c h a r ' d i s p o s i t i v o ■= " /d e v y .n ix e r - ; son»? char *rotU lO S[| - SC^JíJO DEVÍCE -ABELS; M íe la t ío r » t

I ' Xonbres de lo s c a í a lo s -Jal

pm _s?a tl(t « M M e s t«r«> ’ *7

in t l ;

I ' ¿P';»de ooerar on

1 1 i d i5 c o s it lv o _ « t t r ío );

/* 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) { r*o, acstrar los mvelss de 1 « fie» d ía le s */

Si ■»! dispositivo «S «sto

: f (d e < t l(í* s c r ‘ pí*r_3rcíilvc. MÍX£R_S£AO(l|, in iv u lM < 0)

/ ' ¿ in -ir « I d is p o s it iv o iw z d a d o r s o lo para le c tu r a •/ i * ' { 3 e s c r íp t a r _ ir c h l v o - o p H n < d iso o sltív o , 0_RDONIY)) < 0 ) f e r r o r jf 'o p o n ’ ) ¡

p e - ro r r s a w j.w lx s flje A O * >; 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! »

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 * ) ;

V f lS V , m v « : i « « f f >;

^ ^ 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 » > )

>

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
i f | iicasacidadas 4

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 | psrrO(‘ ('SCUND_U!XEfl_READ_CAPS"¡ ¡

ia JHQ¿¿?_ZXCA._:Wl))

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 w iv « l\ n * ) ¡

Fuento

F ia n te

* Cérrar e l dispositivo «eíciacor •/

O is p o s itiv o

clossídescriptor

p r iflt Y ( ’ Uo£claO cr

ü.-aaacion

A c t iv a

£ s t ir& c

ze archivo),

returfl i ; C«*intí( * ----------------------------------------

--------------------------- \n-); ron ; i = a

t < SOUKOJUIXGR.NROEVICES ; * -i¡

a is o o s it iv o s ’ i

t

i* ;< i « i ) i fl33Cara_dispositivos) ( dispositivos sispomblas *,•

C3n3— /

f Racorrer todos los /* Sois interesan les

i j i n a s c a r a jg r a b a d o n ) ;

{ coodicioo ? prifltfl*

pn ntf|'S2 c V 8s*, i , r o t u io s (il); /• In c rin ir nontre y nunars oe

• jr n _ s :a t ( ( 1 « ruer.ta p ara g rs c a c io r.? •/

roía iaprixir_3staoos{int co ^ic io n

r

¿Se t r a t a 3a una

Si

’ l : p r ir .t r C

MO

') í

B|;

;

/

)

)

)

)■

)

)

t

)

)

)

)

\

)

)

f

f

>

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): ..'« m a d o ji u jc l í d o r

i

cscatto <J<j / d e v / « u « r :

5ALIOA

C a n il

Putntfl

Fjon to

D is p o s it iv o

N ival

« •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*

Qaaa

NO

NO

VES

7 5*

75*

2 rr«Q i

NO

NC

YES

75*

75*

t

90*<

3 Synrn

VES

.so

ves

7S*

75*

■» ?cn

W

NO

ves

I00S

1WH

5 SOHr

SO

NO

NO

8 Lina

yes

NO

VES

7 <ÁLí

ves

VES

w

3 CO

VES

NO

YES

9 ttix

75* 75*

75*

75*

75*

3*

«0

NO

NO

i 2 ig a in

WJ

NO

YES

75%

7 5*

13 OgaLn

NO

NO

VES

75*

7 5*

ff*

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

'

1

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{ | )

( !• Ajusto* do volunon

i r t canal u c u ltrd o , canal deracno, n iv e l;

•/ int e u p c a ttiv o ;

/• Que dispositivo* configurar •/

U t l; in t descriptor ard u vo ; Mxciaoor •/

/• Qoscriptor ce arcnivo ael d is c o iltlv o

r «asearas do Q lt» para

t.*!t « K i r i dispositivos, d iip c s itiv o esteroo; 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 e * jc ü c o 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

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

< •) S * " tr! -SiX«_MtXEa_?&i0_STE3€00EV3* J;

STSFíOCCVS, 4 d :s p c s itiv O ji9 t e r e c )|

)

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

/ H ctV in ',

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

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:

* i « « I í « veluacu Ce d * W »H «r astaalecido *n 75S

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
--=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

2S8

J

)

)

t-

)

)

)

)

>

)

)

)

J

>

J

)

}

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

7. E scribir dicho bloque al dispositivo áe reproducción abierto.

289

'

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>

AFMT_A_LA1N AFVT

lU A A G P C U

Codificación logarítmica Ley u CoOJflcactfn logarUmlca loy 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 ü
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

A FU T_yP £G

formato de

16 oits

un signo c-g ardían

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«
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.

i j é m p l o

ate ejemplo es un program a largo y relativam ente completo que ilu stra el m aterial provisto en e sta sección respecto de la m anera de program 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



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

#¿r>cluce <4rrno.ft> r d íf t f ie TA1WM0,3UF 4396 :n t t a m iv o io } i

/ • P 3r3 s t n r r o r */

/• Para »rrno */

I

Cac*lu’.0 13: La API de sonido: OSS/Free

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 ;

291

/•

/ • V alo r r*torna
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 ¡;

.* Fijar

a ly .r « i p a raM tro i

/ • S u f '« r p a rs la n u a st-a V

•/

• 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 £ ) ;

• ¿
< 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 i ? ( f a r * « 0 i Js F V T jC ^ x iT iT c ~ * a t5 & AfMT A i í fo r r á is i

i

p

p u t S | l, , -tA?VT_«
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*);

c e v /c sa s o n :* ) ;

) 2 92

}

)

)

]

)



)

.

)

)

)

)

)

)

)

)

>

>

J

>

)

Programación en Unux

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*};

i f ( f o rn a to h

. • 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'exbibe en s~ d o u t los formatos que a d m ite corrientem ente /d e v / d s p . De !a m an e ra en que está escrito, c o n f ig _ a u d i o reproduce una m uestra m oaoacral de form ato S bits. En consecuencia, ei program a fija ei 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: ./C0«fi5_í-Jíí0

ti

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 so3ro 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 jrabocló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 í , cw

;• u t c i n

u o i t i •/

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
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 2 9 6

j

)

)

)

P ro g ra m a c ió n

j-

) . ;

t

i

)

>

)

r

)

)

i

)

>

■>

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 reutilizados 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.

¿00

i i ; ) - ,i Programación en Linux

/

i

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

T

_dli>cén_s?iecK

ü SALIDA

head -10

U

jjljjp m (H orror ruii

NOOíflaa w dlopen aeowaac t dlopífi_<íoit d lc lo s e .o : u _ a l_ c’ cs9

) ) )t)

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 Dyrmmí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

.3

•r

■q

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. 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 . 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 . 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

SALIDA

Ldd informa que el cliente de correo m u tt (que puede o no e sta r instalado en el sistem a en uso) requiero do c:nco bibliotecas com partidas, í loa juir/Qin/muct ÜbMl.JO.t •> /U6/1ÍM91.4M (&X4l)l>!U<J00) llbjljruj.ía ■ -> mr/llU,'UbsUnQ.ao, t /Ub.'UBn.iJO 6 (tX4M72QMH UBc.to.fl •» /U 0 /lía c .in .8 (Ox-iWWÍ&Mj 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, ndem ás de hacerlo en los directorios p red eterm in ad o s / l i b y / u s r / Í 2.b. La se ­ gunda variable. $LD_PRELOAD. es una liiita sepurada por espacios en blanco de bibliotecas com partidos adicionales, especificadas por ni usuario, que de­ 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 precompilado 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

; 304

)

)

i

)

)

)

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 dolorosamente 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 sec k m p io inundo listado, que viene inm ediatam ente desp u ta dol prim ero, es la implementació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 «^ *ctu c U lla * W a

? r - o r «n a rcftivo - e c u t r a _ e r r o r 9 i y r e t o r n a r a quien

*/ • O lí iS « 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 liflc lu a # < s t « r g . n >

P ara la d e fin ic ió n o# tr r n o •/ • ? a r a l a s c e c U r a c io r .e s oe fu n c io n e s ¡jue

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
( 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&.-allie«aras,. puRtero_arjunantes, A 7 cnivaaeg i3trc£rror6S|; va_erd(pyrttíro_argut«ntos);

1

>

f

'

)

)

'



)

)

i

)

Capitulo 1*1: Creación y utilización de b ib lio tec as de program ación

* 0 i3

t

/

;

307

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; a m a r U e 'u u r • /

* Valor <ju« cuier efectuó U llanada pueCs

• *pri.itft5v
/• r*nto * « rtn tn i cmo sp rin t^ ), « a ta c a r to c •/

K"

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); coa *uftc:ane» « ta rd a r

o* C, no ce
ü an aaas a

/Archivo a o ia rto y c o rrid 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 tipeo 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 SALIDA

o í : iiot*ca_ir-: '5 s . o: 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

;

3 08

/

>

)

)

'

I

>

>

t

f

'

f

]

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

ejfMPLO

El siguiente program a, c o m p ro b a r j n b l í o t e c a , in te n ta a b rir un archivo inexistente cuatro veces, una vez por cada una do las funciones de procesa­ miento de erro res presentes en la biblioteca. y Sonbra archivo *n Internet: e rrtest.c r •

c c a a '- o b a r . o ib lio t íc a . o - ? r o g r .in a da c o n p r c o a c ic n d e La b i b l i o t e c a a# na r.e to

Sé «erares •t ¿inc'.üie <stsio.n> « L i c l j a e < 5 :d i:b .n >

«induce •Libere.n• *C5!‘u’.fl SALTHAfl_SAi.Ifl.Sl_SRtt>R I ♦CJf^e <€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. :ocRt9ro_afCíiIvo * 'c a e r{V o o \

\n’ , std su t);

*r*)) == NULL);

ju n ta r j <*w rn*r(’ cei5 <-'»ar_btbU 5 t « c a .l 09 *. ’ Ss Sí*, ’ asor.tarj retornar’ , •no pcco'asrir fcc. So t x í s t t 4ic.no artfnvo o directorio.*); «if '-C if SU.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 .’ ) :

/• •J»_¡XIIT_SXI¡> V •*i:»£x:r_$ycc<ss);

#*acif

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» (nama 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ícad ó 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

EJEWPIO

CALIDA

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 . 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*
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. 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 directono 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

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 ( ¡|

a rtn t^ rv o

jo

- MJU.) {

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 • 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: jcc -q -wali ccirp.-obarjji.c -o c «a ro b a r_ c l -le í

s

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 onrre 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
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 habitualm 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
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 únlcam era a os p oes cc'i '•ornare. ranto ¡es aioes como los FIFOs. sin amoargo. son sem 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 ‘uncc^-es laies cohxj .<<ek para 'iC<ar carca o sesee un puntara ce archivo.

Los pipes sin nombre tienen dos lim itaciones Prim ero, tai como se observó, son 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

j .

y .

)

j

)

)

)

)

)

)

y

)

)

>

}

*

hfogramactón en Unux

•«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 .

)

)

)

>

)

)

;

)

'

)

)

)

.

)

)

)

)

)

Capitule 15: Pipes y FIFOs

\ «/

1/

E je m p lo

325

-■*

E l siguiente ejemplo abre y cierra u n pipe: • v^ac-j c ro g ru a =- Interna?

E JE M P LO

Y )

ptíopn.c V

r * tó fir_ o ic a .c

y =i€r,-3 ^

o¿g<

•/ tircluOe í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, arr«gIo_e«ac'> ptore)( 1 1 );

« p r a g lo ^ a íc ríp to r a a l» ! ,

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 armo a E Pí PE. & el proceso que asta escrio-w-do no ntiKcatKa o írc*a a SXG*»!f»c. el onsceso de escritura terminar.1». ✓ *>V3 soasar soore

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 •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<|, arenivo asrs ei- 3ipe •/

ín t dascriptOfArcAlvcOsras; catcs c.-e 253ea •/

/• Arreglo oe descriptores de • Descriptor oel archiva que sw iinistra los /• 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

328

i

)

)

)

)

)

)

)

)

)

)

J

)

?

)

)

)

/

)

I

Programación en Unux

/ ' Sfectuar jn

fí¡r< y cerrar ios descriptores adecuados ’t Z)

i f ü p i d = ?or¡<(}) <

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

)

)

)

)

)

)

}

)

)

)

)

)

'

}

)

>

C apítulo 1 5 : P ip e s y FIFOs

5 !•

'

) 329

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-

)

J

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 /

] ,'B f

E je m p lo

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

*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. •.— ) ) =

íaiir_si_errorj*30ceíi*);

W U)

Caoitulo 15: Pipes y FIFOs

'

'. i

331

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»1nu 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 .: SALIDA

Oe»”' w

e le r* a a is*

*/

»incioM «unisra.r» *VVIvOt <StC10.,*l> u n c i d a < s ? c l i3 .n >

FIFOs Tdl como -*i ¿ementé anteriorm ente. los FIFO s se denom inan 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­ vía su salida hacia el comando c u t.

EJEMPLO

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 «jaroc«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. simplerrantt 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. zcr -as ¡amadas a sisaba*, en página 1 . f. :• x tos errerss que retoman generalmente las llamadas a sistema.

✓ Tac» a 6-1. *CÓ¿gos’ac em x generados te r* una ¿sta

334

Programación en Linux

i

%i /

j 3 [il'y

E je m p lo

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) { argun*ntn V

/• £i r.ctJKa d«L srograua taobion »• c u n ta :ooo

WtiCMCCO 0£ EWP'.EO: nuavo'l'o <noncro_flt*_fli*o>‘ !; •XUJEJC:7.FAII.UR£);

) :f ((a k f if o < » rg v ( 1 J, todo|) < ») (

S^rrorCnkWo*); o*it|£X[r_FA!LUR£); i*LttEXlT_$UCCESS>

U n p a r de corridas de ejem plo de esto p ro g ram a produjeron Ih .siguiente

woco C€ £vgPL£C: SALIDA

ifo «n w n b rs j^ j^ fa »

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

eje m pio

Este ejempio es u n tanto complicado Un programa. i e e r _ f í f o, crea y abre un FEFO p a ra lectura, y exhibe la salida del FIFO en s t d o u t. El otro prograe S C r i o i r _ f i f o , abre el FEFO p ara escritura. R esulta particularmente interesante el proceso de correr en diversas ventanas varias instancias del proceso que ¿ e r e a cargo !a escritura y observar la salida de cada una de ellas en la v entana donde corre el program a que realiza la lectura. ■

c e i :* : c * i3 = =i I r i s —- :

• i« r _ íifo .c

C re ste 3

•/ « in e lú O e < s y s / t y p e s .f l >

- c 'i r s

: •

¡ r a resa f e s *

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

I

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 escnbe FIFOs. pnm ero, ambos extrem os d e un FIFO deben de encontrarse abiertos a n te s de que puedan ser utilizados. Segundo, y 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 puod*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 .: •/ r • sieí.*_f‘ Te.e

Zrt j : í a

91

f i a c l 'J H < SJr3 /ty p « .¡» >

ira

rsaa rrea í :

I

336

)

>

f'

)

)

)

l

)

)

)

)

)

)

)

)

)

}

Programación en Linux

íir.cluse <sysi'sia*.h> ílrcluda <«rriw.ft> íificl'jae <stdio.h> «incl'jd® <sMllD.it>

flnelcrf*

int aain(volfl)

< i r : <J«scrlptor_archivo inc

■:fti •/

/• Descriptor del FIFO »/

ma byras;

/• Nunero de oytes leíaos desde e l

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
> 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«uB.pym • '•«ao{dísIPE_8UF p r in :f i* líír _ f tro líy o : %s\ buf|; cio«(
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

•I íL-wiud# <sys/ty«s.n>

iirtcloa# <sys/stat.h> íirclwJe <ermo. n>

FIFO ‘ bien conocítfo*

•/

•.)! • 0>

J

)

>

)

)

)

)

)



)

)

>

)

)

)

)

)

)

)

1

J

Capítulo 1 5 : P ip e s y F IF O s

#ir*clufls <5tdio.r?> #¿ttCluos < E t : i i c . n >

íireluS t < Iifllíí.» <;ise.fc>

C o ÍT (V C iC )

{ in t ;«sc.-:D t3<-_irc.5’.i v c ; is t Itn ;

/ • D e sc rip to r d e l * :F 0 y / • ütuj^ro ae b y te s -*» c ritc 3 « 1 F [? o *,•

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 ;

>

(

> 337;

333

Programación en Linux

5 l« p !3 l, o o ra a c u tiv a s a i FIFO

* in t e r v a lo 3a t r e s segundos e n t-e dos e s c r i t u r a ;

> c ió s e Id 8 s c rip to r_ a rc l> ;v o l ; « < it| £XlT_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
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 emplea 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.tificadores 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
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* «uhuiguientes 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

344

I

)

)

)

/

-

)

)

)

)

}

)

J

)

)

)

)

)

.

J

}

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^ncical 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 recor 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 conceptu alm en te a los archivos (ñapeados en m em oria. La memoria com partida se ilu stra en la figura 16-2. ✓ La creación y ei empico do archivos mapoados en memora se anaDicon on detallo en 'Arctvvos maneados en «nemono*. jsflffinn i7d

La figura 16-2 sobreaimplifica de 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 momofia 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«?ocü.-ye jn r-scrode crecxccesasar. 0 _XO?£N_SOUHCc. Este m/scro *e ■•¿•quiere oorcuo 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íele'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á

• :~ n r_ izzzziP i:a z. :

'I ~ z-z'..zi « s y s f t y s e > .*>

ir .

: -.te'*=*-*r :~ a :

n* »-•>«.« * un sefiflénta

i s n c r i s coapartitía

)

)

348

}

}

}

}

1

}

>

> )

f

)

)

1

)

}

)

)

)

)

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

,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. *ly

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. Estas dos ru tin a s tienen los siguientes prototipos: cria- •snnatlint 9nniij, c l^ r ♦snir.adflr. f lags};

Int 3r.®Jt{cra.- -snoaori:

)

)

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 direcdó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 #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 ; c n a r *5u f s g r« w e c c íip ; - • l p rc ca a c *7

/• 3<

/ • I d e n t ific a d o r d e l %«o«iemo •/ / • P u n tara i d ir e c c ió n sn .« p a c ió de n m
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 / • V o r t fic a r

u a sa c« ilac < i\n ’ ¡ ;

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

íxaoee-wao

c<3833

k u r? j»a ll

566

4336

o

arataa

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

\ t/ T | /= l iT c M e T o

351

2. El próximo ejemplo adosa al program a u n segm ento de m em oria compartida, escribe d ato s al mismo, y luego escribe el contenido del respectivo b u f fcr en el archivo s a l - .d a _ 5 gto-ne 173c a n p . o u t • * 5 B 5 'f a : 5 '3 S r j * 4 *.1

o p ü w .c *

/• • í5 r ir_ s g :o i» « » o o : - * t r « r ta i

M ao ry sscnent

• S i r t u l s : * y ¡ '_ u ; ‘,-^*xr.oro íc m n ific a a o r

•I • ircJjtíf
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

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

pr>cwo •/

• $• sisara *us

ttgaen:* ’i if(ír^c l« 2) {

la li-a a le -cnandcs iay« preserte un td a m 'lc u d o r

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

3 í-rcrr»si;oc*); e*it<=Xrr_FAIL^£); }

• TAKM0_3UFH « íiULL) {

do

;

)

)

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 356

j

f

)

)

j • y

)

y

)

} ) . ) ) ) ) ) }

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

?

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.

y

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 identificador de la cola existente asociada con key St m sg g et fracasa, reto m a - l y unigna a la variable de erro r e r r n o el valor adecuado. E je m p lo

ejeM Pto

El program a de dem 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 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
/• •

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 raar la c o la

/ * C lave aa i a 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 ideatificador 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
Tai como fue expucado anteriorm ente, p a ra a ñ a d ir un nuevo mensaje al fimil de u n a coia ¿e deberá utilizar la 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 rseceaidaces de !as disertas apiicacor.es. Por «¡emeio, si uno desea transfenr un mensao 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 ;
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 •

5 in t» « u

« rn a r_ a _ c a ta

a una cola ya ao ie rta con a n te ric rid o s

í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 ¡|

{

se r

in t

ia « n tific a tío rje o U ;

in t

ta n f o .tttto ;

e n v ia d o s tr-c t

I'

lo n g itu d

se l

n a n sa ]e

o a tro n

n e n s a í*

a

* /“ M a s a je

• Oe te n e r

e i

O u f f a r .a e n j* } « ; ic a n tiíic s o o r

:e c o l a

r

e s tru c tu ra

tra n s fe rid o

en

ia

se

lin e a

de

c c ita n o o s

*/ V

362

Programación en Linux

if| a r$ c :* 2] { 3a corandcs •/

/» A sacer- nciríjre c a l prograns y arjunerto de su i'.nea

p u tii'W Q O O CE SU P lE O : e n v ia r _ a _ c o la < LtJtQ 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»: } I * A s o c ia r «1 n e n a a je in g ro « a d o c o n « m

(Mffttr r

g ro c o a o •/

• * n i. i) * . t ia o _ e a n s a | a • g e t p id O ;

A ñ a d ir «1 n » n sa )« a l U n a ! d« l a c o l a

•/

: aiui*a_:exto * strUn
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
5 s . /e
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 vulor de ty p e determ ina que m ensaje os retornado, tal como so indica en la si­ guiente lista: • S« ty p e es 3 se reto rn a el prim er m en saje («1 «uperior) de la cola • Si ty o e es > 3 se re to m a el p n m e r m en saje cuyo t í p o j n e n s a j e sea igual a ty p e . • Si ty p e ea < O »e re to m a o! prim er m ensaje cuyo tip o _ m e n s a je sea el valor m is bajo m enor o igual al valor absoluto de ty p e . El valor de f l a g s controla adem ás el com portam iento de m sgrev. Si el m ensaje reto m ad o tiene una 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
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*. • ln c iu « « < s td llb .t» >

< d ? íi.ie XAHMOJUF 512

r

J t r u c t r o n s a )» <

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 ; io r « n v u d o • /

/ • lo n jltu ií d * l * « n sa )a a

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 | 0« c o n a n íc a ' /

(

/ • A m o e r - n o rü ro c o l p r e g r a n » y « r j u c t n t a do

íj

li n c a

S u t i l -MCOO 2 c cUPLEO; l o o r _ c o l a < i d o n t l ': c ü d o r ao c o l a » * ) ;

oxit<£x:r_FA:LURE);

* ld o r .tif ic a a o r_ c o la * a ro 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

)

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



S Ii :« 2 c

S t

/ I w _ C 3 l a 544

lib re o i3e.“*Lfic*íor 3* ccU: «4*0 Tiro
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.

i

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

cjsm p io

El siguiente program a utiliza ia llam ada a m s g c tl p ara elim inar una col3 cuyo identificador se le transfiere on la lín ea do comandos. r Nonort del p r ^ r a n a qn [ n t e r r a t : f i c t i . c */ e • ? lt 3 iin a r _ c o la .c • E 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 *:n c lu o « < iy « /« 8 g.ft>

»tnclu<3« <s:dio.h>

«incluí» «yiciud* < «rin g .ti>

íirclud* 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 ' >; 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’ ,

9X¿ I ( SXI T_S_'CCS3S i ;

ic e n t ific a C o r .c c ia ) ;

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«
s ipcj •n

----- UíSJlc» Srf.ü -------

ir p

* « ;5

Í1ÍMHJ?:

smr*r

k u n jM il

5«i-rs ;« n í«S

js a í-S y tf»

« m sa g « 9

a

0

s S ..'#!¿siaar.c9U 'Z«í Con ' í S I

s S

lK t

3

-----MtU(« X k

i i -------«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 . «*7

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 368

)

)

i

J

>

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 expUcactfn, 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 semb u f al c u al a p u n ta s e c o p s . s e o b u f , d su vez. tiene ln siguiente estru ctu ra: itru c t leesuf { ira rt s*»_nut; saart ssa_5p; short s w _ f l g ;

/• Ku**ra d« swiaforo */ /• Operación a LLtvar i caso "I ! • 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; todos io s u s u ir ic s ‘ I s t r u c t saBDu- Ouf;

I • üern ch as do le c tu r a y e o d iílc a c io n para

/• Croar e l ser.aforo :on aerecnos ae lectura/nodiricacion para tocos los usuarias •/ idant:tlcaaíir_sonafQro - aengec^[W_PRIVATg, ?otal_s0nár
> 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 í.c a e r a a io n x r e a l i z a r c a r o i t l r JCC8 S0 *7

• 1; •

:j*.corftg_:ndicaccr=-: - :PC NCNWn; /alar pe.-siticc */

/ ' U n s o lo 36R gíorc /• in c r e a e n ta r o l s e n a ío ro ,

81aquear 3: se llega a naxu.a

i f ( (s e n o p ( id a n tific a d c r _ s 6 o a fo r e , ír .u f, tc :a l_ i6 T a fo r o 5 ) > « « 1 { c e r r o r C íe n c p * ) ;

Capftulo 17: 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 ---------------

SALIDA

K«y (IMNNM

icaid 5*2

e*r*r *urt_ « li

pems SM

man* t

status

El ejemplo utiliza IPC_PRIVAT£ p ara aseg u rarse do que ol 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 -

>

372

>

i

;

y

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.

\ 11

S: 18 ru tin a s e m c tl fracasa, reto m a -1 y asigna el valor adecuado a la variablu e r r n o . Si on cambio tiene (¿sito, reto m a u n valor entero que puede se r GETNCNT. GETPIO. GETVAL p QETZCNT, ae^ n 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 •/ );

Ü |)

E je m p lo

¿fgl

A >.-.tta a ltu ra el lector debería estar en condiciones do com prender la razón 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

mj>uo

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 *>;

>

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 3 i*K*ee*i

S

i« ic

«mer

5¿«

kurt_*ali

Mriw

n9ejs

status

i

> Í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

) ) ) ) ) .) ) ) ) ) ) ) )

- u m m U n M - " * ................................................................... ............... ..................»

)

I m i mi

) )

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 30d 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 conversació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 provoen 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 enrutwdor exam ina cada paquete quo a m b a a fin de d eterm in ar si m antenerlo o retransm itirlo. El en ru tad o r transfiero los paquetes quo debe conservar h a ­ cia -ju propia red, y por el contrario rem ite los paquetes quo no debe conser­ v a r hacia el siguiente en ru tad o r situado a lo largo de la 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 enrutad o res de n i _ r e d . c c r y s u _ r e d . ne t transfieren su s datos a la red y to­ m an de ia m ism a ios datos destinados a sus redes locales. Esto está repre­ sentado por las 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 ¡otorsocciooes •enrutadores). La ru ta que toma cada paquete por la Internet está contro­ lada por el «icam irudor. de manera muy sim ilar a la m anera on que la ru ta que sigue un 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 oara 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 caracteristicas 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 380

1/

1

t

h

)

) ) ) ) ) >J

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
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 Descripción direcciones Protocolos Socxets de entorne UNIX PFJJNIX AFJJNXX Ar_IMET ?F_INET TCP/IP (V\arai6n 4) Protocolo AX 25 para -gdíosneionodos AF_AX25 P=_AX25 PF_IPX Protocolo Novall IPX Ar_I?X PF_APPi.ETALK Protocolo Aotfe’aik DOS af _ appletalk 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 . '5 0 C k e t . h > .

protocolo» y

do direcciones atírtiUdos m r»aHa en < 3 y o •

| 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«cterí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
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 cread 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

384

,,

M

M

,•

> v

/ V

\l

}S >\ f - >' >' > >

> > }

1

'

'

Programación en Linux

CU=N7

r—

$E*VEW

ícci« : i)

^ correcto j

-

woac

ttooni) j

J a-xecM

ACnve jCCKfT

F ig u ra 18.2. Un cliente y un .servidor 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

irn

U )t« n ( tn t

:n : i c c í o t t l n :

socKfs, ínt

jc c fc a d d r ‘ a d d r,

i n t « d d r lo n j;

a a cfclo Q );

if lC h 'd , t e r v e t lO C K a d d r ‘ a a d r , :n t

t n t CO fln«ct(U»? í c c x í a , a t r e u t a o c k a fld r * a a d r.

* a d d rl« n } ¡

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

)

)

}'

C3c"íu>0 í $ : Programación de TCP./IP y Sockets

"

1

)

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
*9Zkmar_i¿e¡

{

us»lSn*fl m or» ! A t lu f i.f a a iiy : cna r w.n M tn ( tC 8 1 ;

/• AFJJNtX •/ /• ?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 uac ó 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»

¡ac<«t

ae

•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

3S^

»

»i I K y , ; . ro&.omo^ion en u n u x

lii

.1

)

t

)

)

.

>

)

*

)

t

i

/

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: wcxLen_t ta-iartojliríccion; Jtruc_clt#nre •/

r

/• Estructura co socket a» proceso cliente

/• tnitarto aol nioit&ro nockasdr C# estructura

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«£): i

!• Crear ol socket •/ L f ( | l d í n t i i , ica<jor_socK et * s o c S M t(JfjjN [X , 30CK_smEAV. a j ) ' a ) e r r j j u i t j 's o c M * ) ;

/• In ic ia l izar y astaalecor ia estructura de: cliente •/ « < t t « t í& 5 t r u c _ c iia n r e , », s u eof ( s v r u c _ c l i e r t « l ) ;

3t'*uc_clienta.3iin_fa.Tl’ y = A F jjM X ; 3tmcpy{strüc_cuante.3(in_path, a r g v [i), s ueof(strüc_clie nto .sun j>a tn));

i

)

}

)

)

)

)

)

)

)

)

)

y

) ) )

Capítulo 13: Programación do TC P /IP y Sockets

v

* 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 cuda 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 sockets 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 defineuna 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
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**:, • 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», 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.

3^2

)

}

)

)

-

.

)

)

Programación en Linux

j

)

)

y

>

>

>

}

J

]

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 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 desde el orden de bytes del sistem a al orden de bytes de la red.

short

in t

Las o tras dos llam adas, n t o h i y n to h s , invierten el proceso y por lo tanto convierten desde el orden de bytes de ia red al orden de bytes del sistem a

Cac'-..:o 15: 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 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 potencialm 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 »


«»

•iAClw C* < 5 W U 9 .« >

u n u m iv o id l

( in t 3# *crio *o < _ w c« < * f: s tr -jc t * o e **M r_ trt i : r v c _ u r v l 3 e r ; » o c k l*o _ t :»aa/io_a;r*ccio < *:

. • E s t r y c r . r j 3» soc««t «1*1 s o r / ic a r •'

* ;sa 4 i*3 a e i n;w »ero s c o a a o r ae estru ctu ra

*Trwc_$»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 ’ z* l a r « ' * j

/•

no

o l v ic a r s i o raen : s e y tss

l

) 396

) ) ) ) ■ ■ > . Programación en Linux

r

1

)

)

)

1

>

)

>

>

)

)

>

>

>

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 D ir e c c ió n tP Í . 8 . 0 . Í

s a l io a

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 dirección IP'

Ca.néctarid a un socket TCP/IP, Sintaxis: ccnactar tcpip

*7 * in clu d a < s v iM c c k o t.n > n in clu d e < .o etln e t/in .n > í i n c l u a e < 3 r p a ,'i n e t .h > í u i c l u a e < $ t < Jlib .lv >

íincLu -35 < ítd io .ti> f in d u d d •n « lp e r.n *

>

)

>

)

)

)

)

)

)

)

)

>

)

)

)

>

)

)

)

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 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 C ^ í ' i n i 11 1 ¡

d irección

ip

el

«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

398

)

)

)

J

)

>

>

)

;>

I

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 ¡ '• T y f. --------salida

* ./cr« a r_ tcp lp 3 c c m rc p /ip d isp o n ib le Puerto 5Z«
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 sockets 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
/• c « c r i a t c re» a« ípp.Hivo

it r u c H m d o r , ío c ««!

i* £ jtru c tu ra t»

<S*1 » « r v iíc r “ v

»oc*l*n..t t»M<,'o_air*cclOft; *tn*c.»«rvtdor •/

f" TjnaOo d*

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

jcoflun_t tartaftojliroscion;

/• Tanate d® ítn :c _c !i«n to

V r

'I

3# aguarda cano arguim.ico ao la linea Co cwmnaoj la uireccion IP •/

if(arge l« 2 ) { p u is r u o o o DE £UPLECr « s c r i b i r j i c p i p < 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

)

)

)

>

)

)

)

Caoítulo 1S: Programación de TC P /IP y Sockets

j

)

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

402

t

)

)

J

)

>

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 ; :n ; iw ddrtype;

/• Lista do ¡illas */ r A f jN e r v

in : iMflngth;

i* sizeof(struct ln_addr) •/ !• Lista Jo dlrccoionoB IP

cnar ••n_a
>; s tr u c t ho* t#n t *Q0 tilda tnym m o{co fl# t c íia r *nan®)¡ i t r u c : n c a ;* n t •■jnthosW yadd.-íconst c h n r *.nd(Jr, ln t

l* n , u i : t y o c );

g o th o stD y n a m e acepta un hostmime ñam e, uü como por ejemplo f tp .n e ts c a p e .c o m , y reto m a un puntero a u n a e stru c tu ra h o s t e n t que contiono la 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 dem últiples direcciones F?. consideremos un ru tead o r o encam inador (router), -m sistem a que incluye v arias tarjetas de red. C ada ta rje ta de red tiene una i

Capitulo 13: 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 permita- 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* • in c lu í* « arp a /ln ít.n »

•i.'sclucs 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/ststruct 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


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|; sarvtflor '!

OPÍittff ‘ A l i a s : * ) ;

r Tcdos loa

/• N o w e S3nor:co ael

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.

/* r&das la j diraccian»s

. bi.f >h_lor.gtn|;

IP almacorufliis
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

• ip c

3 r a irs c c ia ítts :

405

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 Programac’.'jn en Linux". le presentará v a n a s h erram ientas y utilidado» que facili­ tar. algunas de las tareas de u n programador. La miatna comienza Con él capi­ tulo 19. "Seguimiento de cambios en 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 aeguim 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 e¡ RCS

so n i? Z90* jc ares-ocreo que * «cay v í encuentre «npJearKJo qué .«ratón ae RCS se está ’-flitzando. 5pee re s -V.

5.” ?ara

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 — se 1*30^0. ri'.c Í U . 2 '- 5 z~ o ro s Srectorics

preGete#-—

-■>30 oe RCS es u f j . iar 'eD G S ¡* .cr.o en caca tfrectorto n>su*:a s._-c:e.r.3 sara proyectos sccuci’wm. Lo araarior - v - ' í : ;= RCS: no fafriHB e :niC^O con ac..setos que tienen in tracto. E'~- otra rezar- aor ¡a -rucha gente prefiera CVS.

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 i A lio a

or ana o í f i l a :

HOTS: T h w ia NOT tfte lag nessaga! »

Prograan sencillo da denostraeicn para ilu s tra r ol eupleo de RCS

i n i t i a i ravision: t .1

done S co

l aituente.c

RC3/nifuente.c,v 'e v m o n

done

t.1

->

( I o c Km

i

aífi¿an?e.c

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 < r.tm ' M i i o a .

1 .2 ;

a tfu w tt.c

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<

Sj 3iS y e k m ih o

E je m p lo s

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 repositorio y de haberlo modificado de alguna m anera i ci -r2 nif-jenttt.e <-

(¿g v i ' ^ sau d a

rtífuanta.e

r*" •'avuio.'i 2.1; prevloi¡9 revlJiOfl: t.2 eoter iog m sag#, t«tntirac#a vrith single 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 ^ salida

S.’ SMP'.O

R C S/M .rxjen te.c.v

r«yi$iofi !.2 dor,c

—>

Jifu a n t o

or ena of rile:

Caoítüíc 19: Seguimientos de cambios on el código fuente

: :o

415

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

z-

•■$$$,i? 2a 35:N:$s
- 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

,

) 416

,

}

)

)

)

)

)

)

)

)

1

)

i

> )

)

)

1

}

]

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 . El campo S S ta te S tienen 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 dotorminar 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

V* ‘-r'F Z ^l cjc m piq

E je m p lo

P ara ilu stra r el empleo de i d e n t d-eoeremos cre ar prim ero el siguiente archivo de código fuente, ingresarlo a l repositorio (utilizando p ara ello la opció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

418

1

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

_______ c u m p l o

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 repositorio 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 '

•I

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.

Caoítuto 19: Seguimientos do cambios

on el

código

fu e n te

419

*:.->c 1üSí

#irtclud« «sMlib.a» ♦inciuO» 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.

CiCMPLO

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­ 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
1 , 1 / 420

}

)

.1 ■

1

P ro g ra m a c ió n e n L in u x

5d3 < 3T3*IC C ía - "C 3 ; i [ |

_<*3il

£xp

■=■ '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 “ -

S ’.n ’ ;

:7air < >

3 l9 s p ( 5 l ;

Luego, com pare !a revisión 1.2 con la revisión 1.3: -p

SCS f U W

F.CS/ i* o i'in ir _ e n t o r n o . c , v

i

.2

--:.a

:n o r i n i r _ e n t ! > n o .c

s rcsdiff

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

3

\: /

I.ItÍÜ l) ;-=l

421

E je m p lo

El com ande sig u ien te elim ina u n a revisión no bloqueada y no m odificada de i E p r i B i r _ e n t o r n o . c: 5 CO -u - r l . t ^ = r r i3 i- _ ír : o " c .c SCS

iafria:r_*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 c u m p lo

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 : j j 0.- L s L r_ # n t c r n o .e

s r lo g

»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 f-

5 res - n . 2 :*£iini^ado ouf^er astático 'rc $ _ W H '* ¿ricriair^entorno.-:

*CS f ile - RCS/mprl*ir.sntorno.eIv core $ rlog -P1 . 2 iflprifflic_entorno.c RCS f i le ; 303/ in o ria irjjrtc rn o .C .v •orxing ' l i e : inorifli.-_antorno.c

Caoftuto 1 9 : S eguim ientos de ca m b io s en el 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; ELiairaco fru tar tita tico

Unas: »i 2

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), reaclean(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 estar3 e n cc^í-co-'C S a e oto * q < '« irftym^dflo C ü s> u s » : «fim'nó <Jc y j programa : « 0 3 '05 ¿ - Í 3CM35 r>*cesar.cs a IV a e hao w s¿ cc*responc«r'.e arcWva b inara rrtás C0ir.

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.

)

)

-2 8

)

) ) ) } } f-.ogrdmacion en Linux

in ic i o d e

)

)

)

y

)

)

)

)

)

)

)

)

>

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

rr^m «1sV¡iW f«.1...9WM, ***** '•T'OX —»*,-• - v * uV f,„» i — -^ 1

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

Capítulo 20: Un toolklt de depuración

>

n t j 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 *jocí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 disponó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 detiene 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

n

iic n n z a

n

i ’ ó im a r

ifl w t n

i . - j _ / _ o : 5 t « r i o (su.-*-#xo?fff8c$) n () a r p a r a j * t p « i r » r . c M 6

**° **" 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 )

cara_d«purar.i;:24

)

.)

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
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 determ 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

= J £ V (>V0

E l ejemplo siguiente m uestra una serie de comandos p r i n t consecutivos y sus resultados:

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 sirrillar a ;o que ftace el comarco cos>.sy ce DOS. • Ctrt+A deso'a» c> cursor hasta el comienzo de a linea comente. • Ctrt+D elimina el carácter situado sotiro ei cursor • Ctn+t desc 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
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
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 (deshabilitar i y volverlos a h a b ilita r con el com ando e n a o le {volver a habilitar). E je m p lo

E.'EM PLO

La saiid a de u n a sesión de depuración que se m u estra a continuación ilu stra el empleo de ios puntos de detención; ! 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.

s a lió *

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 t a r t c r c . ; r a a - / u s r fic c a i'n t» p r a fe c ts / lp « / 2*/src/parajJeD<jrar 5 r* » k o a ln t 1 . i u r a _ y ¡ i u r ^ J x O f f f f a W ) 24

a : p a ra_ d 9 p u r3.-.c:2S

s w r [ i| * t ;

ÍCCO) sa'in: i $7 » 15 :&C5 » m<© o rtw p o ir.ti •fea

Typ*

i

Dr»*kpoint

O lí :

Effc *M p

Accr?»» y

ítnat 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
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
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 ilarm enw , d ad as dos funciones, b l a í y s p i a t , cad a una de ellas incluyendo u n a variable de tipo i n t denom inada ld x , los siguientes comandos im p ri­ men las direcciones de id x en cada 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 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

) 436

)

)

)

)

j

)

)

)

)

)

)

)

)

)

.)

)

>

->

5

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



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 »

f E « f l en una va ria d o global Esta «c la ra d a anto» d«

e.tar buffor_global[51; *»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

filrra c ic o

q ti« M

a s ig n a d a

p a ro

nunca

> a rs

l la c ra d *

•/

* 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; /• Q uf

is ta

vez

so

casa

= n illo c (3 );

d*

la rg o

;o r

n t.c n o

« l f ir a l

do

: j í

*/

>

'

)

)

)

)

)

)

)

)

)

)

)



)

)

*

)

"

)

)

)

)

)

)



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¡);

• > a iiU C C j r i r c t ¿ a r i aU acanar «n ia varlabl# lo c a l •/

SALIO*

»?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 pleuz ¿snjuncion con un d ep u rad o r del tipo de g d b , estas h erram ien tas h a n salvado, sm ¿u d a, • rr--ichcs program adores que les saliesen can as verde? Las des h erram ien tas que se com entan aq u í san E lectric Fence y o en e e* .

)

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 fÉ X ejem plo

.•

-*

---------

A LI0A

Este ejemplo m uestra cómo u tilizar Electric Fence. J gíc ■•} «uljjjcjien cn a.c -o >-il_uso_renúfia lvfence 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

(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.'.

Finca ¿,o.S Copyright CO : aocie

niectric

(C! 1987-¡996 3rjce

^orens.

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 uxnbolo 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/correcciótv'recompilado U na vez que el program a esté totalmente depurado, rccompilelo esta vez sin hnkearie la biblioteca de Electric Fence. y el mismo esta­ rá listo p ara ser utilizado. P E R S O N A L IZ A C IO N O E E L E C T R I C F E N C E

¡Esper*’ dirá el lector Electric Fonce detectó el rebosamiento grande de la 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

) 440

)

)

)

)

)

J

)

)

)

}

)

>

)

>

)

i

)

)

)

}

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 a*.

|d# s:» 'íx4 eio.iff3 , a c c d » \ src«¡»xlKW95ee *abcdO*> ./ s y ii3 e o s / o o n # ric / ítfc p y .c :3 8

. / iy 5 d « p s / g o n u r ic m r c p y .c :3 8 : No auc* r i l e o r < ü r« ctcry .

(QflO) «furo «

itrepy (<j«at-0x40'.0afft> 'aocCo*. 6rc-»x3«-t95aS 'acedo')

#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 . #rgc*1,

./íysa*ps/3enertc,'>trcpy.c:38

.KQV'-axaff'f334, Ifllf«x0í48660 < _ in u > , ftnl««x6ft495ac < _fLnt>. rtld_nm*ax40í»a356 <_dl_r:ni>, 3tacK_ond®exDffff92C> ¿t

./iys
<*»> 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
>

)

)

)

!

)

)

)

/

)

)

)

} 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 intere sa d : ei» «i mismo'r. la mism a sim plem ente provee la m ateria prim a p a ra que i os program as de utilidad de mpr. que procesan el registro obtenido con el fin ce crear 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
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 empluon 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

EJE M P LO

E ste ejemplo m u e stra varias corridas de m a l_ u so _ m e n o ria . compilado con m check. con cada corrida habiéndose corregido el erro r encontrado en la co­ rrid a previa: s ./nai_u80_«inoria POS.POCO

: accde

n‘y cloccersC ssst and

S . 3ai_i¡so_n8(T
POCO

: accda

i f allocated biOCK

Caoftulo 2 0 : Un toolkit de depuración

?W_WJCH3

443

: aíCC«?3*

8gjausau»RT 0 :

í:c « * :-

c*scry clsetfí'K t ir f s r g lliOC 3 t«
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', aprendor á 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» btn an o s. Este capitulo exam ina el proyecto t3 r de GNU, ias utilidades g zl.p •) : n s * a l l y el A dm inistrador de S iste m a de Red H at, RPM. Todos los p ro g ra m a s d e e ste c a p ítu lo p u e d e n s e r e n c o n tra d o s en el •jitio Web f i tT p ://* w * .B C p .C G f f l/in f o bajo ol n ú m e ro de ISBN 0789722151.

j 448

,

j

,

>

>

>

>

>

'

t

>

>

'



■’



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 /

ÍJEVPI.0

3. P ara croar un archivo comprimido, sim plem ente a ñ ad a 2 a ia lista de opciones. Tradicionalm ente los archivos t a r comprimidos, o zipzados, se desig­ nan 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 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

..

f ^1

í TTToa

.‘ o t c r . c o n f

atc/dosanu.conf itc/gprt'root-Conf « t c / n o s t .c D / if

■ 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/cjocución. para ol propietario y 'ecturo/ojocuclón para al grupo y oí rotto 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 -
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 r |[7]l ^ r¡E \

¡T e m p lo

1 Este ejemplo e stá tomado del makoíile de gdbm, ia biblioteca de base de H^too do G:TU. Luego de expandir algunas de las variables de m ake, el ta rgot i n s t a l l es: in s ta ll. 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. ^ %i_í ly \1 / /g j cjcm p '. c

2 E ste ejemplo crc-a un conjunto de directorios debajo de / tnrp y asigna algunos modos extraños a los archivos que copia i n s t a l l . A menos que ei leeto r tenga permisos no habituales sobre / tn?p. este programa debería ejecu* tarso sin m ayores problemas. El escrito utiliza algunos de los archivos do la 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

lf

a tu

o s e s w i s K r . z $ ih e / * : b

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

JIM T A U . •£ -a ¿M

5 SGft? JL3£ S 2 V

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!*

------ ------ _ ----------

SALIO*

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

: rrx r-x

5
u « rs

•3 2 * J ü i 20

P-X

/

15 7 2 3 - e l 20 >54:-4 3 n s ¿ 2 < n r .c '

-

—*—* —*

1 •a r'.ja lL

usar*

- X - I

1

« I I

¿ s a rs

5522 J u i 20 0 4 :i* c h w j.c *

; f c r t «rail

u se rs

• : i 2 : J u l 20 0 4 :! * c b o » n .c '

-x

- X

- i

_x

K a rt

!W *= J u l 2<J 0 4 :u

;p.^rp.c*

y

v

>

)

)

)

)

)

)

>

>

nación en ünux



S

—X —X —X -X - X —X -X —X - x -X -X —X -X — X — X

l J c u r tjn U

users

1 fcurtjtail

users

2454$ J«1 28

i* :'*

1 •
users

2Í521 J u l 22 34; :i

1 xurt_wall

users

38SS4 Ju l

k u r t jM ll

osees

i

copy.c*

6354 Ju l 28 04:-4 co-f.asn.c*

20 24::4 20.c* 29320 Ju l 2? face*

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 6 7 3 12 J u l 23 0 < :2 1 Cí.PO

-

- •



i root

-

- •



’ ra o t

X f*

-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

-

75552 J u l 23 « < :2 l (Je.SQ

-

-•

-•

-





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 07227 J ü l 28 0 4 :2 1 p l.p o

-

-•

-•

l rs o c

x fs

-

-•

- •

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 subdirectorio 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 trocuenaa para Lir.ux. Pero existen versiones disponibles dol sistema para va­ rios siatemaa operativos añnea a tTNXX, incluyendo a Solaris, SunOS, HPUX. 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 dingir 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 asiKtvno J'./« í-iCoc
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 filosofia 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 dcsarrolladorde 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.05rpn — shcwrc ¿fiCHITSCrwS AtO OS:

^ .- L íjJ * •...* ^

------------oa

salí

auiid áren

: ¿336 cM pariD L e O Liia a re n a : 1686 íS36 w iig ir>86 -loaren o u iid o s : Linux rc a p a tiD le b u lld o s 's : lim ix m s x c ll arcr. ¿ rs -a ll es c :a ? a t i 0 I « ai-chí c s o a a t ic ic es 3

: : : i66ó :

U36S -ír.ux 1436 i3 3 6 n oar:fi L in a *

^rVflC VALUES: ta c r o fiie i : /L -sr/iib /rp ft.'n acro s - / u s r r p s / 1686 - U nux / n a c ra a : / e t c / rpn/ raemos rp o /iS 8 S -Iirvx> 'raero s:-*/.rp iT O 3cro s

Capituio 21 Distribución de software

o p tflsg 3

4 55

: -92

- 1 4 : & u e o r f ig u r « ( l C :)

V_ii&xooiiíí} -rosy -^o<-c9 S{__ac lo c a l) V _ * u t© r« M * r)

S(_au:a*aV»}

M_tvtown?} M C:_jyxS!r«- p * J ' X *

u

o M C*J;} cd V -C*> ¡)

S u sistem a puede llegar a ten er configuraciones ligeram ente diferentes. Tal como á*» puede apreciar, la salida e stá dividida en do5 seccioues urquitectura y configuradones de 3istema operati%-o, las cuales definen el entorno de 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 uiatalado 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-construcció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®
)

)

)

) 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 rel="nofollow">( 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. Habitualm 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ódigo 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

sIlT oa

;i*cu:isq: 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 €

- C ^ S V lO .S O J ft C c



O J Ü P € S _ S O j S C £ '4 M !. O TJSCPflO rO -15

0.3SO_SOUfiC6

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

í x s &j Z w

; : S c le 3 r

í3 & 3 .!'p b

£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 460

f

))

)

f

)

í

) ) J .1J í ) ) J J . ) 1

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:



—t e s t :

Proserva loa archivo? tem porarios y los scriptz creados d u ran te el proceso de construcción 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

464

j

)

J

J

J-

)

i

)

i

)

>

>

f

J

J

>

J

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 c o n s id e ra r /juo

n u ll,

• ic s m n o » a b r i r c d jt u s ic a .d b 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 r o to m a r 0 .

c o rrie n ta n o n te a b lo r tu

S ;»n p r«

•/ tn t c o r r a r _ c 3 'v o i o i ;

r • A ^.idir a . r u g is t r o cuya cLav« sa a o u f j i l a v e y su v a lo r o u f_ v a lo r a 1 ¿ c a s e de • d a to s c o rr io n te a e n ta a b ie r t a , fle to rn a r J a l lo lo gra b a s o l s i d ich a c la v e • /a e d i t a . y e rrn o an todos lo a (jemas c a s o s .

•/ Lnt iA a o ir_ re g (c h a r ‘ c u f^ c la v e , cn ar *D u f_ v a la r ) ;

/• • c l m i n a r a l r e g i s t r o cuya c la v e so a ig u a l a nuf c la v e . S l lo io g r a n o i, s in c r o n iz a r la • b a se de l a t o s con a l c is c o ( v o lc a r a d is c o lo s r e g i s t r a s p r o s s r :a 3 «n la n a o c r ia j y • re to rn a r v a lo r da

a l fra c a só n o s, r a t o n a r I s i no s e encor.-ro un» c la v e i g u a l a l

• 6 u f_ c la v d o srrn o an :o d os l o s dan as ca 3 0 5.

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

igual 3 i i= í

zi-s :s S itos. ouscanco jna clavo cuyo valor

$«3

• clav*. S i t«*e=o$ e tito . .-tta m a r 3 y alraacanar ios datos corresaoncismas » i f Jiia ve • i.* valor. S: ■'-«c.saaaos, ra to n a r 08,«>T?0UN0 or errno.

•I ir t 5uRcsr_rag(cfc9r •bir*_clav5. DST "va lo r); /• • a tc u ja n - ;e txrfjrLave.

ix z a t d« íatos *1 r t g u t r © cuya clav» $

• : ato**ar ® s i t d i m t t u w

varU&it

49

/ almacenar « l corríspandisnt* valar or la

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* rel="nofollow"> 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 f r u ijw i,

nc existan re g is tro s e is o o n io la s . S 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,

NUU, ic5);

i f (vaLor_ratonaM l»

"

Z) {

ráturn vaior_retoHja<Jo; /• E— or ra:ai

> "«tur-i 0 ;

ce C3EAÍE. «S M ,

muu

Capitulo 22: Proyecto de programación

ir.*,

467

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»_
!• Clava ya axist* '!

revjpfl 1; » Í J I ;'(v*l3r_.*í:cí-r-4C^ !• 8)

* •Ccurno .HQun otro tiao ae srror

r « r .-f l «al;-_r**3ríi*4c; 33->s>-;(32. í ; . retUH» í ;

* «ita . •

• S in c r s n iif ia 32Sá 2= catas •/

‘I

J:

J

J

J

468

)

)

)

J

)

)

)

J

>

J

)

J

f

J

)

J

)

J

J

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 rnaría), • c a ooco

o cero

m i l l o s s t m c c s o s r a I m i t a r ;o s O ytes a con p a r a r con la

loncitofl • :■= la cacen» jjscsca

=3"! asegurarse que la coincicencia sea la g itlfl*.

• ccopar* la ior^irad es la 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»eclave ; : : e • »trlen(6uf_cU ve>; • i*r ai podeacs seterer e l "► jistro

'I

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

•* o b jio t p ü u w i

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)) :* {

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 siatem a. Las excepciones a esta regla s e r i a informadas. a b r i r _ a b abre U base do datos especificada -*n ru ta _ a c c e so _ d b . Si ru ? a _ a c c e s o _ d b es NULL. se abre uno baao de datos predeterm inada denom i­ nada C d_nu3iC a .d b »n «?1directorio c o m e n te do trabajo. El indicador 0B_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 term inados ¿n un cero binarlo. Debido a ello, b u s c a r _ re g utiliza s trn c m p a fin de lim ita r ios caracteres que se com paran. 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

) 4 72

)

^

)

)

)

)

)

)

)

j

')

y

)

y

?

)

J

)

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 3erkeley 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 •I

U t ilt t y fvnociona ror miste CO dotabas® oragran.

«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
« 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> safe

/• ? a n * « « t

n rc la tfe <;«toot.1»

/ • Para getcpt

•/ »/

474

Programación en Linux

r Para '««iicpy' en glibc 2 . 1 . t

ílnclude <s-i-trrg.h> «trclude , ge3*
itfqfi^e

/* Administración ae aasa <J« datos

'/

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

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 if(argc = loptarg

* 44 MJLL) 44

(strlen{opta."g> »= l| si <argv(opund| 1= MjtL)| { valor_retonado * aradirj-egfcptarg, argv(opt¿nfl|); if(valor_ratornado == t| {

’sá' ex iste\r‘, optargj ¡ 5XIt(EXIT_rAIl.UR£J;

p rifltf('C la ve

> eisa íf (vaicr_.-e:ornatlo < i ) { perror( ‘ c lie n te jjc n .c : añadirj - e g ') ; **it(EXIT_FAIUJfiE|;

>

cera •/

»

f

I

i

Caoítuio 22: Proyecto de programación

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 *
p rW tfrC U v a

i)

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

475

.

Programación en Linux

)

.

/

/

y

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 :

tf(* rg c — 2 )

/• Listar todos lo» ragistros •/

{

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
<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
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: rel="nofollow"> .M \n ’ , ( : m ) s t r l « n ( c l a v « [ i n , ( in t) * t r l* o ( v a lo r a » ( t | ) , v*icr«*£ i 2 );

> &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
c la v a * ( i] ,

Programación en Linux

\ n \ t { 0 {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 oporac ó 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 varinnte 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«
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 480

] ; y l ) Programación en Linux

)

)

)

)

)

)

•>

y

>

}

}

'

y

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 Sinat 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_

IqusUs */

ami>ulu

r Protoccion contra nultlp lo inclusión de «lM tntO k

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

*/

J '

)

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 modularidad 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 implementacró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
«:>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; p r in c ip a l */

/ • tin a a da a sta o o an i a p arto i n f e r i o r de l a ventana

wl.tOCM •v e n ta n á _ c e ^ t"a o a io ; p r in c ip a l ' I

¡ ' Zor.a de e n tr a d a /a a ia c a de la ven tan a

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

• : e a _ j * í 't i i . j . c :

483

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 ; r it y r *

rt* ? » M _ ftjr « a ¡c M ;

•»;

> / • C c ^ ig y - a r « i t e c la d o •/

if{c& r* u< ) •• ifW j r» ttm

: f ( k « r P M ( » íjf c r . r* tu m

/• ?rocejar*roi l i entraca c» d ito s noiotros V

•»; nu£¡

.« e m j /• H a t n iit a r « i u n clo o o* c ia v o a - F •/

- t{

/• Controlar la ja ltd a a* dacoi nosotros •/

i f i n o f o s l ) — £1W) 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;irie -S a lir* ; r A E fin v iK ftW , 3

^ l-E Ü B i'.ir

* . ’ V i‘ , "Kru; ;

r-i-Si;3car

FS-flecuperar

C5 -L is ta r

) 4 8 4

)

)

)

)

)

)

>

>

)

)

P r o g r a m a c i ó n e n L in u x

>

y

) Capítulo

w rafre5h(nennrinl ¡

vaid 9l¿aisar_ reg {ch ar #6'j'_cLava)

re ? r* $ t-();

(

22: P r o y e c t o

d e p ro g r a m a c ió n

preca.-j,-_vintana(vectii-i_<j9_:r*54jo);

>

*v*prinr»(v*ntana_a«_:r3baja, t , a, TNTeflPflETE: *);

M nsaja_a_usua-:o: ' t«grese c ia v * •);

void n a n s a je _ a _ u s u a r io ( c l» 8 r • n a n s a je )

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> ;

nv«printw<9tatus»ir., o , 8

' S s ‘ , nonsaj e);

wrefrashtJtatuawln); r« fra s h ();

i ve id <J
{

>

: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 ;; sk5Jtr»r_nntar4( »ar.:ana_3a./f abalo);

* en m (v«ntana); 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 , n o o c * ia ( |;

«rrafratinlvontanai; ra f ra v i{);

*, *INToaPREfE: «is- , buf.oiavc);

*v»o.-int»
»

) «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: •>; nansa]a_a_ust:aria( 'Ingrese c la v e * |; *fl«ts:r(van?ana_3e_tranaío, su f_ cia v a ) ;

¡e » iiV « y»ntana_5 « _ tric a io , i u i y , aaxx); if(c o rta c o r — • ) «; «eras»; * *ntira j s a . t r a c a j a i ; BvW‘ Iü»(v»nta fl«_3a_trifia io . ccntacar, 0. ACS_HLINE, xaxxj;

avwoPlntvr(ven:ana_de,trabaio, 2, vj, ‘ TiTiiLO: *); nenaaje,ajjsuarxo(*Ingrese valor *I ; *'gnstr
)

rrtpriflT»(ventana_de_trao»io. ccntaacr t |, e, •¡NTeflPRETs*); lywírxnT» 1 ventar,aj » _ : r asa) a, ccncsccr • 1, eaxx / 2. ‘ TÍTULO*)¡ s w “,lire (ve r:a n a _:e _:ric a jo . contaccr - 2, a, ACS.HLI.'tE, uaxx);

i siguia ite j

= :c-r.*=:•:: - 3:

)

m .

\

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 tedado 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 'cocdo* (cooiicd) y cancela los recursos de memoria otorgados a las tres subventanas. 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 fundonalidad 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
en " t u r t a i.” •I H-KlvH <»tdli0.f->

*ar«

««te*

3a*« 5s cato» Je CO a .» :c a l« bisado

•)

<*nu:d.f>» •wclyc*

«-getoot

» ;n c lu C *

< ! tr in g .f t>

* trK J w ti«

• 5 « it5 r_ d e _ :< ja .T

# ir .c li* J t

• • c d K r .r » *

v

K ttlM v o id

/• »»ra r*

»ir*

’oetopt *eacov

*/ «P

« lib e

« a m u tra c io n /•

Y a .ie jo

de

p a n ta lla

2 .1 .1 de

oa»e

*1 3» d a to *



-t2*

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|; ••✓ a lc r * » ;

zr.ir 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

*f

« ,

4&8

J

,

> .>

./

)

>

>

> J

> J

J

• J

i

i

\

/

J

*

J

J

J

* -l

'

Programación en Linux

Capcíuio 2 2 : P ro y e c to d e p ro g ram ac ió n

íf { a b r ir jjb (o p t a r } )) f p r ir .;f( s M « < T ,

(

3las

' 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 )

9 X Ít(S X IT .P A IL U flE > ;

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;

ir r íí ;

}

~Z: E lia in a r un registro •{

C1Í9 <£v _":3 i :

}

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; a s o <:

i? ( vale r_re tomado > 9) / • U t i l i z a r l a o ase d« tíatos D redeterninatfa */

I f fa b r ir _ d b ( V U L L | ) {

r-3CM :*_3_jS'.arior'::379 ra ^reentrada*); ?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; d a f a u lt :

br«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
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 */

B u t i ( ’ € r r o r »1 i n l c u l k a r n eu rita s*);

♦lia

i t (valor_r«tc.*nadc < a)

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*);

) y

i5 rm tri5 u f_va lo r, 's.*-.*, ( tn t; v a i o r . n » , fenar •V/.üor.OUtAj.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

•(

wnila( ( Tk«y - fl«tch{)> I* KEY_F(1©}|

:aja KTr_F(5) :

{

jw lt c h jf k a y J { C158 ¡<EY_F(2} :

* F 5 :- «ecup«rar un registro •/

.-*cue*rir_r*g(buf_c¿ave); M*set(*Valoc. « , s:«<sf ( 0 8 T ) ) ;

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 * } ;

489



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*);

a caca puntero •/ < contador; »* t) (

/• Asignarla valor f o r c • •; i

l«< (clav«s| 11 ■ nallcc(r/»MMÍ0_8U*)) ■■ NULL) { r.unsa:«_a_UBuario{ "Error do nenaria*); oran*;

f tf 11valor*i[l) ^
) 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

i ' Cía»* incorrecta, tn fo rn ar i us.iar;o ‘j

5 »*su lí:

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í */

• C#r-*r •! SU08Í3tit<M tí# C U T O S */

eerr*r_rcvr»*»(J; «* i:< € x :’ .5UCC€3S);



I n s t r u c c ió n * !



u so

í« .

ír o y a e a

•i fO iO »© dO _3«_*«0U O {vO llJ)

< pucs(*MOOO 0* 9 * t£ 0

tn:«rfai_uiuarvo_o3fl l-a 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

*

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.

1

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

A Recursos adicionales Bibliografía comentada ALLESA.VDRO RUBWl, L inux D tvict D riixrs. O’Rcilly, 1998, ISBN' 56592-292l. 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 156592 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.tice 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/TicBrzax 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 Kernigh an y Ritchie pocen - a su libro, The C Programmíng Language. Lam enta-

J

,1

} 500

l

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 erical 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 Grnpfuer. 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 introducció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, AddisonWesley, 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. Addison-Wesley, I99S, 0-201-30821-5. Escrito por dos de los mejores program adores de aplicaciones de Red H a t Softw are, este libro realiza u n excelente tr a ­ bajo en explicar las su tilezas de escribir aplicaciones p a ra Linux. No cubre kernel hacking, sin embargo. MlSE LoUBDES. AfiDY Oram. Program m íng w ith G N U Software, O'Rcilly. 1997. ISBN 1-56592-112-7. E scrito por integrantes de Cygnus Solutions, pro­ veedores de apoyo 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 Progmmnung, > 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 Wiley 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, Macraillan 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 hackers) 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 adores de juegos para Linux) ntrp:/ w ».« c . m : -«Kk-lO/lfiOBlcg..ira Linux GSDK rr.-.z: i- ’ i i t í a-c.c*-esquirol u í---d8*.fi:a¿ G rap.cos Form atos de -archivos 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 / •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

• Linux P ro fe sio n a l ín s u tu te

ntto://9**.lpí.or¡/

ic a I

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/
• 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
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
« 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
Misceláneas • Lnsure+~. una herramienta estática de validación de ^.odigo •como LCLint) ntíj: I /••». par»soft -coai crocucts/lrsure/ ird**-nt rel="nofollow"> • PowerRPC, una herramienta de desarrollo rápid» para ..¡uñadas 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

pro

)

512

1

)

)

.1

)

>

Programación en ünux

'

}

}

'

>'

r

■'

'

J

;

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


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

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 «ifdcfs. arch ivo s con. 22

tin c lu d e . a rc h iv o » que

-g. opciones. 14. 21. 450 -help. opciones. 30 -i, opción, 37 •jN. opción. 37 -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 •Ldirnjuno. opción, 1415 •m, o pción do lín e a do c o m an d o s, 450 •MM. opción. 15 •n, opción. 37-39 •O. opción. 14, 19-20, 23. 29 •o, opciones, 14, 450 -On, opción. 14 •p. opción, 301 -peduntic, opciones, 14. 17-18 •q, opción, 301, 428 -r, opción, 37, 301-302, 414-416, 418-420 -s, opción. 37, 10-42, 300-301 -static, opción, 14-15 -truditfonaJ. opción, 14 -u, opción, 300, 413. 420 -v. opción, 15. 300 -W, fam ilia d e opcio­ nes, 14, 29. 37, 39 -Wall, opción, 11.17 -w error, opción, 15 •Wfile, opción, 37 •W im plicit-m d/cactor (flag) de función. 29 -x. opción. 12

41S S, v a ria b le * . -46 .C. e x te n sió n , 9 .ce. e x te n s ió n , 9 .i. e x te n sió n . 9 .11, e x te n sió n , 10 .o, extensión, 10 Jj, extanaión. 10 .«o, M to n sió n , 10

/dov, filM y stcm , 70. 278 t a r u o t ' Li u p to d a te . m en saje d e e r r o r , 52 < -1, valor, 84 < std arg .h , 304 •a. e x te n sió n . 10 , 303 -anvi. o p c ió n , 14. 17-18 •b. o p cio n es, 468 -c, op ció n . 11, 14,300301

•D XOPENjSOL’R C E , m acro, 347 -d. o p c io n e s. 37. 52. 301, 428 —dele te, o p c ió n . 449 -Dfooobar, o p c ió n de lin e a d e c o m a n d o s, 14 -E. op ció n . 10 -£. in d ic a d o re s (flajísj, 19. 30 -f. opción. 19, 3", 414415 •fstack, sw icch d e v e r i­ ficació n d e e g es, 29

i

516

i

}

t

i

j

.1

y

/

)

)

/

)

J

)

Programación en Unux

A a b o rt, fu n c ió n , 23, 87 a b r ir archivos, 140, 142 bases de dato Berke­ ley, 204-207 colas (queues), 356357 FTFOs, 331 Gnu DeBugger (gdb). 426 pipes, 322-323 programas con Gnu DeBugger (gdb), 426-427 acceso ile g a l, m em o­ ria , 434, 437 acceso , g a n a r a archivos bloquea­ dos. 182 a información do a r­ chivos, 148-149 n variables Juera de rango. 434 acceso s de bitrt, 134 ilegales, 435 indicadores (flugs), open y creat, lla­ m adas u sistem a, 140 permisos, modifica­ ción de. 152-154 a c c io n e s, ra tó n , 258* 264 a c e p ta c ió n d e p e d i­ d o s d e co n ex ió n , 383-387 a c tu a liz a c ió n d e tar* balls, 449 A DCs (c o n v e rtid o re s a n a ló g ic o -d ig ita les), 288 a d d c h , n c u rs e s , fu n ­

c ió n d e , s a lid a d e c a r a c te r e s , 230234 a d m in is tra c ió n d e p ro c e s o s y m em o ­ ria , 122-123 a d m in is tra c ió n de r a tó n , n c u rs e s, 257-264 a d m in is tra c ió n de mapeo de memo­ ria. fam ilia de lla­ m adas para. 174 da ventanas, ncur­ ses. 253-257 a d v e rte n c ia s , g e n e ­ ra c ió n c o n GNU ce (gee), 17-18 a g re g a d o d o se g m e n ­ to s d e m e m o ria c o m p a r tid a (SHM ), 347-351 a g re g a d o d e tar* h n lls, 449 a g re g a r archivos comprimi­ dos, 446 bases de datos Ber­ keley. 204-207 bibliotecas do pro­ gram ación, 300317 colas (queues), 356357 color, ncurses. 250253 com entarios, makefiles. 50 conjuntos de seña­ les, 107 cursores, 213 daemons, 191-200 Directorios de S iste­ ma de Control de

Revisiones (RCS), 411 directorios, 163-165 estructuras de comu­ nicación ioterprocesos (IPC), 342 FIFOs. 331-333 formatos gráficos a aplicaciones, 313 formularios, n cur­ ses. 269-273 m akeñles, 35-36 m apa en memoria, 175-177 m em ona com partida (SHM), segm en­ tos, 345-346 menús. ncurses, 264268

procesos, 77*33 reglas, herram ien ta makc de GNU, 40-52 RPMs (A dm inistra­ dores de Red H at Package), 453*459 semáforos. 368-374 sesiones. 193 sockets do entorno UNIX, 387-388 sockets. 380-382, 394*397 subventanas, 253255 tarballs (archivos tar), 446-448 ventanas nuevas e independientes. 253-257 ARFLAGS, v a ria b le p re d e fin id a , 47 A itk cn , P e te r, 139 a lc a n c e d e v a ria b le s , 434-435

índice

alig n e d . a tr ib u to . 23 a lm a c e n a je d e d ir e c ­ c io n e s. re d e s , 393* 396 a lm a c e n a je d e e le ­ m e n to s e n b a s e s de d a to s B erkeley, 208-210 a lm a c e n a je te m p o r a ­ rio (ca c h e ) d e tip o e s c r ib ir d e sp u é s , 142 a n á lis is d e a rc h iv o s d e e sp e c ific a c ió n . 455-458 A PI. V er in te rfa c e s p a ra p ro g r a m a s d e a p lic a c ió n a p lic a c io n e s añadido de formatos gráficos a. 313 base de datos do CD musicale». código fue ni* p ara, 463495 bases de datos, re­ cursos para. 512 bastidores de aplica­ ciones. recursos para. 509 compilación. 7-30. 425-426 contraseña. 65 corriendo en Gnu DeBugger (gdb), 426-427 creación de bibliote­ cas para. 301-304 daemons. creación de. 191-200 depuración. 426-435. 439-443 cüstribución. 44o453. 504. 510

extensión de p resta­ ciones de, 313 gzip. 51 Ipedated, 196-199 m ake de GNL*. 33-53 recompilación des­ pués de extensión. 313 recursos científicos y m atem áticas pa­ ra.. 512 setgid y setuid. 6667 ar, c o m a n d o . 301 AR, v a ria b le , 47 a r c h iv o s b in a rio s , C o n c u r r e n t V er­ sió n S y ste m (CVS), 412 a r c h iv o s b lo q u e a ­ d o s, u tilid a d RCS descripción. 41 ingreso y extracción. 422-423 a rc h iv o s c o m p rim i­ d o s, c re a c ió n d e. 448 a r c h iv o s d e c o n fig u ­ ra c ió n . 303 a rc h iv o s d e d ir e c to ­ rio . V er d ir e c to ­ rio s a r c h iv o s d o dispo.si. tiv o . 133 a r c h iv o s d e e m p a ­ q u e ta d o , lista d o d e s u c o n te n id o co n l a u tilid a d tar, 446-449 a rc h iv o s d e e sp e c ifi­ c a c ió n . R PM . 455» 459 a r c h iv o s d e r e p o s ito ­ rio . V e r a rc h iv o s

517

d e tr a b a jo a rc h iv o s d e só lo a g r e g a d o .160 a rc h iv o s d e tr a b a jo descripción, 410 modificación. 413 proüjam ieato, 420421 visuaiización de dife­ rencias entro. 418-420 a rc h iv o s e s p e c ia le s d e d is p o s itiv o s d e c a r á c te r , 133 a rc h iv o s n o rm a le s, 132 a rc h iv o s o r i e n ta d o s a b y te s , 132 a rc h iv o s rp in rc , 453454 a rc h iv o s Uir. 446-449 a rc h iv o s a incluir, opciones y argum ontos. 1516 a p ertu ra de. 140-142 ostento (log), c rea­ ción de. 194-196 binarios, C oncurrent Versión Systom (CVS), 411 bloqueados descrip­ ción 410 ingresar y extraer de directorios RCS, 422-425 cerrar, 140, 141 configuración de, 303 Je biblioteca, opcio­ nes y argum entos, 15-16 de especificación, en paquetes RPM, 455-459

'

518

>

y

)

)

)

i

/

>

j

.)

)

;

)

)

)

)

i

P ro g ra m a c ió n e n Linux

de trabajo. 410. 413, 418-421 definidos con ^ifdeís. 22 de3cnptorcs. cierre de, 19*4 directorios. Ver dimctonos eliminación desde tarballs, *449 en trad a / salida (E/S), llam adas a sistem a. 123 escribir a. 142-L44 especial de bloque, especial do carác­ ter y diapoüitivo, 133* especiales. Ver a r ­ chivos de disposi­ tivo extensiones, in te r­ pretación do cc de GNU de. 9-10 gráficos. formatos, 503 impresión de infor­ mación referente a, comando rlog, 421-422 •.ndwdos con «include, 12 ingresar y extraer archivos, Revisión Control System fRCS), 411-413 imncdificables, 160 lecrora de, 142144 tnakc código m ultifuente. compilador. de programas con, 12-14

creación, de reglas, ■40-52 creación de un ar­ chivo make, 3536 descripción de un makefile, 34 manejo de, 132-190 norm ales. 132 Revimon Control Syatem (RCS), 410 revisiones, 410 rpmrc, 453-I54 *óln para urtndir, 160 Ver tam bién vínculos simbólicos; tarballs a rc h iv o s, b lo q u e o d e. 182-185 a rc h iv o s , se cc ió n (RPM ), 458-459 a rg u m e n to s clave, iniciali/.ación, 208 cmd, 371-374 facilidad y prioridad, 197 GNU cc (gee), 14-22 indicadores, 179 llam ada a box, 238 longitud y com:en 20 . 177 opción, 196 tipo, 363 valor, inicialización d e .208 arreglos im prim ir prim ero ubicaciones en m em oria asocia­ das con, 430 semáforos, 369 AS, v a ria b le , 47

ASFLAGS, v a ria b le . 47 a s ie n to (log), a r c h i­ vos d e, d a e m o n s, 194-196 a sin c ró n ic o , c o m ­ p o rta m ie n to descripción, 94 llam ada a fork. 79 AT&T, 95 ató m ic u . 183 a tr ib u to s nlmeado, 23 em paquetado, 23, 26-28 no retom o. 23-26 no-vuelco y aync, 160 procesos, 62-77 a ttr ib u te , p a la b r a re s e rv a d a , gee, 2326 a ttr o n y a ttro ff, lla ­ m a d a s u, 251 a u d io c o m p rim id o , 288 a u d io sin c o m p rim ir, 288 a u d io . Ver ta r je ta s d e so n id o B B * tre e , b a s e d e d a ­ to s, 205 b a c k tra c e , co m a n d o , 429-430 b ad m em , fu n ció n . 436-439 B ailey, E d . 453 B all, B ill, 137 b a s e d e d a to s d e CDs m u sic a le s, có­ d igo fu e n te de p ro g r a m a s p a ra . 464-497

,i

/

Índice

b a s e s d e d a to s b a s a ­ d a s e n re g is tro s , 204 b a s e s d e d a to s q u e e m p le a n d is p e r ­ sió n ih a s h ) de d a ­ tos, 204-205 b a s e s d e d a to s B -tre e , 205 B asadas en d isp er­ siones o hachea, 204-205 basadas en registro?. 204 Berkeley. 203-217 CD musicales, códi­ go fuente para. 464-495 recursos de softwa­ re, 512 Ver lam bitn Domair. Ñame Sjutem (DNS) b a s tid o re s p a ra a p li­ c a c io n e s, 509 B erkeley, b a se d e d a ­ tos, 203-217 B erkeley, A PI ( i n te r ­ faz d e p ro g ra m a s d e ap lic a c ió n ) p a ­ r a so ck ets. 380*382 b ib lio te c a r s a d l i n e . GNU. 432 b ib lio te c a , a rc h iv o s de, o p c io n e s y a r ­ g u m e n to s e m p le a ­ dos, 15-16 b ib lio te c a s c o m p a r­ tid a s, 310*312 b ib lio te c a s de p ro ­ g ra m a c ió n , c r e a ­ ción d e, 299-317 b ib lio te c a s de p ro ­ g ra m a c ió n , h e r r a ­

m ie n ta s p a r a . 300* 304 b ib lio te c a s e s tá tic a s , 15-17. 303-310 b ib lio te c a s convenciones sobre nom bres. 15 de ncurses. 220-240 de programación, creación de, 299317 ístáticas. linkeo do. 15-17 readlme de GNU. 432 recursos p ara. 509 b ig -en d in n , c o m p u ­ ta d o ra s , 392 b its m o d ific a d o re s de m odo d e a r c h i­ vo, 135-136 bits de acceso. 134 informados por co­ mando SN0CTL_ 0SP_GETCAPS 294 modificadores de modo da archivo, 135-136 bkgd. lla m a d a , 237239 b lo q u e a d o re s, a rc h i­ vos, 183*186 b loqueo d e a rc h iv o s e sp e c ia le s, 133 b lo q u eo d e re g istro s, 185*187,189 b loqueo de archivos, 182-189 ¿e memoria. 179-180 de registros. 185-139 b lo q u eo s c o m p a r ti­ dos, 1 8 6 blo q u eo s c o m p u ls i­ vos, 183

519

b lo q u e o s d e a d v e r ­ t e n c i a . 183 b lo q u e o s d e le c t u r a o c o m p a r t id o s . 186 b lo q u e o s d e e s c r i t u ­ ra o e x c l u s iv o s , !S (¡

b lo q u e s d e d a t o s ,

134 b o r r ie r , f u n c ió n . 230 b orrar

registros corrientes de bases de dutos y cursores. 215 directorios. 165-167 archivos de tarbalis, 446 elementos de bases de datos Berkeley, 210-211 colas do mensajes. 365 semaforoi», 3671-374 evitar en archivos do trabajo, durante ingreso a directorio RCS. 413 b o x . f u n c ió n . 239 b o x , lla m a d a a m ac r o , 238 b r k , lla m a d a , 123 b u g s (erro res)

de memoria, tipos de,435-436 corrección de errorea con GNU cc (gee), 21-22 B u r n e t t , S t e v c n , 137 b u sca r

ayuda sobre coman­ dos de Gnu DeBugger igdb), 437 paiabras reservadas de Revisión Con-

520

¡ ) ) ) ) } Programación en Linux

>

)

crol System CRCS), 415-416 problemas en memo­ ria, 433-441 bytes, o rd e n d e , 392 C

C con E je m p lo s (li­ bro», 139 C P ro g ra m m in g L a n g u a g e, s e g u n d a e d ic ió n . E l (lib ro ), 139 c, o p ció n d e lin e a d e co m a n d o s, 446 c_close. fu n c ió n , 215 c_del, lla m a d a . 215 c_get, lla m a d a . 214 c_ p u t, fu n c ió n . 214 en d o n a s de p se u d o -c a ra c te re s, 234 c a d e n a s, tip o s d e d a ­ tos e sp e c ia le s en chair. puntero u una cadena de psoudocar actores, 234 chtyp»». tipo de ca­ rácter que rep re­ sen ta un pseudocaráctor, 231 ident, parám etro de la función openlog 196 callo c, r u tin a , 123 c a n a le s e n d is p o s iti­ vos m e z c la d o re s d e so n id o , 281-285, 290 c a ra c te re s , n c u rs e s entrada, 243-244 salida, 230-234 case, ra n g o s d e. s in ­ ta x is, 23

)

)

)

J

)

)

c at, co m an d o , 32Í-322 C a th e d r a l a n d Che B a za a r, T he, 56 CC, v a ria b le . 47 C e rra r archivos, 138, 141 base3 de datos, 205207. 215 descriptores de a r ­ chivos, 194 FTFOs, 333 Gnu DeBugger. 429 pipos, 322-323 c e rtific a c ió n p ro f e ­ sio n a l d e , L in u x , e n tid a d e s , 509 C FLAGS. v a ria b le p re d e fin id a . 47 c h , fu n c ió n , 237 c h d ir, r u tin a . 163 c h m o d , U am adu, 123, 151-153 c h o w n , lla m a d a . 123, 153-154 c h s tr, e n d o n a s de p se u d o -c a ru c te re». 234 c h ty p e , c a r a c te r e s d e c a d e n a , fo rm a ­ to, 231 ci, c o m a n d o , 411-415 c la v e /v a lo r, p a ro s, 204 c lav es, e n b a s e s de d a to s , 204 c lav e s, e n m e m o ria c o m p a r tid a , 343 c lie n te s , c o n e x ió n a s o c k e ts. 383-388 cióse, fu n c ió n , 206 ció se, lla m a d a , 123, 140-141,324 c lo se d ir, fu n c ió n , 167

)

)

)

)

c lo selo g , lla m a d a , 196 c lr t, fa m ilia d e f u n ­ cio n es, 239 cm d. a rg u m e n to , 371-372 co, c o m an d o . 409-415 co d ecs. 278 c ó d ig o e n e je c u c ió n , m o d ific a c ió n de, 433-434 c ó d ig o fu e n te compilación de pro­ gram as con archi­ vos do, 12-14 programa» p ara base de dolos de CD musicales, 464495 SOffuiinionto de cam ­ bios, Revisión Control System (RCS), 409-423 c ó d ig o m u e rto . 29 c ódigo ejecutar, modificar. 433-434 fuente baxe de datos de CD musicales. 464-495 rastren de cam ■ bios, Revisión Control System (RCS), 409-423 inspección de. Gnu DeBufrger :gdbi, 430-431 modificación de. implementaeiones, 57 muerto. 29 optimización. GNU cc (gee;, 19-20

índice

ratón, compilación. 258 reutilización. 299 c ó d ig o s d e re to rn o , su m a n e jo en n c u rs e s , 253 códig o s de error. 124-123 de retom o, ncurses. 253 c o lo re s, a g re g a d o a v e n ta n a s con n c u rs e s , 250*251. 253 c o m a n d o s d e im p re ­ sió n . 429-432 co m a n d o s ar, 301 backtrace. 429-430 cat, 322-323 d y co. 411-415 cpto, 446 cut. 322-323 dele!*. *32 disable, 432 echo. 42 en makuñlcs, 35 enable. 432 gdb (G nu DeBugger), 425-427 Help. 429 id. 66 idcnt, 417-41» mío breakpom ts, 432 in s ta ll 449-453 invocar al anterior. 432 h lL envío de seña­ les. 99-100 ldeor.ñg. 302-303 ldd, 302 list. 429. 432 is. 9. 333

mkfifo. 332-333 om. 300-301 p rln t. 430-433 res. 417-423 riog, 420-421 run. 42S SNDCTL.DSP.G ETC A PS. bits reported by, 293 sta t. 147-151 step, 434 w natis, 429 c o m e n ta rio s , e n m ak e file s, 50 c o m p a r a c ió n d e a r ­ c h iv o s d e tr a b a jo . 418-420 c o m p a tib ilid a d do b ib lio te c a s , m a n ­ te n im ie n to , 310 c o m p ila c ió n c r u z a ­ da, im p o rta n c ia e n L in u x , 8 c o m p ila c ió n de código p ara ratón, 258 con ncurses. 220-222 do program as. 7-30. 426-427 c o m p ila d o r d e C. V er GNU cc, eg e s co m p ilad o re-s, sitio s Web p u r a d e s c a r ­ g ar, 510 c o m p re s ió n d e t a r ­ b alls, 448 c o m p re sa , u tilid a d , 448 c o m p ro b a c ió n d e b i­ b lio te c a s , 308-310 c o m u n ic a c ió n in te rp ro c e s o s (LPC) descripción. 321 m em oria com partida

521

(SHM). -341-372 C o n c u rre n t V ersió n S y ste m (CVS), 409* 411 c o n d ic ió n d e c o m p e ­ te n c ia descripción. 79 señales, 95 c o n d ic ió n d e s a lid a . p ro c e s o h ijo . 84 c o n e x ió n a s o c k c ts. 383-388 c o n e x io n e s a re d e s , 394 c o n fig u ra c ió n c o ­ r r ie n te d el m ix e r do so n id o , v is u a li/a c ió n , 281-284 c o n fig u ra c ió n , urchivo» d e e m p a ­ q u e ta d o d e R ed H a t (R PM s), 453455 c o n ju n to d e C o m p i­ la d o r GNU M ejo­ ra d o . 28-30 C o n ju n to E x p e ri­ m e n ta l GNU do C o m p ila c ió n . 2830 c o n ju n to s d e s e ñ a ­ les, 95. 107 c o n m u ta c ió n d e p a ­ q u e te s , re d e s , 378880 c o n s ta n te s de tip o fi­ le, 136 lseek , lla m a d a , 143 c o n s tru c c ió n d e p r o ­ g ra m a s bibliotecas de pro­ gramación, 299317 RPM (A dm inistra-

522

Programación en Linux

dor de em paque­ tado de Red Hat), 458-459 c o n s tru c c ió n , s e c ­ c ió n (RPM ), 455456 c o n s tru c c ió n d e a r ­ c h iv o s e je c u ta ­ b les, h e r r a m ie n ta m okc d e G N U , 33* 53 c o n te o s do r e f e r e n ’ c ia , m e m o ria c o m ­ p a rtid a , 345 c o n te x to descripción de. 62 variables do, 434•135 c o n tr a s e ñ a , p r o g r a ­ m a s d e, 60 c o n tro l d e ta r e a s , s e ­ d a le s , 93 c o n tro l dol proceso de cons­ trucción de pro­ gram as. 33-53 de semáforos, 371376 c o n tro le s , e n tr a d a /sa lid a . Ver lla m a ­ d a a ioctl c o n v e rtid o r e s a n a lo g ico -a-d ig ita l, (ADCs), lim ita c io ­ n e s d e g ra b a c ió n d e fre c u e n c ia s, 288 c o p ia d o d u r a n t e e s ­ c r itu r a . 80 c o rre c c ió n d e e r r o ­ re s, GNU cc igcc), 21-22

c o rre g ir. V er d e p u ­ r a r c o r r id a d e p r o ­

g ra m a s e n G n u D e B u g g er (gdb), 426-427 c o rr u p c ió n d e m e ­ m o ria , 435 e p io , c o m a n d o , 446 C P P . v a ria b le p r e d e ­ fin id a , 47 C P P F L A G S, v a ria b le p re d e fin id a . 47 c re a r archivos de em pa­ quetada compri­ midos, 449 archivos tar, 447-449 bases de dato» Ber­ keley, 205-207 colas (tfueues), 358369 comentarios en makofilos, 50 conjuntos do seña­ les, 107 cursores 213 daem ons. 191-200 directorio, 165-167 Directorios de RCS (Revisión Control System). 411 estru ctu ras IPC de comunicación en­ ere procesos, 342 FCFOs, 331-333 formatos gráficos en aplicaciones, 313 formularios con ncurses, 270-274 makefiles, 35-36 m apas en memoria. 175-177 m enús, ncurses, 265269 ncurses. color, 250253

procesos, 77-83 programación de bi­ bliotecas. 299-317 reglas, herram ienta make de GNU. 40-52 RPMs (adm inistra­ dores de em pa­ quetado de Red Hat). 453-460 segm entos de memo­ ria compartida (SHM), 107. 347348 semáforos, 368*371 sesionen, 193 socketa de entorno U N K . 386-3887 sockets, 381-383, 395-396 nuhventanas, 253255 ventanas nuevos e independientes, 253-257 c re a t, lla m a d a , 123, 139 c re d e n c ia le s d e u n p ro g ra m a , 62 o rd e n a m ie n to s alfan u m é ric o s, o rd e n de c la sific a c ió n , 204 erm o d e , fu n c ió n . 242, 244 c u o ta s d e tie m p o , 62 c u rs_ w in d o w , p á g i­ n a d el m a n u a l, 253 c u rs c r, p u n te r o , 223 c u rs e s d e BSD, 258 c u rso r, fu n c io n e s de, n c u rs e s , 223 c u rso r, lla m a d a , 213 c u rs o re s

creación. 213 movimiento con ncurses, 239 navegación de bases de datos con. 213215 c u t, c o m a n d o , 322323 CVS. V er C o n e u rrv n t V ersión S y ste m D DAC. Ver c o n v e rtid o ­ re s do d ig ita l a a n a ló g ic o D sc m o n s creación. 191-200 inclusión de bibliote­ cas estáticas en. 303 d n ta tfra m a . p ro to c o ­ los, 380 d a to s e s tá tic o s , b a ­ ses d e d a to s B e r­ keley. 210 d a to s estáticos, bases de da­ tos Berkeley, 210 laten o a de. 19 D ata B ase T h an g . 204 DB.NOSYNC. v a lo r de a rg u m e n to flags d e fu n ció n d b .o p e n . 206 d b . fu n c io n e s y p a r á ­ m e tro s. 206 DB, in d ic a d o re s ifla g s), 214 DBT. V er D a ta B aso T hang d e ñ n ir handiers de señal. 106-114

variables. 42 d el. fu n c ió n . 210 d e le te . c o m a n d o . 432 d e ls c re e n . fu n ció n , te rm in a c ió n d e n c u rs e s, 228*230 d e p e n d e n c ia s , m nkefiles, 35 d e p u ra c ió n co n GDR. 429 d e p u r a r (d o b u g g in g ) con Electric Fence, 43S-440 con Gnu DeBugger (gdb). 426-435 con mcheck. 441-442 con mpr. 441-442 habilitar, ncurwa. 221 memoria. 435-443 program as compila­ dos. GNU cc (gcc).

21-22 Ver también (roubUshocting (solu­ ción do proble­ mas) d e rw in . lla m a d a . 254 d e s c a r g a r (d o u n lo a d in g ) compiladores desde Internet, -510 Red Hat Package M anager (RPM), 453 d e s c r ip to r e s , c ie rre de, 194 d e se m p e ñ o mejorar y optimizar código: con GNU cc igcc), "19-20 reseñas, 29 d e s p la z a m ie n to de c u rso r, n c u rs e s ,

p e d id o s c o n e s p e ­ c ific a c ió n d e v e n ­ ta n a . 239 d e sp la z a m ie n to do c u rs o r, n c u rs e s, 239 d e te c ta r acciones de ratón. 259-264 .¡eriales pendientes. 114-116 d e te n c ió n do p ro c e ­ sos, 86-89 d ie_ o n _ erro r, fu n ­ c ió n . 23 d ife rim e n to d e co­ m andos pop d esd e la p ila (sta c k ), 19 d ig ita l a a n a ló g ic o , c o n v e rtid o re s (DACs), lim ita c io ­ n es en g ra b a c ió n de fre c u e n c ia s, 288 d ire c c io n e s du fam ilias do soc­ kets Berkoluy, 381 ligazón a sockúts, 383-387 redes, alm acena­ miento, 393-395 d ire c to rio s cam biara, 163-165 creación y elim ina­ ción. 165-167 descripción, 133 listado, 167-169 Revisión Control System (RCS), creación de, 411 d ire n t, fu n c ió n . 168 disable, com an d o , 433 d isk s, e s c r itu r a de m a p a s a . 179

5 * 4

Programación en Linux

d is p o sic ió n do v e n ­ ta n a s , n c u rs e s, 223-225 d isp o sic ió n , se ñ a le s d e. 94 d is t ta r g e ts , majkefiles, 51-52 d is trib u c ió n d e so ft­ w a re . 445-160, 504, 510 d is tr ib u id o r e s de s o ftw a re , 505-506 di, in te rfa z , 312-315 D N 5. V er D o m a in Ñ a m e S y ste m doit, fu n c ió n , 72 D o m a in Ñ a m e S y s ­ tem
E/S. Ver e n tr a d o /s a li­ da echo, c o m a n d o , 13 ech o , fa m ilia de f u n ­ cio n e s, 231, 242 e d ita r permisos de acceso, 151-153 directorios, L63-165 archivos propiedad de, 153154 marca da fecha y hora. 158-160 unpiezr.encacianes

sin modificar códi­ go, 57 protección de m a­ pas, 179 ejecución de códieo. 432-433 archivos de trabajo, 410 e d ic ió n d e có d ig o fu e n te makefílea, 36 recursos p ara, 508510 eges, 28-30 E le c tric F e n c e , d e ­ p u ra c ió n co n , 43814» e lim in a c ió n (kip ro c e s o s do, 86*89 e lim in a c ió n d e b lo ­ q u e o s e n a rc h iv o s e x tr a íd o s . 422 e lim in a r archivas de trabajo, evitar d u ran te in­ greso a RCS, 413 archivos en tarballs. 44í colas de mensajes, 366 cursores, 215 directorios, 165-167 elementos en bases de datos Berkpley, 210-211

regiscros corrientes de bases de datos, 215 semáforos, 371-374 e m p a q u e ta m ie n to d e a rc h iv o s, s is te ­ m a s d e, 446-454, 504, 510

e n a b le , c o m a n d o , 433 e n c a b e z a d o , se c c ió n (RPM), 456-457 c n c a m in a d o rc s , c o n ­ m u ta c ió n d e p a ­ q u e te s , 378-379 e n c a p s u la m ie n to . Ver sín te s is e n d w in . fu n c ió n , n cu rsC s te r m i n a ­ c ió n d e. 228-23» e n to rn o , v a ria b le s d e, 45. 302 e n tr a d a /s a lid a (E/S) de archivos, familia de llam adas a sis­ tem a. 123 tnultiplexing de. 169-174 e n tr a d a /s a lid a , c o n ­ tro l d e, 279-280. 283 e n tr e n a m ie n to , r e ­ c u rs o s p a ra , 51» e n v ío d e se ñ a le s, 99102 E ra (E p o ch ), 158 e ra s e , fu n ció n , 239 e r r a r le p o r u n o , tip o d e e rro r. 435 e rr n o , v a ria b le g lo ­ b al, 126-128 e rro re s verificación con GNU ce (gee), 17-18 códigos de, 124-128 control de, 379 adm inistración de dacmons. 196-197 herramienta maJie de GNU. 52-53 llamadas a siste­ ma. 126-127

índico

errarle por uno. 435 Hamaca a pipe. 325 retornados por fun­ d o n es de menú post y u n pos;. 256 valores, fondones de Socket*. 382-383 e rr o re s , c o n tro l d e. 379 e s c r ib ir a archivos. 141-143 a FTFOs. 335-336 3 pipes, 325-331 a sockets do entorno UNIX. 390-392 a sockets de Protoco­ lo do Control de Transm isión/ Pro­ tocolo de Interne! (TCP/IP), 398-401 mitpas a disco. 179 mensaje* a colas. 360-363 reglas, herram ienta m ake da GNU. 40-52 e sp e c ific a r frecuencia del m u « treo. reproducción do sonido, 290 ventana, ncurses. 238-239 e s ta b le c e r form atos de m uestra y frecuencia de mueatreo de soni­ do, 289-290 funciones de alarm a p ara interceptar señales. 102-105 niveles de sonido de interactivos, 2852S7 núm ero de canales

d e audio, 292 parám etros de dispo­ sitivos de sonido p a ra reproducir sonidos. 288-293 puntos de detención, nom bres de fun­ cionad y números d e línea. 432-433 m nask, llam ada, 193-194 volúm enes de dispo­ sitivo mezclador d e sonidos, 2S1 e s tru c tu r a s cabos (stubs). 301 packed, atributo. 23, 28 EXDEV, có d ig o de e r r o r r e to m a d o p o r L lam ada a sis­ te m a , 125 exoc. fu n c ió n , 80-83 e x h ib ir configuración co­ m e n te del mez* d a d o r do aomdos, 281-284 diferencias entro a r ­ chivos de trabajo, 413-420 p alab ras reservadas del Revisión Con­ trol System (RCS), 415-416 valores de v aria­ bles. -433 e x it, f u n c ió n . 23, 86 e x te n d e r la c a p a c i­ d a d d e u n a a p lic a ­ c ió n , 313 e x te n s io n e s d e C, G NU e c (gee), 2224

525

ex tensiones C, 22-24 interpretación por parte de cc de GNU de. 9-10 bibliotecas estáticas. 303 F f, o p c ió n d e lín e a do com andos p a ra a r ­ c h iv o s ta r, 446 facility , a rg u m e n to d e l a d m in is tr a d o r d e in g re s o al s is ­ te m a , 197 fa lla s d e m e m o ria n im ia s , p ro c e s o s, 73 fa lla s im p o r ta n te s d e m em o ria , p r o ­ ceso s, 73 fallas, d e m e m o ria , n im ia s o im p o r ­ ta n te s , p ro c e s o s, 73 fa m ilia d e d ir e c c io ­ nes, s o c k e ts B erkcley, 381 fch d ir, r u tin a , 163 fch m o d , lla m a d a a siste m a , 151-153 feh o w u . lla m a d a a, 153-154 fc n tl, lla m a d a a , 123, 186 field, fu n c ió n , 271* 272 F IF O s, 321-338. Ver ta m b ié n p ip e s c o n n o m b re file, m odo, 134-137 file sy ste ra e x t 2 , 160* 163

>

S26

1

/

/

>

}

i

)

}

)

)

1

)

)

í

)

P ro g ra m a c ió n e n U nux

fin a liz a r p ro c e so s. 86-89 flag, v a ria b le , 313 flag s (in d ic a d o re s), 19. 29-30, 139, 214 f l a g s a rg u m e n to , 179 flags, p a rá m e tr o , v a ­ lo res, 176 flock. lla m a d a a sis­ tem a, 123 fo rk . 323 fo rk . lla m a d a a, 7880 fo rm a to s chtypo. pseudo-caractere», 231 de m uestra «lo audio. obtener y estable­ cer. 289-290 gráficos. 313, 503 fo rm u la rio s, c r e a ­ c ió n d e. 269-274 fre c u e n c ia s , lim ita ­ c io n e s e n su g r a ­ b a c ió n , 288 fto k . fu n ció n , 344 fu e r a d e ra n g o , v a ­ ria b le s, a c c e so de, 434 fu g as, m em o ria. 438. 441-442 ful 1-d ú p lex , ta r je ta s d e so n id o descripción, 294 grabación de sonidos e n ,287 fu n c ió n a la rm . c o n fi­ g u r a r p a r a in t e r ­ c e p ta r se ñ a le s, 102-105 fu n c io n e s abort, 23,87 addch, salida de ca­

racteres con ncur­ ses, 230-234 alarm , configurar p ara in terceptar soñales, 102-105 badmem. 441-443 border, 239 box. 239 c. 214-215 o h .237 cióse, 206 dosedir, 167 clrt. familia de, 239 ermode. 242*244 cursor, 223 db o p e n .206 do control de m enús. ncurses, 266-267 do!. 210 delscreen, term ina­ ción de ncurses, 228-230 d)Q_on_error, 23 dirent, 168 dlopen, 312 dldose, 3132 dierror. 312 dlsym, 312-313 doit, 72 dupwin, 256 echo, 242 echochar, 231 endwin, terminación de ncurses, 228230 erase, 239 exec, 80-83 exit, 23. 86 field, 271-272 ilación de nombres, 432 ftok, 344 get, fam ilia de, 6364, 67-68, 212,

223. 245-246,343344 hline. 238 horch. 238 inset, 393 init, 226-228. 250. 265 insch, 232 k Jl. 88-89.101-102 tibefence. 438 line, 239 mk, familia do, 165, 323. 332-333 mousemask, 258259. 261 magbuf, 360-361. mv, 231-232 convención do nom­ bres. ncurses. 225-226 n c w jte m y new . m e­ nú. 265-266 newterm , uiicializa* ción de ncurses. 226-230 noecho, 242-244 opendir, 167 pause, intercepción de señales. 105106 peloso y popen. 329331 po.st_menu, 266 pseudo, 225 put, 208 readdir, 168 retresh, 223 rradir. 165 sa_*. 110 scanw, 245-246 sem. 343,368-369, 371-374 set_m enu_fonnat. 265

indico

seaockopt, 394-395 shm gct. 343.346347 shruid, 348 sig. 109-110, 114 socket, 382-383 start_color. 250 sysconf. 71 system , 69-72,77 traoes. 429 unpost.m enu, 266 utim e. 156 vwscanw, 245 waddch, 231. 242 wait. 84-66 wech ochar. 231 w fndoM , 261 wgotch. 242 win, 238-239 wiaach. 232 Ver tambUn llam a­ das fu n c io n e s, lla m a d a s o. 126. 193-194 G g a n a n c ia . 281 g a tilla d o . 294 gcc. Ver GNU cc g d b . Ver G n u D eBugg e r (gdb) g e n e ra c ió n d e a d ­ v e rte n c ia s con GNU cc (gcc), 1718 g e t, fa m ilia de fu n ­ cio n e s. 63-64, 6768, 73-76, 223, 242, 245-246 g et. fa m ilia d e lla m a ­ d a s a s iste m a . 122123 g et. fu n c ió n , 212, 343-344

GET. v a lo re s . 371-372 GETALL. v a lo r d el c o m a n d o Cffld d e la fu n c ió n se R ic tl, 370 G tD s (LDs d e g ru p o ), 64-66 GNU cc (gcc), 7-30 com parado con eges. 29-30 compilación de pro­ gram as. 7*21 extensinne* de C. 22-24 ejemplos de. 24-28 opciones y a rgu­ mentos. 14-22 con m últiples arch i­ vos de código fuente. 12-14 G nu D cB uggor (gdb), 426-435 GNU. h e r r a m i e n ta m ak e, 33-53, 432 beneficios de su uso. 34 invocación. 37-40 rr.akeüies. creación de. 35-36 manejo de errores. 52-53 reglas, creación de. 40-52 g ra b a c ió n d e s o n i­ dos, 287-288 g rá fic o s añadir form atos grá­ ficos x aplicacio­ nes, 313 caracteres. 232 form atos de archivo, 503 g ru p o s , p ro c e s a ­ m ie n to d e, 76-77

527

GU Is (in te rf a c e s g r á ­ fic a s d e u s u a rio ), to o llrits. 504-505 gzip, u tilid a d , d i s t r i ­ b u c ió n d e so ftw a ­ re , 446-449 H

h a b ilita r d e p u ra c ió n ncurses. 221 acciones de ratón, 258 h a n d le , v a ria b le p u n te r o , 312 h a n d le r s d o se ñ a l, 106-114 h as_color:\, lla m a d a , •>:,o h e lp . c o m a n d o , 429 h e r r a m ie n ta m ak e. Ver h e r r a m ie n ta m a k e d e GNU h e rr a m ie n ta s añada- formatos g rá ­ fico» a, 313 base de datos de CD musicales, código fuente para, 464495 bases de datos, re­ cursos para. 512 bastidores, recursos para, 511 científicas y m ate­ máticos, recursos para, 512 compilación de. 7-30, 426-427 contraseñas ocultas,

66

corriendo en Gnu DeBugger (gdb), 428-429 creación de bibiiute-

, 52S

f J } ) ) ) Programación en Unux

)

}

cas p ara, 300-30-3 áaemon3, creación áe, 191-200 depuración de, 426435. 438-443 distribución de, *45453.504,512 extensión de presta­ ciones de, 313 gzip. 51 Ipedated, 198-200 raake de GNU. 33-53 beneficios de. 34 invocación de, 3740 malte fitas, crea­ ción de. 35*36 manejo de errores d i, 52-53 reglas para crea­ ción de makefiles. 40-52 recnmpilación des­ pués do oxUínaión do prestaciones, 313 sctgid y setuid. 6667 Ver también recurso» HIVAL, v a lo r s u p e ­ rio r d e ra n g o en se n te n c ia c a se ran g o s, 24 h lin e y h o rc h , fu n ­ cio n e s, 238 h o s tn a m e s en D N S (D o m a in Ñ a m e S y ste m ). 402-405 h u é rfa n o , p ro c eso , 84

I id. c o m a n d o , 66 id e m , c a d e n a , 196

}

)

J

t

f

id e n t, c o m a n d o , 417418 id e n tific a c ió n d e v a ­ ria b le s , 434 id e n tif ic a d o re s de p ro y e c to , 344 id e n tific a d o re s , 343 do cola de mensajes, 356 de procesos, 62-63 de proyecto, 344 •Id irn a m e , o p ció n . 14-15 TDs d e g ru p o (GEDs), 64-66 tD s d e u s u a r io
)

)

)

>

t

19. 29-30, 139, 214 Lnct, fa m ilia d e fu n ­ c io n e s, 393 in fo b re a k p o in ts , co­ m a n d o , 432 in fo rm a c ió n s o b re tiem p o s, en p ro c e ­ sos. 69*72 in fo rm a r a c c io n e s d e r a tó n , 258 in g re so d e c a d e n a s , n c u rs e s , 245*246 in ic ia liz a c ió n de argum entos clave y valor. 208 de conjuntos do pa­ ros do coloros, 250 de ncurse3. 226-228 in icio du p ro g r a m a s en G nu D eB ugger
índice

insxaiación/desinst3-

c h iv o . G NU cc. 9-

la c ió n , s c r ip t, s e c ­ c ió n d e (RPM ), 456 in te rc e p c ió n de acciones de ratón. 259-261 de señales. 102-114 in te rfa c e s g rá fic a s d e u s u a r io (G U Is), to o lk its. 504*505 in te rfa c e s p a r a pro¡Tramas d e a p lic a ­ ció n (A PIs) adm inistración de señales. 106 prcgram srión de jonido. 277-294 socket Berkeley. 3780-352 in te rfa c e s de manejo de archi­ vos. 138-154 de MIDI i Musical In sin u n en t Digi­ tal Interface). 278 de programación de aplicaciones <API) adm inistración de a ñ a les, 106 programación de tonidox, 277294 de ratón. 258 de sonido, program a­ ción de, 277-294 di, 313-316 gráficas de usuario (GUI), toolkits, 504-305 I n te r n e t, re c u r s o s p a r a p ro g ra m a d o re s , 502-512 in t e r p r e ta c io n e s de e x te n s io n e s d e a r ­

10

I n te rro g a c ió n a d is ­ p o s itiv o s m e z c la ­ d o r e s d e so n id o p o r c a n a le s d is p o ­ n ib le s . 281-284 in v o c a c ió n de la h erram ienta m akc de GNU, 37-40 de 1a utilidad tar. 446-448 del comando install. 450-453 io ctl. lla m a d a , 279280. 283 [PC (c o m u n ic a c ió n in te rp ro c o so » ) descripcióo. 321 m em oria compartida (SHM). 341-374 IP C S y ste m V. 342374 IPC , o b je to s, 342 IP C . v a lo r e s . 371-372 IP C . Ví?r c o m u n ic a ­ c ió n in te rp ro c e s o s

J J o n e s , B ra d . 139 ju e g o s , p ro g ra m a s de garillado, 294 recursos p ara pro­ gram adores. 504

K K e rn e l, m o d o , 120 K e rn ig h a n , B ria n . 139 k e y (cla ve), a r g u ­ m e n to d e fu n c io ­ n e s d e b aso d e d a ­

529

to s, in ic ia liz a c ió n , 208 k ey (clave), a r g u ­ m e n to d e fu n c ió n m sg g e t, 357 K h a ttr a , T aj, 441 kill, c o m a n d o , e n v ío d e s e ñ a le s , 99-100 kill, fu n c ió n . 88-89, 101-102

k illin jí (e lim in a ­ ción)i, p ro c e s o s de, 86-8»

L, o p c ió n . 421 la n z a m ie n to d e p ro ­ g ra m a s e n g d b (G nu d e b u g g u r). 428-429 la te n c ia d e d a to s . 19 lazo d e e s p e ra . 345 la zo s w h ile , p e lig ro s d e , 26 lazo s desenrollar, 19 tipo ag u ard ar acce­ so, 345 while, peligros de, 26 Id.so, id e n tific a c ió n d el n ú m e r o d e v e rs ió n d e l lin k e r, 302-303. 310 Idd, c o m a n d o , 302 LDFLAGS, v a ria b le p re d e f in id a , 47 le e r de archivos. 141-143 de F I f Os. 335-338 de pipes, 324-330 de .sockets de entor­ no UNIX, 390-392 de sockets de Pruto-

irc ce

-

. ¿i

' : - '

IC ? I • • / ' V t . . i V

-l

<■( i m

.11•- •I•

**• s***i

¡ líTi'.nl il'

• - i- '

.

M 'l'i

I n r . i . l i • ;i • ••>


• .1 ;;

"i ** • . ti* .«ir i - ■' ! ¡ -í

'V (

i . ..

' ' " ' 'UI.' -i-i ' " *• '

:•••*' tlllilllL .

.M U l.,1

,i. i i ;;; . r . i | •' " ii... ,

I >' •

l . )• ali . r - ; «■ •i t

l*Vn . J 'T i- rn 1 '

»•!'*•.• ’ ¡•lili

• '

-

„•

.-

■ :

;■>

. ,i }



ir. •. :fr«•» SMni/ ,1» 'M.t | .•

¿r.i.'.i -

i i. • -

rir i.^ -r tu n il* >

;t|. i.

ÍV»| l'U-*)» 1 M. - •'

: .is_.i l n m r i , 'i. rv_\ '• Ji — ; i t :»

tr '

•TTK/ |.1*.| ,H' I ¡|

11'

l i l i í u i . 1 1 ,i>* in' l i ft*:• ii. ■ 'i M - m .■•» --i • ••■•*■ , 1' t t r»- -m tu 1 1 ....¡; .. . t/ Vil .t : • ‘" I ..I 1 | l I »!••

iir-íi:u-•*’ nr* 1

*• '

-I • 1 i •

11r

trv í -

i

-i

«.

i*. l"-i *». |iii"...it: I

I! r . '



II '



• ~

ib

L;.;-'" > i ii I I >1 ti - -1=? • •• ' • fllíl *1 I IV • At-JV i-t .?* » •I

O l'.

i*[.



r ’ C t . |’ I .

,

532

)

)

)

)

)

)

)

)

^

1

)

>

)

> y > >

Programación en Linux

m odo c ru d o (ra w ), 243 m odo u s u a r io , J20 m odo, p a r á m e tr o de la lla m a d a o p e n . 139 modos ennode, 243*244 erado o sin procesar
D ig ital In te rfa c e (M IDI), 278 mv, fa m ilia d e fu n ­ c io n e s, 231-232 N

n a v e g a c ió n d e b a se s de d a to s B erkeley, 213-215 n c u rs e s , 220-274 d e n e g a c ió n d e s e r v i­ cio . a ta q u e d e, 177 N e tsc a p e , lin k e o de b ib lio te c a s e s t á t i ­ cas, 16 N etuinrh P rotfram triing series, (lib ro ) 385 n ew _field y now_forin, lla m a d a s , 271 n e w j t c m , fu n c ió n , 265 n e w .m e n u , fu n c ió n . 266 n e w m a sk , lla m a d a , 137 n e w te rm , fu n c ió n , in ic ía li/.a c ió n de n c u rs e s , 226-230 n e w w in , llu in u d a, 253-257 nm , c o m a n d o , 300301 No ru le to m a k e tur* g e t (m e n sa je de e r r o r d e ‘ta r g e t’). 52 n o -b lo q u e a n te , lla ­ m a d a d e E/S, 170 n o -d u m p , a tr ib u to , 160 n o ech o , fu n c ió n , 242244

N OM BRE .DESVA­ RIADLE. v a ria b le d e fin id a p o r u s u a ­ rio , 42 n o m b re s de bibliotecas com­ p artidas. 310 de función, fijar. 432 de hosts. en Domain 1V ane System CDNS), 402-405 de señales. 94 n o m b re s, c o n v e n c io ­ n e s so b re bibliotecas. 15 funcione3 de ncur­ ses. 225-226 n o n -se e k a b le , tip o de a rc h iv o , 126, 321 n o r e tu m , a tr ib u to . gee, 23*26 n o ta c ió n d e c im a l c o n p u n to d e d i­ re c c io n e s d e re d , 393 n u e v a s v e n ta n a s , c re a c ió n d e, 253257 n u il, se ñ a l. 100 n u m e ro s e c u e n c ia ! de u so de r a n u r a . 343 n ú m e ro s de linea, establecer, 432 de redos. alm acena­ miento, 392 de revisión de archi­ vos. 410 de señal, 94 secuencia! de uso de ran u ra. 343

o O . f a m il ia d e i n d i c a ­ d o r e s < fla g * ), 139 O , f a m ilia d e o p c i o ­ n e s p a r a f o r m u la ­ r i o s . 2 7 1 -2 7 2 o b je to s c a r g a d o s d i­ n á m i c a m e n t e , 312316 o b je to s

cargados dinám ica­ m ente. 312-318 IPC. 342 o b t e n c i ó n d e la c o n ­ d ic ió n d e s a lid a d e l p r o c e s o b ij o , 84 o p c io n e s d e lin e a d e com andos

comando install. 449 GNU cc tgee), 14-22 herram ienta m ako de GNU. 37 utilidad U r. 446-148 o p c io n e s

-ansí. 14. 17-18 <, 11. 14 -d <nombrc_dirpctono>. 428 -d. 37. 52 de comando ar. 301 de comando build, 480 de comando install, 450 ce comando Idconñg. 302-303 de comando Idd, 302 de coman do nm, 300 de función ñald, 271>72 de GNU cc (gee), 14-

22 de herram ien ta make de GNU, 37

de utilidad tar. 446 —deiete. 449 -Dt*oo=bar. 14 -E, 10 -fS ¡e. 37 -f, 414-415 -filag, 19 ^ .2 1 -ggdb. 14, 21 -Help. 30 -i. 37 -I<nombre_directorio>, 14-15 -jN. 37 -k. 3 7 .5 3 -1.414. 421 -L<nombre_direc to­ n e » , 14-15 -leuraes, para compi­ lación con ncursea.220 -Ifoo, 14 MM. 15 •n. 37-39 -o file, 14 -O. 14. 19-20. 23, 29 -On. 14 •pedantic, 14, 17-18

-q. 42S -r. 37, 414-416,418421 -s. 37, 40-42 -static, 14-15 •traditional, 14 -u, 413. 420 -v, 15 -W. 14. 37-39 -Wall. 14, 17 -«■error, 15 -Wñle. 37 -Wno-def. 29 -W-:gn-compare. 29 -Wundeí. 29 -x.12

o p e n . lla m a d a , 1 23, 1 3 9 ,1 4 1 o p e n d ir , f u n c i ó n , 167 o p e n lo g , lla m a d a , 196 o p t im i z a c i ó n , c ó d i ­ g o , G N U cc (g e e ), 19-20 o p tim iz a c io n e s d e c ó d ig o p o r o m i­ s ió n d e h i l o s d e p r o g r a m a , 19 o p t io n , a r g u m e n t o d o l la m a d a o p e n lo g , v a lo r e s , 196 o r d e n d e b y te s, 392 P p n ck o d , a tr ib u to , 23. 2 6 -2 8 p a d r e , p r o c o s o , 84 p a la b r a s r e s e r v a d a s , 2 3 -2 6 , 4 1 4 -4 1 6 p a n ta lla »

do «curses. 223 trazado de líneas de color en, 251-253 p a q u e te s , c o n m u ta ­ c i ó n d e . 3 7 8 -3 7 9 p a r á m e tr o p ro te o tio n d e la f u n c i ó n tn m u p , 176 p a r á m e tr o s

db, 206 llags, parám etro de la, función mmap, 176 modo, parám etro de la función open, 139 para configuración de dispositivos de sonido, 288-293 pid. parám etro de la

>

534

1

i

)

J

)

)

)

)

l

)

I

i

Program ación e n Linux

función kill. 88 protection, parúmeEro de la función mtnap, 176 sig. parám etro de la ftinción kill. 38 tuneout. parám etro de la función select, 170 p a re s clav e /v alo r, 204 p a ro s clave/valor. 204 de inicial ización de pares de colores, 250 P a rk e r , T i m. 137 p a u se , fu n c ió n , in ­ te rc e p c ió n de *eñalos, 105-10*5 p elóse, fu n c ió n , 329, 331 P e re n s , B ru ce , 438 p e rm a n e c e r a la es­ c u c h a d e c o n e x io ­ n es. so c k e ts, 383387 p e rm iso s d e acc e so , 151-153 p e rro r, fu n c ió n , 126128 P erry , G rcg , 139 p e rs o n a liz a c ió n d e E le c tric F e n c e. 438-139 PLD
p ip o s c o n n o m b re , e q u iv a le n c ia con a rc h iv o s, 331 p ip e s sin n o m b re , 132-133, 322-323 p ip e s, 132-133, 321331 po li, lla m a d a , 123 p o p e n , fu n c ió n , 328, 331 p o p s d e s d e la p ila , re ta rd o y acu m u ­ la c ió n , 19 p u n te r o s d o a rc h iv o , p o sic io n a m ie n to , 143-145 POSIX, b lo q u e o s, 185, 3$4 POSIX, IPC , 342, 356 p o st_ fo rm , lla m a d a , 271 p o ü t.m e n u , lla m a d a , 266 P P ID . Ver ÍD d e p ro ­ c eso p a d re p re p a r a c ió n , secció n (RPM ), 456-457 P rim e ro q u e E n tra , P rim e ro q u e Sale. Ver F rF O s p rio rity , a rg u m e n to d el a d m in is tr a d o r d e in g re s o a l s is te ­ m a, 197 p ro c e s o h ijo , 62 p ro c e s o h ijo , o b te n ­ c ió n de la c o n d i­ c ió n d e s a lid a del, 84 p ro c e s o p a d re , ID (P P ID ), 62-64 p ro ce so , ID del (PED), 62-64 p ro c e so s

adm inistración de llam adas de. 122123 atributos. 62-77 cliente. 381 como xombie, 84 creación. 77-83 oliminación. 86-89 manipulación. 77-90 servidor. 381 p ro g n a m e : C o m ­ m a n d n o t founri, m e n sa je d e e rr o r. 53 p ro g ra m a c ió n a v a n ­ z a d a en el e n to r n o UNIX, 30-1 p ro g ra m a c ió n de C o n tro l d e P ro to ­ colo d e T ra n s m i­ sió n P ro to c o lo de In te r n e t (T C P /IP ), 392-405 p ro g ra m a c ió n de Protocolo de Con­ trol Transm isión/ Protocolo de in ­ ternet (TCP/IP), 392405 de u u je ta s de soni­ do. 277-294 p ro g ra m a d o re s , r e ­ c u rs o s p a ra , 502512 p ro g ra m a s añadido de formatos gráficos a, 313 bastidores, recursos p ara. 509 compilación de, 7-30, 428-429 corrida en Gnu DeBugeer (gdb), 428429

¡ndlc©

creación de bibliote­ cas para. 301-304 daem ons. creación de. 191-200 de base de datos para CD musical, código ftiente para. 46449-5 de base? de dates, re­ curras p ara. 512 de c o n lrü e ñ a í. 66 depuración. 426-435. 438-443 distribución. 445453. 504.510 extensión de las pres­ taciones de. 313 gr.p. 51 Ipednted. 193-200 make de GNU. 33-53 recompilación tras realizar una exten­ sión. 313 recursos científicos y m atem áticos para. 512 setgid y seuud. 66-67 p ro lija d o , secció n (RPM ), 456-460 p r o lija r ta r g e t, 40 p ro p ie d a d d e a r c h i­ vos. 153-154 p ro te c c io n e s d e m a ­ p a s e n m em o ria, m o d ific a c ió n de. 179 p ro to c o lo s c o n fia ­ bles, 380-381 p ro to c o lo s d e d a to s basados en paque­ tes, 380 p ro to c o lo s d e se ­ c u e n c ia d e d a to s, 380

p ro to c o lo s o r i e n ta ­ d o s a c o n e x ió n . 379 p ro to c o lo s s in c o n e ­ x ió n . 379 p ro to c o lo s de redes. 379-330 Protocolo de T rans­ m isión/ Protocolo de In te rn et (TCP/IP), 392-405 p rp id s. 43-49 p s e u d o -c a ra c to re s , 231 p se u d o -fu n c io n e s , 225 p u e rto * descripción. 396 para M usical Instrum ent D igital Interface (MIDI), 273 p u n te r o s cursor y stdacr. 223 de posición en archi­ vo». 143-145 p u n to n d u d e te n c ió n c o n d ic io n a l. 432 p u n to s d e i n t e r r u p ­ ció n . e s ta b le c i­ m ie n to c o n G n u D e B u g g e r (gdb), 432-433 p u t, fu n c ió n . 208 R

r. o p ció n d e lín e a d e c o m a n d o s, 446 ra s tre o d e u n a fu n ­ ció n . 429 ra tó n , in te r f a z d e, n c u rs e s , 257-264 R a y m o n d . E ric . 56 res, c o m a n d o . 422423

535

RCS. V er R ev isió n C o n tro l S y stem rc s c le a n . c o m a n d o . 420-421 re sd iff. c o m a n d o . 418-420 rc a d . lla m a d a . 123 rc a d , lla m a d a . 325 re a d d ir, fu n c ió n . 168 re c o m p ila c ió n d e a p lic a c io n e s d e s ­ p u é s do s e r e x te n ­ d id a s. 313 re c u p e ra c ió n d e c o ­ m a n d o s p rev io s. 432 re c u p e ra c ió n d o ole* m e n to s do sd o b a ­ se s d e d a to s B erkoley, 212-213 re c u rso s para programadores de Linux. 502-512 utilización de, proce­ sos. 72 R ed H a t p a c k a g e M a­ n a g e r (RPM), 453-

160 re d e s p o r c o n m u ta ­ ción do c irc u ito s , 378 re d e s almacenamiento de direcciones. Protocolo de Con­ trol de Transm i­ tió /i/ Protocolo de Internet (TCP tlP ), 393 almacenamiento de números de nodo. Protocolo de Con­ trol de Transmi­ sión/ Protocolo

, I ¡ ) ) .g r a...aC.V.J eti dnux

)

}

de internet (TCP/IP). 392 conexiones, 394 conmutadas por cir­ cuitos, 378 conmutadas por pa­ quetes. 377-379 protocolos, 378-379 recursos de progra­ mación, 504 re d im e n s io n a r a r ­ ch iv o s m a p e a d o s en m e m o ria , 180 refreg h , fu n ció n , n c u rs e s, 223 re g is tro d e b a n d le r s d e señ al. 109-111 re g is tro s c o rr ie n te s , elim in a c ió n d e sd e b aso s d e d a to s, 215 re g la s e x p líc ita s, m akofiles, 1 8 re g la s im p líc ita s. m a k c files, 48-49 re g la s p a tr ó n , m ak efiles. 49-50 re g la s, 35.40-52 re p a r a c ió n d e p ro ­ b lem a s Itroublenh o o tin u ) bugs. con GN'U cc tgcc), 21-22 problemas de memo­ ria, 435-443 Ver también d ep u rar re p o s ito rio s , 411 re p ro d u c c ió n d e so ­ n id o , p ro g r a m a ­ c ió n d e . 287-294 re s e ñ a s , d ese m p e ñ o , 29 re u tiliz a c ió n d e c ó ­ digo . 299

)

)

)

1

)

)

R e v isió n C o n tro l S y ste m {RCS), se ­ g u im ie n to d e m o ­ d ific a c io n e s a l c ó ­ d ig o fu e n te , 409-123 re v is io n e s de archivo?, 410 exhibir diferencias entre archivos de trabajo, 418-420 R itc h ie . D e n n is, 139 rlo g , c o m a n d o , 420421 RM, v a ria b le , 47 rm d ir, fu n c ió n . 105 RPM (R ed H a t Packago M a n a g er), 453-460 ru , fa m ilia do m ie m ­ b ro s do la e s tr u c ­ tu r a s d«* p a tr ó n ru s a g e , 73 R u b in i, A le ssa n d ro , 258 ru n , c o m a n d o , 428 ru s a g e , p iitró n d e e s­ tr u c tu r a , 72-73 r u t a d u ac c e so , p ip e s sin n o m b re y con n o m b re , 322 r u tin a s c h d ir y fehd ir, 163 r u tin a s d e e n tr a d a d e d a to s , n c u rs e s, 242-246 S sa, fa m ilia d e e le ­ m e n to s d e e s tr u c ­ tu r a s d e p a tr ó n sig a c tio n , 110 s a lid a d e c a d e n a s , n c u rs e s , 234-237

'I

>

)

}

s a lid a m is c e lá n e a de d a to s , n c u r s e s , 237-240 s a lid a , r u t i n a s d e , n c u rs e s , 230-240 s a lid a . Ver e n tr a d a /s a lid a s a lir de archivos, 139. 141 de bases de datos, 205-207. 215 de descriptores de archivo, 194 de FIFOs, 335 áe Gnu DuBugger, 428 de pipe». 324-325 S a m s T each Y o u m c lf C in 21 Dtiyx, q u in ta e d ic ió n (li­ b ro ), 139 S am s T each Y o u m e lf L in u x in 24 h o u rx (lib ro ), 137 S a v o lu in e n , H a n n u , 279 sb rk , lla m a d a . 123 scanvv, fu n c ió n , 245246 SCCS (S o u rc e C o d e C o n tro l S y ste m ), p ro g ra m a p a r a c o n tr o l d e v e rs io ­ n e s d e c ó d ig o fu e n te , 409 se cc io n e s, a rc h iv o s d e e sp e c ific a c ió n , RPM . 456-459 s e c u e n c ia m ie n to , 379 SEEK , c o n s ta n te s , 143 se g m e n to s d e m e m o ­ r ia c o m p a rtid a , 346

Índice

se g u im ie n to d e c a m ­ b io s e n el c ó d ig o fu e n te . R ev isió n C o n tro l S y stem •RCS), 409-423 se g u ir el v in cu lo . 134 s e g u rid a d , re c u r s o s p a r a p ro g r a m a d o ­ re s , 504 s e le c c io n a r handlers de señal. 106-114 ventanas. ncurses. 233-239 se lcct. U am ada, 123, 170,345 som , fa m ilia d e fu n ­ cio n e s, 343. 368374 se m á fo ro s b in a rio s . 368 sem á fo ro s, IP C S ys­ te m V, 368-374 *emi d ú p le x . 322 sem i-d u p le x , ta r je ta s d e ftonido descripción, 294 grabación de so n id o en. 237 se n te n c ia s case, sw itc h , 24 se ñ a le s b lo q u e a d a s , 94 se ñ a le s c o n fia b le s , 95 se ñ a le s e n tr e g a d a s , 94 se ñ ale* g e n e ra d a s , 94 se ñ a le s n o b lo q u e a ­ d a s , 94 se ñ a le s n o c o n fia ­ b le s descripción, 95

desenrollar, lazo, 19 s e ñ a le s p e n d ie n te s . 94, 114-116 se ñ a le s , 93-116 duración de, 238 llam adas a sistem a, 123-124 s e r v id o re s conexión a sockets. 383-388 denegación de servi­ cios, 177 llam adas a sistem a, 121 syslog. llam ada, 196 sesiones como g ru ­ pos de procesos, 76-77

creación de. 193 s e t.f ie ld .b u f f e r , lla ­ m a d o , 271 s e t_ fic ld _ u se rp tr, lla ­ m a d a . 272 * ct_ m o n u _ fo rm a t. lla m a d a . 266 SETA LL, v a lo r del p a r á m e tr o , som id d e la fu n c ió n sem c tl, 372 sc tg id , p ro g r a m a s , 66-67 se tsid , lla m a d a , 192196 s e ts o c k o p t, fu n c ió n . 394-395 s e tu id . p ro g r a m a s , 66-67 SETVAL, v a lo r d e l p a r á m e tr o c m d de la fu n c ió n se m c tl, 371 sh m . fa m ilia d e fu n ­ c io n e s , 343, 347348

537

sig , fa m ilia d e lla m a ­ d a s, 109-110,114. 123-124 sig, p a rá m e tr o d e la fu n c ió n k ill, 88 SIG, so ñ a le s, 97-99 s in c ro n iz a c ió n d e b a s e s d o d a to s B erk eley , 215-217 sin ta x is SIdS. palabra re se r­ vada. 415 ar, comando. 301 attron y attroff. lla­ m a d a s 251 c, fam ilia de llam a­ das y funciones. 214-215 casi* ran g w . exten­ sión de sentencia caso, 23 cloje. función. 206 conoxiones a sockets. 383 cursor, llam ada. 213 db opon, función, 206 definición de v aria­ bles, 42 del, función, 210 di. fam ilia de funcio­ nes, 312-313 establecimiento de puntos de d eten ­ ción, nombres de funciones y núm e­ ros de línea, 432* 433 exec, función, 80 exit, función, 86 fork, llam ada, 78 get, función, 212 has_colors. llam ada, 250

Programación en Linux

identificación de va­ riables. 434 Í£it_pair, función, 250 mstafl. comando. 450 ¡nvocación de GNU « tgcc), 8 ioctl. llamada. 279 tóü, función, 38 !d, lomiiia de coman­ dos. 302 roakefiles, reglas, :i.‘5 tukfilu, comando y función. 332-333 tr'3^. fam ilia do fun­ ciones. 357-358, 363-365 nm. comando. 300 n o m b r e _d e _v a RÍAS LE, variable d efinida por u su a ­ rio, 42 PJP0. llam ada, 325 popen y pelóse, fu n ­ ciones. 329 P u t. función. 208 resciean, com ando.

420 sem , fam ilia de fu n ­ ciones, 368-371 sbrnnt, llam ada, 348 shrnget, ñmción, 347 Socket, fundón. 381 3ian_color, función, 250 sw itch, sentencias de, 24 -ync. llam ada, 215 sy siem , función, 77 v ariab le de expan­ sión ¿imple, 44, •389 '•'ariables expandi­

das recursivam ento.43 wencloae, función, 261 s ín te s is d e fu n c io n a ­ lid a d . 57 rin te tiz a d o r e s d e t a ­ b la d e o n d a s , 278 sis te m a s o p e ra tiv o s , re c u r s o s p a r a d e ­ sa rro llo d e , 504 S N D C T L _D S P _G E T '• CA PS, c o m a n d o , b its in fo rm a d o s p or. 294 s in te tiz o d o re s d e s o ­ n id o . 278 rtockaddr, p a tr ó n de e s tr u c tu r a , 385 so ck et, fu n c ió n , 381383 so ck eta, 381-401 s o ftw a re añadido de formatos gráficos a, 313 baso du datos de C’D musicales, código fuente para, 464495 bases de datna, re­ cursos para, 512 bastidores, recursos para, 509 científico y m a tem á ­ tico, recursos p a ­ ra, 512 compilación, 7-30, 426-427 corriendo en G nu D eBugger (gdb), 428-429 creación de bibliote­ cas para. 300-303 daem ons. creación

de. 191-200 depuración, 426-435. 138-443 distribución. 445453,504. 510 extensión de p resta­ ciones de, 313 gzip. 51 Ipeáated. 198-200 make de GNU. 33-53 para contraseños. 66 recompilarión luego de extender las prestaciones. 313 setgid y aetuid, 6667 s o lic itu d e s

de conexión, acepta­ ción. 382-387 de operación de des­ plazam iento. es­ pecificando v enta­ na. 239 so n a m e , 310 SO IJN D JVUXF-R, fa ­ m ilia d e rn a cro s. 280-281 S p e c ia l E d itio n U sin g L in u x (li­ b ro ) 137 S R C D IR , v a r ia b le rc o u r s iv a d e e je m ­ p lo . 43 .st_blksize, m ie m b ro d e e s tru c tu r a de p a tr ó n s ta t, 148 s ta c k s (p ila s). 362 s t a r t , a r g u m e n to d e fu n c ió n m u n m a p . 177 s ta rc .c o lo r. fu n c ió n , 250 s t a t, c o m a n d o . 147151

Indice

s ta t, lla m a d a . 123 s ta ru s. p a r á m e tr o de fu n c io n e s w a it y w a itp id . 84 s td sc r. p u n te r o a e s ­ tru c tu ra de po­ tró n WTNDOW, 223 sto p , c o m a n d o . 434 Stev-ens, R ic h a rd . 302.384 s u b v e n ta n a s . c r e a ­ ció n d e , 253-255 SubW in. lla m a d a . 253-255 s u p re s ió n de m ap eo s de a rc h iv o s. 177178 s u p r im ir archivos de trabajo, «vitar d u ran te su ingreso a directon o RCS, 413 archivo* an tarballs. 449 colas de mensajes. 364 cursores, 215 directorios, 165-167 elementos de bases de datos Berkeley, 210-211

registros com entó# desde bases de da­ tos, 215 semáforos, 371-374 sw itc h . s e n te n c ia , 24 sync, a tr ib u to . 160 sy n c . lla m a d a , 215 sy n lin k . lla m a d a . * 123 syseo n f. fu n c ió n . 71 syslog, se rv ic io p r o ­ v isto p o r el daem on sy slo g d . 196

sy stem . fu n c ió n . 697 2 ,7 7 T

T. o p ció n d e lin c a de c o m a n d o s . 446 ta b la s d e sím b o lo s. 426 ta b la s d e sím b o lo s, c o m p ila c ió n co n apoyo de d e p u ra ­ d or, 426 T a c k v tt. J a c k , 137 ta m a ñ o d e v e n ta n a s , n c u rs e s , 223 T ape A rc h iv a r (ta ri, 446-149 ta r, u tilid a d p a r a d is tr ib u c ió n de s o ftw a re . 446-449 ta r b a lls c o m p r im i­ d a s co n irrip , 448 ta rb a lls . 446-149. Ver ta m b ié n a rc h iv o s ta r g e t ‘t a r u e t ’ n o t re m a d e b e c a u s e of e rr o rs , m e n s a je de e rr o r. 53 ta r g e t p r e d e t e r m i­ n a d o . m a k e file s, 36 ta rg e ta fic tic io s, mak efiles, 40-41 ta r g e ts , e n m ak efiles, 35-36, 40-41, 51-52 ta r je ta s d e so n id o , p ro g ra m a c ió n , 277-294. Ver ta m ­ bién m u ltim e d ia TCP/EP i P ro to c o lo de C o n tro l de T ra n sm isió n / P r o ­ tocolo d e I n t e r ­

539

n e t), 392-405 te r m in a r ccurses. 228-230 procesos. 86-89 tie m p o d e C P U d e u s u a rio . 69 tiem p o d e C PU d el s iste m a , 69 tiem p o n o rm n ], 69 tim e o u t, p a rá m e tr o d e la lla m a d a scle c t, 170 tim es, fu n c ió n . 69, 71-72 tim e s ta m p s (m a rc a s do fech a y h o ra ) m o d ifica c ió n e n a rc h iv o s, 158-160 to o lk its par:» in t e r f a ­ ces g rá fic a s d e u s u a rio (G UIs), 504-505 TO PD IR , v a ria b le re c u rs iv a d e e je m ­ plo, 43 tra n sm isió n d e s e ñ a ­ les, 99-102 tra n s m is io n e s b a s a ­ d a s e n b y tes, 379 T ra n te r, Je ff, 287 trazar lineas de color, en pancaUas, 251-253 especificar ventanas para, ncurses, 238 tro u b le s h o o tin g (r e ­ p a ra c ió n d e p r o ­ b lem as) bugs, con GNU cc (gee), 21-22 problemas de memo­ ria, 435-443 Ver cambien d ep u rar tr u n c a d o d e a rc h i-

540

1 ) 1 ) 1 Programación en Unux

>

)

vos, 145-147 tr ú n c a te , lla m a d a . 123 ty p e. a rg u m e n to d e la fu n c ió n m sgrcv, 363 U

u, o p ció n d e lín e a de co m a n d o s, 448 UID s (ID s d e u s u a ­ rio), 64-66 uiim ic. lla m a d a , 123 u m ask , lla m a d a , 137138. 193-194 u m a sk s. 332. 359 d e s in s ta la r. ta r g e t. m ak e fíle s, 51-32 UNIX BSD. 95 UNIX recursos de progra­ mación. 50<1 sockcts de entorno de. 385-392 u n lin k . lla m a d a . 123 u n p o s t .m e n ú , fu n ­ ció n , 266 U sen e t, re c u r s o s p a ­ r a p ro g ra m a d o re s , 503 uKtat, lla m a d a , 123 u tilid a d e s gzip. 51 make de GNU, 33 beneficios do, 34 creación de makefiles, 35*36 creación de regias, 40-52 ¿avocación de. 37-40 manejo de errores. 52*53 p ara creación de bi­ bliotecas, 299*302

)

)

)

)

)

>

p a ra depuración Electric Fence. 438-440 G nu DeBugger (gdb). 426-435 mcheck. 442-443 mpr. 441-442 para distribución de software, 446-449 u tim b u f, p a tr ó n de e s tr u c tu r a , p a r á ­ m e tro d o fu n c ió n u tin io 158 u tim o , fu n c ió n . 158 V

v , o p c ió n d e lin e a de c o m a n d o s , 446 v alo re s do AFMT. fam ilia dé macros de formato de audio, 289 de cmd, argum ento do función sometí. 371-372 de error, funciones de socket.. 381-382 de facility y priority. argum entos de adm inistrador do ingreso al siste­ m a, 197 de llags y protcction parám etros de función mmap, 176 de funciones w ait y w aitpid, 84 de handie, argum en­ to do la función dlclose, 315 do indicador, argu­ mento de la fun­ ción dlopen, 314

J

)

)

?

)

de option. argum en­ to de llam ada openlog, 196 de variables, exhibi­ ción y modifica­ ción. 432-433 v a lu é , a rg u m e n to de fu n ció n p u t d e b a ­ se d e d a to s , in ic ia liz a c ió n , 208 v a ria b le s a u to m á ti­ c a s, m a k e fíle s, 4547 v a ria b le s d e e x p a n ­ sió n sim p le, m nkefíleSt 43-45 v a ria b le s d e fin id a s p o r u s u a rio , m ak efile s, 42 v a ria b le s e x p a n d i­ d a s re c u rsiv a x n e n tc , m a k efíle s, 4345 v a ria b le s g lo b ale s. 126 v a ria b le s p re d e f in i­ d a s en m ak e fíles, 47-48 v a ria b le s alcance y contexto. 434-435 de entorno, 45, 303 de makefíles. 41-48 fuera de alcance íno visibles), 434 globales, 126 identificación, en gdb. 434 LDFLAGS, predefi­ nida, m ake de GNU. 47 packed, atributo, 23 v e n ta n a s in d e p e n ­ d ie n te s , c re a c ió n

> 1 ín d ic e

d e . 253-257 v e n ta n a s , n c u rs e s adm inistración. 253•257 disposición. 223-22-5 especificación de lí­ neas de trazado y solicitudes de ope­ raciones de des­ plazam iento, 238* 239 v e r c h . a r g u m e n to do m a cro b o x . 238 v e r ific a c ió n d e s c r ip t , s e c c i ó n (R P M ) , 456 v e r ific a c io n e s

entrad a y salida de archivos, Rsviuon Control System > RCS). 411-412. 422-423 errores, GNU cc (gee), 17-18

v ín c u lo s sim b ó lico s. 134. Ver ta m b ié n a rc h iv o s v is u a liz a r conñguración co­ rrie n te de. mez­ clador de sonidos, 231-284 diferencias e n tre a r­ chivos de trabajo. 418-420 p alab ras reservadas de Revisión Con­ tro l System • RCS), 417-418 valorea de variables. 432 v o lú m e n e s d e m e z ­ c la d o r d e so n id o s f ija r i n t e r a c t iv a m e n t e , 2 8 5 -2 8 7

fijar. 281 v w s c a n w , f u n c ió n , 245

v e r s io n e s

bibliotecas, incompa­ tibilidad entre versiones, 310 control de. Revisión Control System (RCS). 409-423 v fo r k . lla m a d a . 80

W w a d d c b , f u n c ió n , 2 3 1 ,2 4 2 w a i t , f u n c i ó n , 8 4 -8 6 w a i t , ll a m a d a . 123 w a i t p i d , f u n c i ó n , 84-

86

) 541

w a i t p i d , lla m a d a . 123 w b k g d , lla m a d a , 239241 w b o r d e r , lla m a d a , 238 w e c h o c h a r , fu n c ió n , 231 w e n c lo s e , fu n c ió n , 261 w g e tc h , fu n c ió n . 242 w h a t is , c o m a n d o ,

431 wi n , fu n c ió n , 238239 w in s c h . f u n c i ó n , 2 3 2 W o rld W id c W eb , r e ­ c u r s o s f o r p r o jír a m m o r s , 5 0 2 -5 1 2 w r i t e , lla m a d a , 123,

325 X X W in d o w p l a t a f o r ­ m as 86,

extensiones. 22 recurso» de progra­ mación, 504 Z z , o p c ió n d e l í n e a d e c o m a n d o s , 1 46-448 / i p , u t il id a d , 4 4 8 z o m b ie . p r o c e s o . 8 4

>

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. ■ ■■

Negocios



Otros





¿

£

t *

M anagem en:

Eloctr6nica



£

1



Textos L n jw s-tB ro s

econom ía



l Q

C om putaoén

OtvUgacKin Cie^tirioa

Q

^

Q

Maricíting







Afimm^ra&On



0

Sos o u e io interesaría rsciOir información



SoSecocr^j los i e o a s

■■■ -----

_ -----------. ----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 Av. ñeq.mienlc de ics Patñcxos 1959 ( 12 6 6 ) Cap«al r^iorz. Tsl (5-1-11] 4309-6 ?0C Fax (S¿-11)4309*615-9 E-madc nta'3peafsoned.coin.ar Pearson Educatlon S.A. Casa Juana de América Av. 8 d9 Octubre :JC61 11 SCO, Montevideo. Uruguay Tflb’Fax (02)486-1617 Pcareon Educatlon Carlbbonn Monte Malí. su¡to21-8 MuÁ02 Rivera Avenuo H a » Rgy, Puerto Rico 009:8 Tol. (737) 751 -1830 r * * (787} 751-1677 E-maü: 3wicar1b®carít».rvít y

awiphprSUcaifeo.net Poarson Educación ControamCrlcrt y Panamá Barrio La Guana. Moravta 75 motma nano. Oal Ponen Ncru» col Club La Guana 3an José. Costa Rica Tai. (506) 23S 72 76 Pax (500) 280 65 69 S-matl: onvwonrj'asal racsa.coxr

Fearson Educación de Chile Av Manuel Montt 1452. Providencia Tel. (562) 269 2059 Fax '¡582) 27-1 S I 58 E-mail: ¡r.fopearSpearsonetí.Cl Pearson Educación d » Colombia Carrera G3 “ 22-55 Sania fii de Bogotá D.C.. Colombia Tol. (571).105-9300 Fax (571) <505-901 * Pearson Educación Esparta 120 Nurtez do Balboa. Madrid 28006. España T«!. (3491} 590-3432 Fax (3491) 590-34.18 Penraon Educación México Callo Cuatro No. 25 2do Pino Fracc. Industrial Aleo Blanco 53370. Naucolpan do Juáror. Estado do MÓJóoa México Tol. (52) 53670700 Fax. (52) 53870813 Pcaruon Educngno do Brasil Ruó Emilio GoaldJ 747. Lapa OSOG5-110 Sdo Paulo •SP, Brasil Tdl. (011) 861-0201 Fax (011)861*0634


More Documents from "Fausto Flores"