Académique Documents
Professionnel Documents
Culture Documents
Programación
en Linux
CON E J E M P L O S
FVíirson
Managlng Editor
Editora M a n a Fernanda Castillo
Lisa W ílson
A rm ado de in terio r y tapa P érez Villainil & Asociado*
T raducción; .Jorge Gvrin
Producción: M arcela M angareili Proyect Editor
Tooya S im p so r.s
Team Coordlnator
Edte libro no puede te r reproducido totul ni parciulm antc e n n in g u n a for
Clnay T eeters
n ía, ox por n in g ú r. medio o procedim iento, jo a reprugráñeo, fotocopia, m i
cro film ación, mimeogrtiíico o cu alq u ier otro alaterna m ecánico, fotoquinuco,
elvctronico. inform ático, m agnético, «ilectroóptlco, e tc é te ra . C a a lq u ie r re Interior De&lgn
producción i m ol perm iso pravio p o r escrito do la editorial violn derechos Karon Ryggles
reservado*, ed degal y const ituyu u n delito
Cover Ooslgn
D uar.e R ader
O 2000. PRA fiSO N EDUCATION S.A.
Av. R egim iento de P atricios 1959 (126(J), Buenos Aires.
Copy Writer
R epública A rgaa& na
Eric B o rg ert
Q ueda hecho el depósito q u e dispone la ley 11.723
Im preso en P e n i. P rm tod in P erú. Productlon
Im preso en Q uebeoor P erú , en el me3 de noviembre de 2000 O an H arris
H e a tn e r M o sem an
P m n e ra edición: D iciem bre de 2000
> J J
vlí
El c o n te n id o d e u n v is ta z o
T a b la d e c o n te n id o s
R eglas p a tr ó n ....................................................................... 49
Ejemplo .................................... - ........................................ 49
Com entarios ..................................................,............... — • 50
Targets ú tiles para un m a k e f i l e .................................. 50
A dm inistración de e r r o r e s ....................................................... 52
3 Acerca del proyecto ..............-.................................................... 55
El program a de base de d ato s de CD m usicales ............. 56
Componente* y R ubaútem as .................................................. 56
P a r t e II P ro g r a m a c ió n d e s is te m a s ................................................ 59
4 Procesos ............................... ..................................................... 61
Que es un p ro c e so ..................................................................... 62
A tributos de un proceso ....................................................... 62
tdenuíicadores de procesan ......................................... 62
Ejemplo .................—............................................................ 63
Identificaciones reales y efectivas ................................. 64
E jem p lo s............................ .................................................. 65
Program as s e t u i d y s e t g i d ....................................... 66
Información de usuario .......... ............................. ..........- 67
Ejemplo ........... —.............................................................- 67
Información adicional so b re p ro ce so s........................ . 69
Sesiones y grupos de p ro c e s o s ........................ ...............- 76
M anipulación de procesos ....................................................... 77
Creación de procesos .........—...........................................- 77
E je m p lo ......... ...............................................- ................... - 78
E speras en procesos...............—— ............................................—.- .............. S
E je m p lo ................................................................................ 85
Eliminación íkilling) de pro ceso s................................... #6
C uándo m an ip u lar p ro c e se s........................................ ........ - 89
id U .
Terminología de las señales ........................................ 94
H istoria de las señ ales ................................................ 9-5
Señales disponibles .......... ........................................... 96
Envió de señales ................................................................... 99
Empleo del comando k i l l .......................................... 99
Ejemplo ........................................................................... 99
Empleo de la función k i l l ......................................... 100
Ejemplo ........................................................................... 101
Intercepción de señales ...................................................... 102
Progamación de u n a alarm a ...................................... 102
E jem p lo s.......................................................................... 103
Utilización de la función c a u s o .............. - ............... 105
Ejemplo ........................................................................... 105
Definición de un h an d ler de ? e ñ a le s ......................... 106
E jem p lo s......................................................................... 107
E jem p lo s..... ................................................................... 111
Detección de señales p e n d ie n te s...................................... 114
Ejemplo ........................................................................... 114
6 L lam adas a s is te m a ............................................................ 119
G eneralidades sobro llam adas a sistem a ...................... 120
Quó os una llamad/i n sistem a 120
Limitación»» de las llam adas n sistem a ................. 121
Quó empleo tiene una llam ada u sistem a 121
Utilización do llam adas a sistem a ..................... 122
Llam adas a sistem a comunes .................................... 122
Adm inistración de señ a le s.. ......... ................ ........... 123
Códigos do reto m o de los llam adas n sistem a ...... 124
E jem plos.......................................................................... 124
Tabla de códigos de erro r retom ados por llam adas
a s i s te m a ........................................................................ 124
Adm inistración de errores ................................ —..... 126
E jem plos......................................................................... 127
7 A dm inistración básica de archivos en L in u x ................. 131
C aracterísticas y conceptos ........—................................... 132
El modo de un archivo ................................................ 134
La urr.ask .................................................................. - ...... 136
Ejemplo ........................................................................... 138
) } ) ) ) ) J I ) ) i I J ) • i
xi
xiv
----------------------- r
xvl
Reconocimientos
Asbleigh Riití y Zane Thom as se resignaron do m an e ra valiente y estoica a
ju g ar con *u N intendo y m ira r dibujos anim ados d u ran te el tiompo que rae
llevó escribir ente libn> Tam bién mo ay u d aro n a ponerlo nom bres a algunos
do los programad de m uestra cuando mi im aginación llegaba a su limite.
Pupá no hizo nada en especial, pero sin su confianza, apoyo y aliento yo no
podría hobor tenido la motivación nocesorio como p ara em prender la t.nrea
de escribir un libro. Mamá, te extraño y hubiese doseado que estuvieras
\qu¡ para poder com partir esto contigo De alg u n a m an era, sin embargo, sé
que tú sabes. Rick. Amy, Morgan L eah y el joven m aestro Isaac Benjamín
3on sencillam ente oí mejor herm ano, cuñada, sobrina y sobrino que
cualquiera pudiese ten er Gracias a la p andilla de F.l Paño por ••ntivumermu
por e-m ail y por perm itirm e m ezclar en sus vidas cuando necesito aire
Lrosco. M arty me m antuvo trabajando, preguntándom e cómo iba todo Mi
perro Nudgo hizo honor al significado en Yiddish de su nombre haciéndome
com pañía a las 4:00 de la m añana, calen tan d o ini regazo, ayudándom e a
ü p ear e insistiendo en requerir mi atención ju s to cuando no se la podía
brindar. Finalm ente, los amigos de Bill Wilson contribuyeron a m antenerm e
lo suficientem ente cuerdo como para poder escribir; si se debe conceder
algún crédito, éste va para Dios.
Mi editor técnico, Cameron L aird. me brindó sugerencias que mejo
raron la calidad general del original, señ alaro n un alarm an te num ero de
errores realm ente estúpidos, evitaron que el libro sonase a página de m a
nual. y en general lograron evitar que el au to r de estas líneas pareciese un
perfecto imbécil. G racias, Camerún.
El equipo de M acnúllan fue estupendo A G retchen G anser hay que
concederle el m érito de que este libro siq u iera exista -re riebo un alm uerzo
todavía., G retchen, y te agradezco por no e n tra r en pánico cuando nos
retrasáb am o s-. G retchen y S ean Dixon, mi editor de desarrollo, ambos se
las arreglaro n p ara ayudarm e volver a los tiempos previstos .¡gracias a
rodos'). N isiq u ie ra quiero sab e r c u an ta s reglas pasaron por alto. S ean se
merece un alm uerzo, tam bién, si alguna vez aparece por Sale Lake City.
Kezia Endsley Llevó a cabo u n excelente trabajo de edición del original y se
XXI
¿as arreglo p ara leer d i ¡r.ente cuando lo que yo había escrito p arecía prosa
bizantina. S ara Bosin, o tra editora, fue g ra tam e n te paciente d u ra n te la
etapa ce edición, especialm ente cuando yo m u tilab a s u nombre. ¿Lo escribí
bien esta vez? G racias a S ara, ahora sé la diferencia en tre un guión em e y
un guión ene Tonya Sunpson. la reem p lazan te de S ara. ~e merece un
agradecim iento adicional por su paciencia conmigo.
Gracias a todo* !oa ciudadanos de la red y a los miembros de la comunidad
de usuarios de Linux que. con paciencia y gentileza, respondieron mis p re
gunta? y m e b n n d a ro n sugerencias. En p articu lar. Th ornas Dickey, actual
m antenedor de la sección dedicada a n cu rses, reviso u n a versión prolim inor
de los capítulos sobre ncurses y corr.gió v a n o s errores contos y m ultitu d de
errores de tipeo. Michae 1 Olaon. de S leopycat Software, fabricantes de ia
base de datos Berketey. gentilm ente revisó el capitulo «obre la API pora base
de datos, resultando u n capituio mucho m ejor que lo que hubiera sido de
otra m anera. La lista de correo l l n u x so u n d me ayudó con el capítulo
sobre la AP! de sonido. A preao especialm ente la colaboración dn H annu
Solavainen. el au to r oriífinal de e sta API. por su ayuda.
Las em presas quo realizan negocios con. y p ara, la comunidad Linux ta m
bién a « brindaron apoyo. Red Hat Softw are y C aldera System s me apor
taron copias con asistencia plena de sus D istribuciones de Linux, ah o rrá n
dome muchísimo tiem po do descarga y to d av ía m á s frustración. Hoilv
Robinaon de Metro Luik Incorporated m e obsequió en tusiastam en te copias
de sus producto? M onf y O penG L Holly, cubrirem os este m aterial en el
próximo libro. C h n s Dibona. A sistente dts Vaguedades de VA Research (n
como qu iera que 5*- llamen e^r-r« sem ana \ me prestó un excelente .-iifitemu
con el cual desarrollar el codigo em pleado er. este libro. C h n s no se sobre
saltó. ni siquiera pestañeó, cuando le expliqué que prefería colgar el sistem a
de algún otro que exponer el mío a los caprichos de algunos punteros b ri
bones. Sirva como testim onio de la increíble estabilidad y robustez de Linux:
el mismo nunca se colgó, aunque me can se de exam inar archivos centrales
de Linux; las teclas wg*. ‘d”. y 'b ” de u n teclado quedaron lisas y sin marcas.
Si me he olvidado de alguien, le rieg o que acepte mis m ás sen tid as discul
pas y me envíe un e-rr.aii a kwalI@xmission.com. de modo que pueda rem e
diar la omisión. A p e -a r de teda la asisten cia que he tenido, asum o la p lena
responsabilidad por cualquier e rro r y d islate que haya podido quedar e n pie.
i
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.
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
2 . C o n t r o l d e l p ro c e s o d e c o m p ila c ió n
3 . A c e rc a del p ro y e c to
Compilación de programas
E'. GNU cc g c c »es el conjunto tic program as que com prenden el compilador
del proyecto GNU. Compila prvp-am aa escrito» en C, C-*-*, 9 C dirigido a O b
jetos. El g cc tam b ién compila FORTRAN icón apoyo de g77). Esto capítulo
m concentra en el com pilador de C porque C es la lengua nativ a de Linux
El capitulo tam bién cubre las diferencias e n tre g c c y egCS vennón 1.1.2. el
conjunto experim ental de program as del com pilador GNU.
E ste capitulo abarca los siguientes tem as:
• Invocación del QCC
• Opciones y argum entos para controlar la conducta del g cc
• Compilación de m últiples archivos fuente
• Utilización de las prestaciones de optim ización <le g cc
• U tilización de las prestaciones de depuración de g c c
• A d m in istra ra n de errores de compilación
• Extensiones del GNU al lenguaje C
• El nuevo compilador de C. e g e s
Todos los program as de este capitulo p u ed en ser encontrados en el sitio web
n ttp : w r t . n c p .c o n i n f a bajo el n úm ero de ISBN 0789722151
Programación en Unux
In v o c a c ió n d e g c c
Para utilizar g c c , sum inistro un nombre de archivo fuente de C y utilice la op
ción -c para especificar el nombre del archivo de salido, g cc preprocesara. cum-
pilará, ensam blará y vinculará ilink) e! programa, generando un archivo ejecu
table, a menudo denominado binario. La sintaxis más simple se ilustra aquí
gcc «'•cbivo.en'rítía.c |-a vcluvo.saUda]
a r c h iv o _ e n tr a < ía .c « i un ardávo de código fuente en C y -o establece que el
nombre dei archivo de salida será a rc h iv c _ s a li< J a . Las corchetes <1 j) indican
a lo largo de esto libro argum entos opcionales. Si ol nombre del archivo de sali
da no se espedñca, g cc lo denom inará a .O u t como opción predeterm inada.
E je m p lo
Este ejemplo utiliza g c c p ara crea r el program a h o la a p a rtir del código
fuente h o l a . c. Primero, el código luente:
TEMPLO >• \cno--e aol pragr&M on Internet: Hallo.c •/
/*
i.;3ta<Jo 1 . i
Capitulo i : Compilación de programas 9
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
P R E C A U C IO N
£ k í t m í o c - o e ,« o t ó o» c f C f v n a h o l a In c lu í esp e tífle a m e rta •: dircccono corrien
te, taoo co » un p o n o U . p o ro u * inciulr oi o fo c io n o com ento «n o ruta w a t fr
ieren un n esgo M r« a S<7jun3ac £ 1 fleo ?. *l <1 «rectOrtO com ente fu e se un subdirec-
tono OM Ct.m o ire c to fto inctukJo en a m ta . on lugar ao utüüs/ un» aef'.er.ctl SPATH
« « n e ja r.:* 3 / P i n : / u s r ' f c ; n : , ' u » r f L o c a L ’ ü l n : . f w o ei ounto al final), lo sen ton
e s oeoer^a s«r ; o ¿ n : / u s r / s » n ; / u s í “ / l o c a l / t > t n . c u m cco que t-mgCin haciter pu
c a r á scicc ar en et ^ 'e c to n o com ente, un c o rra ro o dad too del m iim o "o r r w o del co-
tt^ o co norma) c - o uno w B rdatíaranerw c e se n e|ecu;ar
continúo
Programación en Linux
In v o c a c ió n d e g C C p aso a paso
En el p n m e r ejemplo, hubo m ach as cosas que tuvieron lugar do m an era e n
cubierta y el lector no las vio. g e e prim ero corrió h o L a. c por el prcprocesa-
dor, cop, para expandir cualquier m acro que pudiese h ab er e in s e rta r los
contenidos de Ion archivos incluidos m odiánto tf in c lu ú e Luego compiló el
código fuente preprocesado. convirtiéndolo en código objeto. F inalm ente el
linkor. Ld. creó el archivo binario h o la . El proceso completo de vinculación
se ilustra en la figura 1-1.
Uro puede recrear estas etapas m anualm ente, avanzando por el proceso de
compilación un paso por vez. P a ra indicarle a g e e que d etenga la compila
ción iueiíü del preprocesado, utilice iu opción -E de g ee, como se indica a
continuación:
S gee -5 3rc-ivo_3':tr3í3a.c o arsnavo_salioa.cpp
I
Si el lector exam ina h o l a . cpp con un e d ito r de texto, vera que el contenido
del archivo de encabezam iento S t d i o . h ha sido cfcctivamenti* inwjrtudo on
el código fuente, ju n to a otros símbolo* de preprocesado. El listado siguiente
es un ex tracto de h o l a . epo:
r n t t r - tn t f$*t5c» (FILE • 'o o a j •_ po j ) :
•* :* m m t **»:pcs ts o a t fpos_t
íTalioá * 518 '/w /U »daa«;*«io.n* 3
• x t t o i m t ?*cf * _ straan|
in t
*Xt=m _ co n jt ir-a- • _ » * « i/S_í"IXS*l!;
12 Programación en Linux
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
* ,, E je m p lo
v /iE ) Supongam os que so desee com pilar n u e v o * h o la , que utiliza código prove
^ pgí m ente de dos módulos, m o s tr a r , c y m e n s a je s .c , y un archivo do encabe-
zado. m sg . h:
/• Nooüre do prograaa un Internet: sh o m t.c
/• n«j*vc_floia.c •/
{J - ------------- o o s t r a r .c -----
r
• n o stra r.c _ Contralaúor c* p an talla
•i
«UKluc* ■íítdio.h»
• irc ’ uo® 1nansaJt.n’
int Bain(void)
(
cnar ne“ 3a ]é _ C io n v o n :d a ;i * { ‘ ¡H ola, p.-o gran ao ar.'* } ;
o r a r « fls a j8 _ d e s p e < J¿ o a í| = { * :A o iá s , p rsg ran a d o r: • } ;
Capítulo i : Compilación de programas 13
/•
• . 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
’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
O p c io n e s y a rg u m e n to s
Lu lista do opciones de línea de comando que acepta gcc ocuparía varía» p a
ginas. do modo que lu labia 1.2 p resen ta sólo las m ás comunes
Tabla 1.2. Opciones de linea de comando efe gcc___________________________
Opción______________ Propósito_________________________________________
0 nom a r c h iv o Designe «l archivo de salida n o n _ a r c h iv o (no necesariamen
te! cuantío so compila código objeto). Si no *e especifica el
nombre ele eate archivo, la opción prodetnrminad* o s a . o u t
•C Compltor sm OnkOúf.
D f o o -b a r Defino un macro de proprocoindor f oo con jn valor b a r en la
linnd J'» Comando».
ír u t a _ d ir SllOa 'a ruta de acceso oí directorio espociricooo on < -u ta _ d ir
•ii comlen/o de ia lista de directorio» en que gcc busca los ar
chivos .i incluir por la proaancia do directivas « I n d u c e
-ir u t a id ir Sitúa :n ruta de acceso ni directorio «sp^c-flcaco on r u t a _ d i r
ai comienzo de j lista ce directonos en que gcc busca arcm
vos de biblioteca. Como opción predeterminada. gcc linKea bi
bliotecas compartidas.
s ta tic Unkea bibliotecas estáticas.
• lfo o LinKea ia biblioteca foo.
•5 incluyo en el archivo binario información estándar ce
depuración.
ggcb incluyo en o! archivo binarlo muchísima Información de a p u ra
ción que sólo pueda interpretar el depurador del GNU. gdb.
-O Optimiza el código compilado. Esto es equivalente a especificar
- 01 .
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"-
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 .
*1 _ ; ■^ 5 V £ ja o Iá _ Iic
E je m p lo s
Considerem os el siguiente ejem plo, que m u estra u n a muy m ala práctica de
program ador: En el mismo se d eclara m am como retornando v o ic l, cuándo
de hecho n a in retorna i n t , y u tiliza la extensión GNU lo n g lo n g í n t
para d e cla rar un entero de 64 bita.
• noaer» i*', crog*aa» !*>tdrr.e?: oe<S»nt.c '/
i-
• - CoaprU'- sucesivaM At* u t i l i r i r c a p r u í r o
• - « s i . Ivego p*<antic y f íM la t o t » -j«< nntie-*'Tors
■/
ro ía « in (v o ifl)
t
Icrg i233 iitt 1 - 01;
Svts ("EsTi r.o 5£ un arog.-aaa que CL¿noia con Lai re g ias de C ') ¡
)
Programación en Linux
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
OPCIONES DE OPTIMIZACIÓN
La optimización del código es una ten tativ a de mejorar el desempeño de un pro
grama. La desventaja consiste en m ayores tiempos de compilación, mayor om-
pleo de la memoria d u ran te la compilación y. tai vez, mayor tam año de código.
A ctualm ente, g c c tiene tres niveles de optim ización. La opción -o sin a d ita
m entos le indica a g c c que reduzca tanco el tam año del código como el tiem
po de la ejecución. Es equivalente a -01 Los tipos de optimización realiza
dos a este nivel dependen del procesador al que se a p u n ta, pero siem pre
incluyen por lo m enos optimización de hilos do comandos j ump (aaiter a) y
diferim icnto de comandos COP «retorno d e valorzi de registros) desde la pila
'stock Las optmuzacione3 de hilos de com andos j ump in ten tan reducir el
núm ero de este tipo de operaciones Los diferim iento* de p o p s desdo la pila
tienen lu g ar cuando el compilador perm ite que lo* argum ento» He acum ulen
en la pila a m edida que las funciones re torn an valores y luego los regresa s i
m ultáneam ente, en lugar de ir reto rn an d o los argum ento» de a uno por ver,,
cuando reto m a cada función llam ada.
L'is optim izaciones de ruvel 02 incluyen todas las optimizaciones de nivel
01 m ás toque;, adicionales que se vinculan con la m anera en que se llevan a
cabo los comandos del procesador. En este nivel de optimizacion. el com pila
dor in te n ta g a ra n tiz a r que el procesador cuente con comandos p ara ejecutar
m ientras espera por ios resultados de o tros comandos El compilador ta m
bién in te n ta com pensar por ia tard a n z a de datos, que es l« dem ora ocasiona
da por «1 tiem po que requiere o btener d ato s desde el “escondite" o la memo
ria principal La m iplem cntacón de e s ta optimización depende en gran
p arte del tipo de procesador sobre el q u e se realice.
Las opciones -0 3 incluyan todas las optim izaciones 02. desenrollo de lazos
y otras prestaciones muy vinculadas con el tipo de procesador.
Según sea la cantidad de conocimiento a bajo nivel que uno tenga sobre una
fam ilia dada de CPU. podra utilizar la opción • f f Lag para requerir las opti
mizaciones especificas q u t s* deaea llevar a cabo Tres de esos indicadores
flags merecen consideración, - f f a s t t n a t h , in lin e - f u n c ti o n s y -fu n -
r o l l - lo o p s - f f a s t o a t h genera optimizaciones sobre las operaciones m ate
máticas de punto flotante que a u m en tan la velocidad, pero violan estándares
IEEE y/o ANSI- - f m i m e •f u n c t i o n s expande todas las funciones •'simples”
d u r a n » la compilación da un programa, de m anera sim ilar a I03 reemplazan
de los macroó rn el preprocesador. Es el compilador, sin embargo, el que decide
cuál constituye una función simple y cu ál no.
- “‘u n r o l l - lo o p s instruye a ¿cc p a ra que desenrolle todos los lazos que te n
gan un núm ero ñjo de iteraciones, siem p re y cuando dicho número de ite ra
ciones pueda ser determ inado d u ran te la compilación. D esenrollar un lazo
significa que cada iteración de-, mismo s e convertirá en una sentencia indivi
dual. Asi, por rjemplo. u n Lazo que conste de cien iteraciones se convertirá en
cien bloques secueadales de código, con cada uno de ellos ejecucando las m is
mas senter.c-.as. La ¿ g u ra 1-2 ilu stra gráficam ente un desenrollo de lazos.
Obsérvese que La üg’jr a sim plem ente m u e s tra el principio general del desen
rollo de lazos. El método que emplee g c c puede ser drásticam ente diferente.
I / ,1 J- } l i ) J ) / > t ) / > .1
Programación en Linux
I - 8;
s n n t f f SCS.l , i ) .
1 - t:
pr:nff i . il:
i - l:
prw tf{*d\ii, i l;
1 - 3;
s r l n ; r i vj'.n , i ) ;
1 • »; i - »:
< ,-9.' 1 ií;
prlnrri M\<> , .1 i - 5;
••i; prllUf< , l|¡
} t - 0;
p rl n ir < v j i n , t ) ;
i -» :
p r i n t r i > ¡\ t , i t ;
i • 9:
flflfKft *U« . II;
t • i;
p n n t f ( S i» n , x j ;
CONSEJO
GeriH.i-monte. con ur nivel d i Oftimtíación o 2 resulta aurlclcn'.c. Aún i>n prof/amnn
OJqucrios. toles como ol do la artmoni u*cclórt ‘ Üjompio' al fiom ionio do esto capitulo,
el <Ktor ;ipr<Jciür¡) pdq-eAtw rrt(iucclOr<5s on ol tnmaiío dol código »■©ooueftos Incremt-^.
tas e r ol dosomc*<to.
E je m p lo
Esta situación utiliza el máximo nivel de optimización, 03, p a ra com pilar los
listados 1.2, 1.3, y 1.4. Comparo ul tam añ o dúl program a optim izado con el
ejemplo tamaño dei programa no-optimizado.
S qcc -03 wnsajes.c nostrar.c -o nuevoJioia
5 is - i íiuevojiola
■ x p- x r x 1 k u r t _ - a li u s u a r io s 12091 Ju ! >3 2 ! 36 n u evc_.io !¿*
s gcc -00 n e . i $ a ] í s . í « s t . - s r . c -o n u d v o jio la
SAUOA
S ia l n u e vo jto la
r** r - * r - » l juirtjraU usuarios 12137 ju l :3 ¿:: 2? num_noia*
La opción -0 0 desactiva coda optimización. A unque la diferencia es peque
ña, sólo 16 bytes, debería resu ltar sencillo com prender que program as más
grandes producirán mayores ahurros de espacio en disco.
Capitulo i : Compilación de programas 21
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.
E je m p lo
Este ejemplo le m uestra cómo com pilar con información de depuración e
ilustra e! im pacto que los símbolos, que controlan la depuración, pueden te
ner «n tí! u m a ñ o de un archivo ejecutable U na compilación y linkeo com u
nes d«l Listado l i produjo u n archivo binurio de -1089 bytos on mi sistem a.
Los tam años obtenidos cuando com pilé el mismo código fuente con las opcio
nes -g y -ggdb pueden llegar a sorprenderlo:
S ;:c •; *oí*.e •« HoUjj
|T * l« 1 M i»
1 * u r t_ a ill usuario» Ju i 13 21:09 llOlSJ)*
* S jcc -59:2 n c U .c -o iola_ 5fldO
s i s - 1 s o U _ » :5
- r« « - - i * - « t ¡u irtjn ll jsuarios 3S4fló7 Jul 13 21.35 nola_3ga3*
Como se podrá apreciar. la opción -g increm entó el tam año del archivo bina
rio re su lta n te en un cincuenta por ciento, .m ien tras que la opción -g g d b in
fló el mismo archivo casi un novecientos por ciento! A pesar del au m ento de
tam año, se debería proveer a los archivos ejecutables con símbolos e stá n d a r
de depuración creados utilizando -g) p a ra el caso de que alguien encuentre
algún problem a y tra te de d e p u ra r el código en lu g ar suyo.
Programación en Linux
C O N S E JO
Como .-eg:a general, depure peñero, optimice casp as. No nterprete. sin er-.Dargo. oue
‘opi.'miza? üwpuds’ signifique '^o tener en cuenta la eficiencia {Jurante el acceso de
diseño'. La optíniizaciúrt. on oslo contexto, se refiere a las testaciones Que •MroiJuce
el compilador, comentadas en esto sección. Un ¿'jen diseño y algoritmos Ociemos tu;-
non mucho mayor Impacto en CJ dftiOmoeí'O global Cu© o que pueda lograr cualquier •
PO <3c 'otlmiiación lograda por el compilatfOí. £n verdad, si uno so tona el tiempo nece
sario raro croar un sisoño adecJBdo y utiltta algoiitmos rápidos, puedo no llegar a
.-«eslT.v optimizar, aun cuando probar oslo último nunca viene mal.
P R E C A U C IO N
£i aroaoma ccn «ti cóo>go lio csiímda* os doblo, En cxvner lug»', si uno esta utilica-v» ex-
• in-aiooas GNU. 3u código solo compilará odeojad#monto, ni oí, quo directame-te compi
H gcc, 3 otro probleno «s qy* loa códigos no estándar r.o adhieren a Us no/ma*
ANSl/iSO. Muertos usuarios utilizan on su» compiladores a menor conload posible <Jo es-
pocifcadorea <ie compilación, do meco qun loa códigos fuente cue no conforman a os os-
Mnoaros ANSI/ISO ro ampliaran La político más Inteligente, si uno desea Inouir car«te-
naticat* no ©star-dar on al cósico de su programa, es encerrarlas ontre directivas ffiíaeí
para permirr su compilación condicional. £n ei grupo de noticias Como.iang.c o pondrían
poco menos que en ra nata negra por utilizar código no estanca-.
Para proveer unidades de alm acenam iento de 84 bits, por ejemplo, g cc ofre
ce h! tipo long long int, utilizado r*n el Listado 1.5.
Í0rt<j ior.g ;ar_eni5r3_lar>3a;
NOTA
£ ico long long in t tv r ij parto oe! borrador del nuevo estónaar 150 para C- Esto último
os todavía un corraccr. sin srreargo, i- cu*; ttrJi pocos compiladores aceren wc aiora.
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 }-*;
>
)■
>
case i:
císs 2 :
r «1 c ó c lg o v.i a q u í •/
c re a k ;
case i .
caj» 4:
¡u n 5.
O bv.am entc. ol rango do c a s e ea «im plem ento uno notación abre viuda pera
la sin tax is tradicional do la sentencia s w i t c h , pero es realm ente conve
niente
Ejemplos
l Este ejemplo ilu stra «•! empleo do la palabra reservada m l i n e . El progra
( IIM P I.0
m a ite ra por un lazo 10 voces, increm entando una variable con cada
iteración.
I" «onDrn del aroijraiTa en Intornet: m lm c .c •/
/•
• u iIla í.c - U d l i 2 acicn de la calaora reservada m i lne, que per» i te
• generar furcianeí axoaraioles durante la concilacton
•/
»:ncl'ja<* <3tdic..r*
inllfle u it increneíirari Lnt *3)
C
Capítulo 1: Compilación de programas 25
C a í* * :
í
irr «jrr(void|
(í
iflt i • » ;
■ h iie f i < i«) {
I T C T fe e flta 't ;
p riíitfC S c \ ii:
>
o n ntfC M »*);
r t f jr c I.
>
l
ir .i i • 0 ;
zm 9 ... 5:
p r i a r r i * t * * j\n * . l ) ;
Programación en Linux
ae^ au lt:
t9rai.ia-_aha-ai I ¡
1
i
r « u r n 0;
i
»oid t9nn.nar_Bl»ra(void>
<
putsi , :«r»manoo añora’ );
M itin j
Tenga cuidado, cuando radacto an código que tenga un Ijuo infinito como el
lazo « f u l e do este program a, que oxs.sfcn un punto d r nalida. tnl como salir
dol lazo cuundo el contador del minmo alcance cierto valor. Para nuestros
propós:tos actuales, sin embargo, el ejemplo ilu stra perfectam ente cómo fu n
g ona i\ «*xT<«ru»i0n que perm ite especificar el rango do c a s e . La salida dr> es
te program a es:
i • i
S ALIO A
i • 2
i - 3
i * ■*
1 * 5
tertinaftcc ¿ñora
y,
tflt UlrfvOMI
(
• trjct C3MPACTACA ca:**a;
• t r a e : \6Mtu. yfipacttd;
rerum a,
i
Programación en Linux
NOTA
Los Uytot do re.-ano or. i.i o n ta c iu m norm ol fuoron p r o o o b le ^ o n t * e l m w i Id o o d e
r« « r j t r y s scOro limites aoocu ocos. rr.« Jiu n te fll 3g í* g o 3o Oe tro * y d o i b y t e s . re * .
o«ctiw yn «vte. o ios •ac’.ií'Oi >wasdao<i ANSI p erm ite a io s e u o c rc ^ r sm a n en -n n gu o
;« C r e iiw w to s a s 1,13 M tftictura» b a s ta n á c e n o s a rra n c a r üoodo lo s o rlg o n e s n o '.w faies
tic lo» daten cu y a s lo n jiríd c s «non múHipion d e p a la c r a s * n lu a rq u ite ctu ra q u o toa aló
la. O l o a -m o. ju i’ íjuo ui at/ibiito p a c k e d o f r e c e a lg u n o s b o r.c n c io * o b vio s, 'o s b rin d a a
* x p c n « is d o a pcytoowdad de- prctfram.n.
Utilización de eges
eg es es el conjunto experimental {o mejorado) de programas del compilador
GNU. Originalmente fae un emprenduniento experimental tendiente a acele
rar el desabollo del gcc y a expandir el entorno operativo del gcc. O tros obje
tivos del proyecto eges (pronunciado asimismo e g g s, sin la c) fue añ ad ir nuevos
lenguajes, nuevas optimizaciones y arquitecturas de procesador a g cc
E:i abnl de 1999, el proyecto GNU designó form alm ente al enmite ejecutivo
del e g es como responsable oficial del m antenim iento del g c c E ste últim o
ha sido desde entonces deuominado Colección de Compiladores GNU. La
cuestión clave de esta cia.se de historia es su g e n r que, en algún momento,
eges puede muy bien fusionarse con g c c . E n tretan to , sin embargo, e g e s es
un producto separado. Es también «1 compilador predeterm inado para
C/C++ en por lo menos dos distribuciones, de modo que resu lta im portante
comprender sus diferencias y mejoras respecto de gcc. P ara obtener m ás in
formación sobre eges, visite su sitio web en h t t p : / / e g e s . c y g n u s . c o m /.
Casí:ul-o 1: Compilación de programas 2a
N OT A
tT3 Qua a *ers*yi se'-Si a s e g e s , la 1 . 1 . 2 . seria :¡tim a v e r s a r c e e g e s c o
t ocrcg.- 3. - s -jarónomo. 3 S ig u ió t e ; 5-r- 9-,w . de acuerdo con la i r fc r r & o ó r Obte-
mSie r i e s-’J o a = ó e s e g e s . se-^á ;a '.e -^ cr- 2.35 de g c o .
M e jo ra s a g c c
La m ayoría de las mejora* de e g e s respecto de g c c afecta la operación del
propio com pilador en lu g ar de la de ¿u in terfaz de linea de comandos. de mo
do que se h allan mucho m ás allá del alcance de este libro. Sin em bargo se
h an efectuado tam bién algunos cam bios en la interfaz de linca do comandos,
los cuales se cubren en este punto.
Se añadieron varias advertencias nuevas. -Wundef y -V/no-def generan ad
vertencias cuando una directiva *i t*de prcprocesador intoRta evaluar un uinn-
uñeador no definido. -W sig n -c o m p are hace que e g e s (y g cc) generen una
advertencia cuando el código com para un valor con signo con otro sin signo. El
indicador de -W all ha sido extendido do modo de hacer que eges em ita ad v er
tencias cuando los valores enteros ?on declarados implícitamente. Do m anera
análoga, el indicador de ad v erten cia •W í.flipltci.t • f u n c t i o n - d e c l a r a -
t i o n s ad%-iert* en loa coaos do declaración implícita de funcionen.
Se han efectuado tam bién m ejoras a la depuración y a la optimizurión. Por
ejemplo, adem ás de los argum entos numérico».* del wpecificador de optimiza*
aó n , -0, se puede ahora utilizar • Os p ara asignar prioridad a ius optimizacio
nes de tam año de código sobre las optimizaciones de velocidad. La selección
entre optimiiaciones en tre tam año y velocidad depende en su m ayor p arte de
si necesita un alto desempeño o conservar espacio en disco. En estoa días, en
que tanto el costo de la m em o ra RAM y de los discos rígidos ea relativam ente
económico, resulta tarea rencilla selecdonur velocidad por sobre tamuño. El
tam año de un program a, sin em bargo, debe se r considerado en térm ino de sus
requerim ientos de alm acenam iento en disco tanto como la m em oria que re
q u e re p ara ^er ejecutado. En situaciones donde, tanto el tam año de almace
nam iento en disco como la m em oria RAM utilizada se deben ad m in istrar p ru
dentem ente. seleccione reducir el tam año en lugar de au m en tar la velocidad
porque ei program a más rápido del mundo .será inútil si no llegase a caber en
el disco o no contase con m em oria RAM suficiente en la computadora.
Ei espeeiñeador - f s t a c k -ch ecK com prueba desbordes de piia en sistem as
que carecen de u n a prestación d e ese tipo. P ara m ejorar la capacidad de de
puración ¿o h an agregado nuevos indicadores p ara reseñas de desem peñe
Las reseñ as de desem peño le p erm iten al program ador d eterm in ar con re-
30 Programación en Unux
Lo que viene
F n este capitulo, el lector ha aprendido cómo utilizar el compilador de C de
GNU. g c c . y debido a su sim ilitud con g c c , cómo utilizar e g e s. La mayoría
de los program as que uno construya, au n cuando sean programa* de archivo
único, van a necesitar do largos tiem pos de Compilación. E sta flexibilidad
puede se r por o tra parte cansadora y tediosa de tipear, do modo que el próxi
mo capitulo le m o strará cómo au to m atizar el proceso de construcción de
softw are utilizando o tra gran h erram ien ta de UNDC/Linux, tnake. Con un
entendim iento básico de am bas h erram ien tas, el lector esta rá en condiciones
de continu ar hacia los tem as de program ación de sistem as que le perm itan
com enzar a program ar en Linux con ejemplos.
i ) ) } ) ) ) ) ) , ) ) ) ? ) ) > } ) ) ) / > > > j
2
Control del proceso de
compilación: el make de GNU
fiake e s ur.a h e rra m ie n ta u tiliz a d a p a ra co n tro lar los procesos de cons-
inacción y revisión de so ftw are, ma ke au to m a tiz a el tipo de softw are
crea, cómo y cuándo se lo d esa rro lla, perm itiendo al program ador concen
tra rs e exclusivam ente en la redacción del código fuente. A dem ás perm ite
a h o rra r m uchísim o tipeo, ya que co n tien e decisiones lógicas íntegradu»
que invocan el com pilador de C co a la s opciones y argum ontoa que s e a n
idecuados!
✓ 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 .
Utilización de make
E sta p arte explica cómo utilizar m ake. E n particular, explica cómo crear
m ake£11es, cómo invocar a tnake, cómo d esm en u zar su plétora de opciones,
argum entos y especificadores, y cómo a d m in istrar los inevitables errare-,
que ocurren por el camino.
C3Cr:-:o 2: Control del proceso de compilación: el make de GNU 35
C r e a c ió n d e m a k e flle s
Así que. ¿cómo logra realizar n ak e au s m ágicas proeza3n U tilizando un
mAkefüe que es u n a base do datos en form ato texto que contiene reglas que
le indican a “ 3ke qué construir y cómo construirlo. C ada regla consiste de ln
siguiente-
• L'n targ et, ia 'co sa" que en d efinitiva tr a ta de crear.
• U na lista de u n a o má3 dependencia», g eneralm ente archivoH, requeri
d as p ara co n stru ir el ta r g e t
• U na lista de comandos a ser ejecutados con el fin de crear al tnrget a
p a rtir de las áepenctncias e n tre archivos especificadas.
Cuando v t lo invoca, el maKe de GN*L* busca un archivo denominado
G N U cak eH le, - a < e f l i e . o M a k e 'i i s . on ese orden. Por nl^una razón, lo
mayoría de los program ado res de Linux utiliza e sta ultim a forma,
U a k e flie .
Las regla# de un muicefile tienen 1a xiguiontc forma general:
sojttlvc : ;a«o*r.s*ncu! [•••!
CSMfiCC
ICOMMO)
1 - t _________________________________________
PR E C A U C IÓ N
E yjTK* c*f»rjK - i comaodo cec« íg’ h córtate' o* ucuiacior; ocho espacios no
*on -a <n-vj cosa Esto a menooo tama a !s ¿ente desprevenida, y puede resultar un
yflDimj si %>j editor sit'efiáo eor-»ie<?e 'vtrvlealmena' caca taouador en ocfto aspa-
o j í S; uno trata ce «ripear ssoacios en '.gar 3e taOuiadores, ird«e exívoira c! non-
sare *Wsvr.£ y se ¿etenOtt.
E je m p lo
Este m akeále de m u estra perm itirá que la explicación sea m ás concreta. Seria
el m akeñle necesario p a ra desarrollar u n editor de textos ai que. haciendo
E JE M P L O iíaia de im aginación, hemos denominado e d i t o r . Los signos de num eral #)
inician la s líneas de comentarios, tal como se com enta en la página 50. g c c es
el comando que activa ol compilador, rm (ver ta b la 2.3. página 47) es u n a va*
riable predefinida que activa un program a de eliminación de archivos.
*
* wa^efü# da .muestra
#
ed;tcr e d itor.o pantalla.o teclad'J.o
ge: -o i«íJ:tor editor.o pantalla.o toclado.o
edito*.c : id its r.c editor.h teclado.h pantalla.n
gcc -c editor.c
C ín tílla .o : pantalla.c sanralla.h
gcc -c pantalla.c
•.«ciado.o : toclado.c « c la c o .n
3:c c teclado.c
o rfllija r ;
r*? id iw r *,o
Par:» com pilar e d i t o r . se debería tipoar sencillam ente make en el directo
rio dondo ae encuentro el makefile. Asi de aimplo.
Eatr makefile tiene cinco reglas. El primor target, e d i t a r , «je denomina target
pn-rfctcrmmiido; este es ol archivo que make en definitiva trata de crear e d i t o r
tiene cria archivos de loa cuales dependo: e d i t o r . o. p a n t a l l a . o y
te c l a d o .o ; ^ t o s tres archivo.1! deben oxwtir para quo .*ie pueda construir e d :
t o r La linea liguiento consiste en o! comando quo debo ejecutar make p ara
crear e d i t o r Como so recordará del capitulo 1, "Compilación de programas",
esta invocación del compilador constniyo un archivo ejecutable denominado
e d i t o r a p artir de los tres módulos objeto, e d i t o r , o. p a n t a l l a , o y
t e c l a d o . o . las tres reglas que vienen después lo mdiciui mn ak e cómo con-
-itrair cada uno de los módulos objeto La últim a regia le indico a make que hugu
limpieza, eliminando todos los archivos objeto que contribuyen a formar editor
Aquí es donde el valor de make se lince evidente: norm alm ente, si uno
trata se de co n stru ir e d i t o r utilizando el comando de compilador de la línea
2, si los archivos do los cuales éste dependiera no existiesen g c c produciría
un tajan te mensajo de erro r y term in aría, m ak e, en cambio, después de
haber determ inado que e d i t o r req u iere esos archivos p ara ser compilado,
prim ero verificaría que existiesen y, si no fuera así, ejecutaría los comandos
necesarios p ara crearlos. Luego re to m a ría a la prim era regla y crearía del
archivo ejecutable de e d i t o r . Por supuesto, si a su vez las respectivas
dependencias p ara los com ponentes, t e c l a d o . c o p a n t a l l a . h, no
existiesen, m ake ren u n ciaría tam bién, porque no dispondría de los ta rg e ts
denominados, en e ste caso, t e c l a d o . C y p a n t a l l a .h.
t
In v o c a c ió n d e m a k e *
Invocar a m aka sólo requiere rip e a r make er. el directorio donde se encuen
tre e; m akeñl?. Por supuesto, iguai que ls m ayoría de los program as de
GNU. ~ a k e acep ta una considerable cantidad de opciones de línea de
comando.- Las opciones m ás com unes ge iistan en la tab la 2.1.
Tabla 2 A . O o c o l e s com unes de línea se comandos <¡e make.____________________
Opción_________________Propósito____________________________________________________
- i^ i_ a r c h iv o L i r a el rraksf: * denominado naffl_a.-chivc en lugar de uro
■¡e ’os íe nomorc ©stár-dar {GNUmaSeflie. mokefilo o MakefTe).
n zst-'tx los comandos que ejecutaría make 3¡n en realidad fije-
cutartos. útil cara eomorobgr un makefile
I n o = < ir « _ d i r -irtaco ncr-bre^tíir 3 13 '.sta de directoros Corda bu 3 car$ nake
os makefiies incluidos.
5 Ejecución 5 ! «o c to w . sin mcximir los comandos Que va ejecu
tando mako
« monme non%bros de directoras cuando moho camfra de direc
torios.
Hf i l e Ejecuta maka como 31 n o o _ a r c h lv o hubiese s'rto modificado.
iff-oi que -n , muy Obi para ccmorobar makeflies.
r Deshao»i'ta todas tas reglaa integradas en ma*e.
d Imorwre gran cant-dad de información para depuración,
i Normalmente. make so detiene 31 un comando retoma un
código de error distinto de caro. Esta opción deshabita o*te
comportamiento.
•« Seguir «¡ocutindose «un $1 uno de 103 '.argots ro su lograra
construir. Normalmente, si uno tío loa targets no ne ogrera
construir, make tomunarta.
• jn Correr N comondos on paralelo, conde N es un valor entero
pequeño i distinto do cero
m ake puede g enerar mucha salida, de modo que si el lector no se encuentra
interesado *n an alizarla, utilice la opción • 3 pora lim itar In salid a pro
ducida por nta><e.
Las opciones -W y n ie perm iten a uno h acer un análisis del tipo “¿qué
pasaría si el archivo X cambiase?"
La opción - i existe porque ao todos loa program as retornan 0 cuando te rm i
nan sin inconvenientes. Si uno u tiliz a ra un comando asi como p a rte de u n a
regla de un m akeñle, n ecesitaría um plear - 1 a fin de que el proceso de com
pilación continuara.
La opción -k resu lta p articu larm en te ú u l cuando uno está construyendo un
program a por p n m e ra vez. Dado q u e le indica a n a k e que continúe a u n si
uno o m ás de los targ ets no se p udiesen construir, la opción -k le perm ite a
ano ver cuále.*- targ ets se construyen sin problem as y cuáles no, perm itién
dole concentrar su s esfuerzos de depuración en !oa archivos con problem as.
Si se e sta fren te a una compilación m uy larga, la opción • j N instruye a
raake de que ejecute N comandos sim u ltán eam en te. Aunque esto puede
reducir el tiem po total de com pilación, tam bién puede im poner u n a pesada
carga ¿obre ei sistem a- E sto probablem ente resu lte tolerable er. un sistem a
38 Programación en Linux
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
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
prolija*:
$iSM) I( í**0G*.**aSi *.o *.a •- '.se r
lie : o o ll ia r
í i C 2 ?5 talc3 .:¿e ¥a*«fil«
40 Programación en Linux
2. E ste ejemplo com para la salid a norm al de inake con el resultado que se
obtiene cuando se em plea la opción • s p a ra su p rim ir dicha salida
s aak? a ll
cc -g fcola.c -o ñola
■ -*' cc -3 s e c a n :.c -o podan*
SAUOA cc -g rc stra r.c nen3a;*?s.c -a mievoJióU
cc -g -c n*nsajes.c -o U&TWisajíS.o
ir res lit>nefl$a:t»s.a Ii3nens3jes.0
OOdart.c: I.i functiOR aatn':
a s e a n ? .c :B - ■ B rn in g : rs tu r n typ e o r •irgin* : s r.ot ' í n t '
cc -g no_rstorno.c -o oo_retomo
cc -02 L f l li p í.c -o ln iln s
cc g c c flo a c t a r .c •« conpac ta»-
c< '5 n o it r .v .c -o m u v o jio la - U Ó I. *L . - U M im fe s
S n i*o -s « I I
ptoant.c: In r-jnctlcn na ir/:
p e ila n r.c :^ . w arntr^j: r o t j r n typo o f 'n « i n ‘ i » no? in t
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
E je m p lo s
I Referirse p ara este ejemplo al m akefile a n terio r Sin el ta rg e t .PHONY, g
en al directorio c o m e n te ex istiera u n archivo denom inado p r o l i j a r . el tnr-
c j c m p io g C t p r o l i j a r no funcionará correctam ente.
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
E je m p lo
Este makefile m u estra como funcionan la s variables definidas por el u su a
y
rio. Utiliza e! comando e c h o de lu in terfa z a fin de dem ostrar cómo se ex
panden las variables.
PflOGftAMAá * Drogt prog: orcg3 prog4
: volcar
volcar :
ecnc S(PRCGflA<aS)
S *a*e - j volcar
proQl prcgZ prcg3 prag4
salida Como se puede ver. cuando fue em pleada con el comando echo, PROGRA
MAS se expandió a sus valores como si fuese un macro. Esto ejemplo ilu stra
tam bién que los comandos presentes en una regla pueden se r cualquier co
m ando válido de interfaz o utilidad o program a de sistem a, no solam ente in
vocaciones de compilador. Resulta necesario u tilizar la opción -s porque ma-
ke m u estra en p an talla los comandos a m edida que la5 va ejecutando. En
ausencia de • s , la saiid a hubiera sido:
S w * velear
aere flr&gi cr:g2 prcg3 prog4
Capítu’o 2: Control del proceso de compilación: ei ^ake de GNU 43
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
CC •>{gcc, ■ ►íqocj
CC . s tc c i|][-------HÍKs Gl
CC . « C Q ® -----------------
F ig u ra 2.2. Lau variable:i de expannión «imple ion procesadas com pletam en
te la primera vez que. son examinadas.
La figura 2-2 m u estra que cada voz quo so referencia por prim era ver. una
variable de expansión simple, é sta rnaulta totalm ente expandida. Loa asig
naciones de variables del iadr> izquierdo del signo igual adoptarán los valo
res que io en cu en tran del lado derecho, y dichos valores no contendrán refe
rencias a otras variables.
E je m p lo s
L. E ste makefile utiliza variables expandidas recursivam ente. Como se hace
referencia repetidam ente a la variable CC. el make no funcionara. El archivo
h o l a . c está tomado del capítulo l.
CC = gcc
cc * S(CC) -g
tela: hclí.c
SiCC) h o U .c -a ñola
$ ñola
Va.<afiia:5: ••• Rscursivs variable 'CC rersrences .¡ssif {«ventosllyl. Stop.
s a l i d a Como seria de esperar, make detectó ol empleo recursivo de CC y se detuvo.
j ) . j ) , ) ) . ) . ; / i i i > * f f j 1 * t > 1 1
CC *= -g
•'ola: *cl3.í
S{CCi h o U -c -o ncU
5 -i<* hola
s P .\j ^ c 0 rtlí'-s
S4Ll DA Esta v e z. el program a compila norm alm ente.
VARIABLES OE ENTORNO
u ta variable* d f eninrr.r. &on lili versiones de -nake de todas las v ariables de
entorno de la interfaz. C uando *e inicia, ^ a k e leo todas las venablos defin i
das en el entorno ce la interfaz y cro a v ariables con loa mismos nom bres y
valores. Sic em bargo, las v ariab les del mismo nom bre presentes en el make •
f i l e invalidan ius variables de en to rn o , de modo que tenga cuidado
E je m p lo
Este makeBle u tiliza lu variable SHOME que hereda de la in terfa z como p arte
de una regia p ara construir el ta rg e t fo o .
( JCMPLO
•W . SlHC«£[/?OO.C
JCC $IH0M£¡.•fOO.C 0 S{NO*l/fOO
a f c A » » *u
xj c m : *’ * ^ w‘ * tirQ ít /noe«.'xyr:_#ai:jfao c - , newiad by 'foo . Stop.
rñi El mensaje de error exhibido es un tan to engañoso. Cuando make no pudo en
contrar /h o a e , k u r t _ w a l l / f o o . c , Listadocomodependenciadel target rao ,
interpretó que debía de alguna m anera construir primero f 0 0 . C. Sin probargo,
no pudo encontrar una regla p ara ello, de modo que exhibió el mensaje de error
y terminó. Lo que se pretendía, ¡ñn embargo, era dem ostrar quo make heredó la
variable SHOME del entorno de la interfaz ( / n o n e /k u r t_ w a ll, un este caso).
✓ p.ira .«r con mayor dótate todo 'o roforido a reglas patrón, v o r "Realas patrón*, pág-ra ¿9.
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
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.
E je m p lo
El makefile de este ejemplo rescribe la del ejemplo anterior de modo de utilizar
solamente variables autom áticas y predefinidas donde sea posible, y no rede ti-
ne i.s valores predeterm inados de i as variables predeúm das que provee make.
Programación en Linux
p rp :3 s ; p rp lC s .c
S(CCJ SíCFLAGS) S< -o &? $<LOFUOS)
io s: itfs.c
SíCC) $(CrlAGS> 5< -c S3 S flC fU G S I
La salida que genera este m akefiie tía levem ente diferente de 5a dei ejemplo
anterior
:c tds.c -o ftls
S A LID A
Esta salida m uestra que make utilizó el valor predeterm inado de CC? c c , en
lugar de gcc. En la m ayoría de los sistem as de Linux, sin em brago, c c cons
tituyo un vinculo simbólico con g c c (o s g e s ), de modo que la compilación
funcionó correctamente.
orc<j.o : prcg.c
las dos reglas listan dependencias, pero no rugí n i para co n stru ir su s targets.
En lugar de term inar su ejecución, sin em bargo, make in tern ará en co n trar y
unüzar regias implícitas que lo p erm itan construir ios targ ets (el lector pue
de verificar que make busca reglas im plícitas observando la .salido generada
por el depurador cuando se u tiliza la opción -d).
Ejem plo
EMa makolilú de aspecto sum am ente breve que viene a continuación creará
p rp ia s utilizando dos de las reglas im plícitas de make. La p rim era define
eje m p lo /¡fono crear un archivo objeto a p a rtir de un archivo de código fuente de C.
La segunda define cómo crear un archivo binario 10 ejecutable) a p a rtir de
un archivo objeto,
lid ie s : prpios.o
a rp ia s .o : p rp io s .c
i J t l 1
S Jici
ce -e s r s ic s .c -a c«Di4 s.o
c: prrias.o -c prpidj
n ak e invoca do¿ regias im plícitas p a ra construir ü n p rp x d s. La prim era regla
establece, er. esenc:3. que p ara cada archivo objeto e s t e _ a r c n i v o . o , se de
berá buscar el correspondiente archivo fuente e s t e _ a r c h i v o . c y construir el
archivo objeto coa el comando cc - c e s t e _ a r c h i v c . c -o e s t e _ a r c h i -
v o . o. De modo que make buscó u n archivo fuente en C denominado im pr -
Ci d s . c y io compiló para obtener el archivo objeto im p r p i d s . 0. P a ra cons
tru ir el ta rg e t predeternunado, im p r p id s , ^ a k e utilizó o tra regía implícita
que establece p ara cada archivo objeto cuyo nombre sea e s t e _ a r c h i v o . o,
efectuar ei .irJteo necesario para obtener el archivo ejecutable final utilizando
el comando c c e s t e _ a r c h i v o . o -o e s t « _ a r c h iv o .
R e g la s p a tró n
L*a rvijluá patró n proveen u n a m a n e ra de que uno detina ? U 6 propias reglas
im plícitas. Las reglas patrón tien en el aspecto de reglas norm ales, excepto
que el ta rg e t contiene exactam ente un ca rá c te r (V que rep resen ta cualquier
cadena no vacía. Las dependencias d e u n a regla do este tipo tam bién em
plean S coa el fin de coincidir con el target. Así. por ejemplo, lu reglo:
Va : Ve
E je m p lo
El m akeñle que viene a continuación es sim ilar al antenor, excepto que u ti
liza una regla p atró n p ara crea r u n a regla im plícita personalizada, definida
EJEMPLO por el usuario, p a ra compilar y link-ear código fuente en C, y em plea u n a re
gla im plícita predefinida p ara lirJtenr el archivo objeto a fin de crear el ar-
ehivo binario ñnaL
CFUfiS :■* -8 03 -e
CC :» qcz
»
t fttdtfir» la - tc li ja tn r prtf«t«rai.irta
* va : ve
*
Programación en Linux
•i.o : *».c
StCC) $<CFLftGS¡ J< -c 5S
i
• E ste e m e n t a r lo va -iuui solo por c o lo c a r un com entario
t
iap rp td s : in o rp ie s.a
tflorpias.o : toprpidS.c
J It4k«
5 cc -5 03 c Inprplds.C -c ínprpids.o
gcc in o ro td j.o o irtprpids
C o m e n ta r lo s
Se pueden in serta r comentarion en un makefile precediendo el comentario con
el signo de num eral ■tf) Cuando make encuentra un comentario, no procesa ni
el signo <ie num eral iú ei resto de la línea donde éste se encuentra. En un ma-
keñle los com éntanos pueden ir colocados en cualquier lado. Se debe otorgar
especial consideración a los comentarios que aparecen en los comandos, por
que la mayoría de las interfaces tra ta n a ñ como m eraesrácter (generalm ente
como un delim itador de comentarios). Pt>r ln que concierne a make. una linea
que contiene sólo un comentario equivale, p ara toda propósito práctico, a ina
linea en blanco. £ 1 ejemplo an terior ilustró el empleo de comentarios. Tiake ig
noró totalm ente las cuatro líneas que consistían sólo el delim i:ador de comen
tarios y las dos líneas que contenían sólo texto y no comandos.
T a r g e t s ú tile s p a ra u n m a k e file
A dem ás del ta rg e t p r o l i j a r ilustrado an terio rm en te e:i este capítulo, en
los m akeñies h ab itan generalm ente varios otros targets. U n ta rg et denom i
nado i n s t a l l desplaza ei archivo final ejecutable, cualquier biblioteca o
icript ¿e interfaz requeridos y la docum entación que pudiese existir a sus
S J J J J J J J J J J J J J ) ) ) ) J ) )
NOTA
B C fo ír a m j o r l o s» yn com preso * y a e iío m o ro * o r muitcropósito de archivos que en
compate.'* cor a utif cao c’toc.1 de c©mprM.ón da UNIX E i -no ce los programm
~ to 300-^srrt de 04 cro>*can GNU y u o n a a rt/a UUooo*<« o va pf4ct>c<jfT*Wo
30* 'OS s-V ervM op*r«tyos «r, use
E je m p lo
El siguiente makefile ilu stra cómo cre a r lo* turgeta i n s t a l l . d i s t . y
U f l i n s t a l l , utiiisando tíl ya sum am ente trillado programa ñ o la • c.
m n 'i o nou . M lj.c
i n i t í i l : n o li
in « * i; $< J '- o e j
.PMOHt : a u t u n ir .s tt ll
f lis t :
fin * ) n e i* ’ .o : z n
d t s i r í t e ia r :
S i » ) S(H>íE;inoIa
5 naics i r s t a l l
■re h o la .c -o r o is
i n s t a l l « i a .-o írjx -m c ip a l;!íu r-_ * a ll
* * «0* SH K 3U :
ÍTJ - í IV5I* ’ .O « r e
*3* c iv ? ñ o l a . t f .qx i c i í . ; « a xe rile
nc'.s.c
) j ,) ) ) i .) i ) ) y ) ) > )> f >
52 Program ación on Linux
» a < e f iií
S (J3k9 uninstail
• i -f /flir_prirciflai/K urt_w all/hola
Administración de errores
Si el lector llegase a ten er problema* cuando u tiliza make, lo opción -d le in
dica a make que im prim o g ran can tid ad de información adicional p a ra depu
ración, adem ás do m o strar los comandos que se encuentre ejecutando. La sa
lida obtenida m ediante e sta opción puede se r abrum adora porque la
información volcada m o strará qué es lo que hace make in tern am en te y por
qué. La salid a generada por la opción de depuración incluye ln siguiente in
formación:
• Q ué archivo» evalúa make p a ra efectuar u n a reconstrucción.
• Qué archivos‘están siendo comparado» y cufilos m n los r<-<ultados do !n
comparación.
• Qué archivo» son loa que verdaderam ente necesitan ser reconstruido*
• Qué reglas im plícitas considera make que va a utilizar.
• Qué reglas im plícitas decido utilizar n a k e , y los correspondientes co
mandos que ejecutará.
La siguiente lista contiene los mensaje* de e rro r m ás comunes que pueden
se r encontrados cuando se utiliza make y sugiere cómo resolverlos P ara obte
ner la documentación completa, referirse ul m anual de m ake o, mejor aún. a
tas páginas de información de mako (utilice el comando in^'o 'GNU m ake" i.
• Me r u l e to make t a r g e t ' t a r g e t ' S to p -m a k e no pudo encon
tra r u n a regla adecuada en el m akefiie que le perm itiera c o n stru ir «1
targ et designado y no puede h a lla r reglas predeterm inadas que le sean
ile utilidad. La solueion es ubicar el targ e t causante del problem a y
añ ad ir una regla que perm ita crearlo, o modificar la regia existen:*1.
• t a r g e t t s up to d a te . Las dependencias p ara el target designado
no han cambiado íson m ás viejas que el target;. Esto no es realm ente un
mensaje de error, pero, si oí lector quisiera forzar la reconstrucción del
target, sencillam ente usa la utilidad to u c h p ara modificar ta fecha y ho
ra del archivo. Esto logrará que naka reconstruya el target en cuestión.
Capítulo 2: Control del proceso de compilación: el raake de GNU 53
✓ j í op e<y» -*t <Je *¿'<9 s* UHa cubierta en rr^or de&Oe en !a taco 2.L 'Opciones comu
nes » «Ja comandos 5- saXeV Dágina 37.
• n<xn_progra¡r:a: Comñiand rro t fo u n d -m a k e qo pudo en co n trar
n o “ _ p t-o g ra r:a . Esto ocurre h ab itu alm en te porque no m _ p rcg ram a ha
sido mal ripeado o no se en cu en tra incluido en la variable de en torno
SPATH. In d istin tam en te utilice el nom bre completo del program a, in
cluyendo su ru ta de acceso, a ñ a d a la ru ta completa de acceso a ncm •
_ p r o g r a - a a la variable SPATH de maJkcfile.
• ¡ I l e g a l o p t i o n - o p t i o n . La invocación do maka ¡ncluiu u n a op
ción que raake no reconoció. N o utilice la opción que ocasionó el conflic
to o verifique su sintaxis.
Lo que viene
Este capítulo le presentó al lector d comando m ake, explicándole por quó ro-
sulta ü til y cómo utilizarlo El lector cuenta ah o ra con la suficiente buse como
pora com enzar a escribir y com pilar program as sim ples en el entorno de do-
«arrollo de Linux. Luego de p rese n ta rle u n a v ista prelim inar del pro^ram u
quo h a b rá construido cuando haya com pletado este libro (capítulo 3. "Acerca
del proyecto'), la P arte II le perm ite com enzar a program ar concretam ente al
enseñarle cómo program ar L inux a nivel de «tatema. El lector com enzará con
el modelo de proceso de Linux, cubierto en el capitulo 4. “Procesos."
Acerca del proyecto
Al final de esto libro se encuentra el código fuente completo ríe un programa
do base de datos p ara CD musicales, to talm en to operativo y funcional. El
mismo fue disertado con el ñn d« re u n ir en u n vínico proyecto muchas do las
técnicas que se aprenden en el libro, do modo que el lector pueda ver cuán
tos do estos tópico*, toles como el m anojo d e archivos, la salida a pantalla en
modo texto y la API de base de datos, encaj an entro ai y funcionan como un
todo coherente
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«
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
Lo que viene
Este capitulo le ha sum inistrado a l lector una breve introducción al proyecto
de program ación que en co n trará a i final de libro.
✓ S aáSgo fuerte o crtw tn sara a s a orcyeeto crogramacón. ¡unto con su uwto oxp:catM>. se
pjoOs «nexx^rar en ‘Pryjecío oe yr^arracán : una base Oo cacos da CD 'Jo rrusica'
E n tre este mom ento y aquel, sin em bargo, le queda al lector mucho terreno
por cu b rir La Sección II. "Program ación de sistem as” comienza con u n a n á
lisis de los procesos de Linux, seguido por u n capitulo sobre señales y su m a
nipulación. Poca 3 aplicaciones pueden o btener algún resultado significativo
sin te n e r que adm inistr a r procesos y m an ip u la r señales, de modo que dicho
m aterial constituye una buena b a se sobre la cual construir su s conocim ien
tos de la program ación en Linux.
4
Parte II
Programación de sistemas
4 . P ro c e s o s
5 . S e ñ a le s
6 . L la m a d a s a s is te m a
7 . A d m in is tr a c ió n b á s ic a d e a rc h iv o s e n Linux
8 . A d m in is t ra c ió n a v a n z a d a d e a rc h iv o s en Linux
9. Daem ons
............
Procesos
La com prensión del modelo de los procesos de Linux resu lta esencial p a ra
com prender ;a m ayor p a n e de su com portam iento a bajo nivel. La noción de
proceso subyace en la m ayoría de los derechos de acceso a archivos, las se ñ a
les y el control de tareas.
S ste capítulo cubro los siguientes tem as:
• Q ué es un proceso
• Inform ación do procesos
• IdantiCcadores de procesos
• Creación do procesos
• Supresión (kiU ing) do procesos
• M a n ip u la ció n d e procesos
Tbdos los program as de ente capitulo pueden ser encontrados en oí sitio Web
n t ? p : / / w i v r ^ c p . c c m / i n f o bajo el núm ero do ISBN 0789722151
/ / 'g v / j w J l h » x / s x h t d - ¿i
J.
Programación en Unux
Qué es un proceso
l'n proceso es u n a instenci¿_de l a ejecución de.uziprogram a y tam bién la
unidad básica de program ación del sistem a operativo. Un proceso se puede
i^ im iia rX u n program a en ejecución y consiste de los siguientes étam en
• El contexto del program a en curso, que es ol e sta tu s co m en to de ejecu
ción del program a.
• El directorio co m e n te de trabajo dol program a.
• Los archivos y directorios a los cuales tiene accoso el program a.
• Las credenciales o derechos do acceso del program a, tales como su mo
do de archivo y propiedad.
• La cantidad de memoria y otros recursos del sistem a dSjgnurion aJ proceso.
Los procosos jon tam bién la unidad bá3tcu do program ación do Linux. El
kcrnel utiliza procesos p ara controlar pj jjccotfv « ja CPU >’ a otros recursos
del sistem a LOS procesos en Linux d eterm in an qué program as correrán en
la CPU, por cuánto tiompo y con qué características. E l fijador de tiempos
del komul distribuye lo* tiempo- ejocuchui curgü d«.- la CPU, denom ina
dos cuotas, entro todos Ion procesos, apropiándose de coda uno de elloa. suce
sivam ente. cuando su cuota de tiompo expira.
Las cuota.-, de tiem po son lo suficientem ente peq u eras como p ara que, en un
sistem a que cuente con un solo procesador, dé la im presión do que vario!,
procesos 3e e stá n ejecutando sim u ltán eam en te. Cada proceso contiene ta m
bién lu .suficiente información sobre sí mismo como pora que el k em el pueda
activarlo y desactivarlo angún sea necesario.
Atributos de un proceso
lo s procesos tien en atributos o características que loa identificar, y definen
su conducta. El k em el tam bién g u a rd a in tern am en te una gran cantidad de
información acerca de cada proceso y contiene una interfaz o grupo de llam a
das a funciones que le perm ican obtener dicha información. Las secciones si
guientes an alizan qué es esa información y las interfaces que le perm iten al
k em el obtenerla y m anipularla.
Id e n t lf lc a d o re s d e p ro c e s o s
Los atributo s básicos de un proceso ann s u identificador o ID. abreviado PID,
■■ ■ ... ; : ;.o, PPID. F into el P tt) como d PPED
soñ_éñcéros"posihvo8 y disShtoscle cero. U n PID identifica a un proceso de
m anera univoca, y por lo tanto inequívoca. C uando un proceso crea un nue
vo proceso se dice que ha creado un proceso hijo. Recíprocamente, el proceso
que creó un proceso hijo se denom ina proceso padre.
Se puede tra z a r la ascendencia de todos los procesos h asta llegar, en últim a
instancia, ai proceso que r.ene el PID 1, que se denom ina proceso i n i t . El^
proceso m i t és él prim er pT5g£3ó q‘-íé Liene lugar después qu¿ arráp ^a f l
kem el. i n i t pone on runcionam iento el sistem a. comienza los d aem o n sy
ejecuta lúa program as que se ceban correr.
Capítulo Procesos 63
A unque los detalles específicos dei proceso d e arran q u e (booO de u n a com pu
tadora exceden el alcance de este iibro. es im p o rtan te recalcar que i n i t vie
ne a ;e r el padre de todos los dom as procesos.
Las funciones oue p e rc u te n que un proceso obtenga su PID y su PPID son
q e t s i J v a e t o s i d . E stán declarad a.- en el" archiv,: de éncaoezado de aísle-
nía < u n x s td .n > . y s u s prototipo» son.
0i3_t s*tai<J{void) ¡
OW_t a*:cc;3(oid);
g e t p i d re to m a el PID dul proceso que efectuó la llam ada, m isalra» que
$ e tp p Id ‘retorna el PPID de quien la llam ó, que vendría a sor el PID del pa-
d ro doi procedo que Hamo a getOÍCÍ
GPor qué razón necesita un proceso conocer su PID o el PID de su podre? Un
empleo común do un PID es crear arch iyoa.o.directorios quo sean único»
Luego de u n a llam ada a g e t p l d . por ejem plo, el proceso podría utilizar su
PID p ara crear un irehivo tem porar.o. O tra ta re a tipien es escribir el PID
en un archivo de registro de actividades de un program a, como p arte de un
m ensaje del mismo, p a ra dejar on claro quó proceso fue el que grabó el m en
saje del registro. L*n proceso puedo u tilira r »u PPID p ara enviar una seftal u
otro m ensaje a su proceso padre
»** E je m p lo
jiL’y Eate breve program a im prim e el PID y < P P I D del mismo:
/ • HOBCre <j»l ¿ r a g r a i j tr J n w r m •; 0<-Dt<Js.C • /
MHO
• i » p _ p r a c _ i a s .c la p .- is * « ; * !0 y «*■
¿tnciwat <ttcio.*>
tin e lo s * < vu ste .K >
tuieluet <¡z:liz.r»
p e ia tf { * ? 1 0 « W ' f , a * to ic (H ;
anatí("PFio • «tí-if*.*, getpdUOi:
-:.izLtr_-XCC€ÍS
NOTA
< u r»is td . «c ia ra mochas funeiofles que son sarte del estándar POSiX. Sucintamen»
te, P031X. que se deriva do Pcrrepiy Qpenar.iTg Svste/Ti Interface eXtertsicr.s. es una i ar
¡ia de -cr~\%s cue define 'os y ra p a -irta ^ - a provee? un sisteme oí-sr-s-
-■■o Ofjra Que se lo considero "conformé a POSIX". S>n enbargo, PÓSiX^defino solamente
e¡ estárdar inteffar'pero no nlrigunSTiPofsrrer.tación, Mtchss sistemas operativos
no-UNIX. ttfes corro el Windows NT de Microsoft, aducen conforrrar 3 POSIX.
0 acatamiento a POSIX os importante porque, a» menos en teoría, r-ace que las aplica-
cicí'es escritas para funcionar en un tipo de sistema sean sencillas oe transportar 3
ctro sistema. Al jtillzar a nterfaz POSIX estándar para obtener su 10. por 0;errpio. e<
crcgrama no tendría que ser roscrito p*'a correr en otro sistema. Er. cambio, e progra
ma eeoeria simplemente 3er recompiiado en el nuevo s-stema. Finalmente, dado cue
POSiX es un estanca' generalmente aceptado, muchas emoresas requieren ou» e< soft
ware que adquieren sea conforma a POSIX.
Id e n tif ic a c io n e s re a le s y e f e c tiv a s
Adpmáa rfy ans PlDs y sus PPtD s. cada proceso tiene varios otros a tn b u to s
de identificación, que so batan en la ta b la 4.1 ju n to a su tipo on el lenguaje
C y las funciono* que los retornan. P a ra u tiliz a r las funciones listad as en la
tercera columna de la tab la 4.1 so debe incluir en el código tonto <SyS/ t y •
p e s .h > como < u n i s td .h > * ■-------- —
TabJa 4 .1 . Atributos de procosos.
A trib u to T ip o F u n c ió n
10 do proceso p id _ t g e tp id ( v o id ) :
10 dopadre dn proceso p id _ t g e tp p id ( v o id ) ;
■Ddo usuario real uí<j_tg g e tu id ( v o id ) ;
10 do usuario afectivo u id _ l g e te u id (v o ld )¡
10 de grupo ro.V g id _ t g e tQ id (v o id );
10 do grupo ofectlvo g id _ t g w t o g id (v o id );
Cada proceso tiene tres IDs de usuario (LTIDs) y tres ID 3 do grupo GÍDs).
Los mismos son empleados principalm ente por razones de seguridad, tales
como asignar permisos de accesos a archivos y lim itar quién puede ejecutar
ciertos program as. El ID de usuario real y el ID de grupo real especifican
quién es el usuario concreto. Són leídos de / é t c / p assw d cuando uno ingresa
al íistem arC ónatituyt'n las representaciones num éricas del nom b red eacceso
y lá principal pertenencia a un grupo del usuariu que está ingresando.
Por ejemplo, en mi sistem o, mi U1D es 500, que corresponde a kw all, mi
nombre de acceso. Mi GID es 100, que corresponde ai grupo denom inado
usuarios. L is funciones g e t u í d y geteuid re to m a n el IÍID real y el efecti
vo, respectivam ente, del proceso desde el cual fueron llam adas. S im ilarm en
te, las funciones getgid y getegid retornan los GlDs efectivos del proceso
que efectuó la llam ada. Los IDs efectivos de u suario v grupo ann nriliaydna
-. -nte con pr j;:o-:tn.í de Seguridad "i': jjtt c r-
Capítulo 4: Procesos 65
E je m p lo s
i Utilizando las funciones listadas en la tabla 4.1, este programa muestra
los UIDs y GIDs reales y efectivos dái proceso
EJEMPLO >('>rcrj j e l en :nter''.eí’: i í s . c */
r
• • ¡ a c 't iii le s UICs y lo s GIOs
fiftClvít <JtCi3.*>
*ir-c:'»í5 <yr.i3*3.n»
#ixiv00 <>tál:0.ft>
ln t M in(vo¿« )
i
'ÍO ae usuario r « t i: v j \ o '. g « tg iá n ) ;
p r io t f {*£0 <14 usuario « fte tiv o : * }\n ‘ .
9« :« u io ());
0< -irtf(*:o Ct grupo r « í l : VJ\n*, g«Q*<3());
p r t r t * P I 0 *1j gruco « fa c íiv c : S c \ n \ go*ogid(|);
« litlfXST .SU CC ES Si;
)
La salida de este program a, en ei sistem a del autor, es la siguiente:
S ./IM nufttttortt
10 ¿ t UMéTiO r t» i : HO
10 Ce ¿luirle *f«?ivo: SW
s a lid * :o 2» gr„s« r e t í: 1 N
ÍO ¿9 q h ííc e f« c :iv o : !M
2. Como so hito notar antes, en circunstancias normales, loa UÍDn v GTDa rea
les y electivo; coinciden, y la salida del programa anterior ilustra eao. Para
confirmar que esto es verdaderamente asi, utilice ei comando su substituye
usar1para convertirse en otro usuario y luego ejecute el programa. Los UIDs y
EjeMPLO GIDs seguirán coincidiendo, como lo muestra el siguiente ejemplo:
. . f» 15 5U ¿B_:«CtQr
.*J@c Psss»aro:
••••• ^ $ 1C
SALIOA .n_Iaccar .;U -ia a (U lJ4 -i0 1 ) gi*0UC*=lWlU5uarÍ03>
j . / tte f ttif ic a e e r e i
Programación en Unux
P ro g r a m a s s e t u i d y s e t g i d
C om o s e co m en tó a n te rio rm e n te, u n a situ a c ió n en la cu al loa ID s r e a le s y
efectiv o s d e u n proceso d ifier en e n tr e s í tío n e lu g a r cum ulo el p rogram a que
ee ea tá ejecu ta n d o os s e t u i d o s e t g i d . L os p rogrom aa s e t u i d y s e t g i d
:e U flm a a a s í p orq u e •»! C ID y o l G lD roal y ofo ctivo q q o s e c s ta b ie c e fl s e ha-
c e a ig u a la s a i L'ID y G ID de! arch ivo e n lu g a r di- a ;<*. del p r o p ic ia r o . gi
c o n tra ejecu ta n d o ol p rogram a. El propc
p rogram as s e t u i d y s e t g i d e s otorgarlo p e r m iso s e s p e c ia le s al v isu a n o
q u e e s té ejecu ta n d o el program a.
Por ejem plo, co n sid erem o s el p rogram a p a s s w d , u tiliza d o para m odificar
c o n tr a se lla s <p a s sw n rd a ) La m ayoría d e los s is te m a s d e L in u x a lm a cen a n
la s c o n tr a se ñ a s e n / e t c / p a s s w d . E ste arch ivo p u ed e ser leíd o por to d o s los
u su a rio s pero escrito sólo por el u su a r io r a íz . S e p u ed e a p reciar esto con s u
m a cla rid ad cu an d o s e corre i S - i / e t c / p a s s w d , com o sigu e:
i i# 1 /otc/oass»o
r * . r - ^ r - i root bin 703 Aug l f l: « /«tc/passac
C om o resu lta d o , el program a p a s s w d d eb e se r p rop ied ad d el u su a rio root.
S in em b argo, com o p a ssw d d eb e poder s e r e jecu ta d o por c u a lq u ier u su a rio ,
e n co n d icio n es n o rm a les no p od ría a c tu a liz a r el a rch iv o / e t c / p a s s w d . La
so lu ció n a e s te d ilem a e s q u e p a s s w d s e a u n program a con s e t u i d r o o t ;
e s decir, quo cu an d o s e ejecu te, s u U ID e fe c tiv o s e a el U ID d e u su a rio root,
p erm itién d o le por lo ta n to a c tu a liz a r / e t c / p a s s w d .
NOTA
En reaüdao. 5 rrayona cc ¡es sistemas Unux m oocnos utilizar, contraseñas oe.itds
(sOacc* passworas), PC' 10 Que la contraseña se encuenda altnacenada en / e t c /
snadc-#. cuo puode ser ielaa y e$c.-'tí» sólo por les usuarios root. D campo correspon
diente a a contraseña en /a te.'p a ssw d e s is.etra x.
S Ls - i / u s r o ip /m s j » c
- r « s r -* r -x t root úir. 2<S'~ 1Í /usr/ainí0a$3v*d
D e m a n e ra sim ila r, u n program a con s e t g i d tie n e u n a s e n g n b it d e e je c u
c ió n p ara ei gru p o. P ara h a cer q u e u n p ro g ra m a su a con s e t u i d s e d eb erá
ejecu ta r e l s ig u ie n t e com ando:
y »¿_or--ari3
El siguiente comando hace que u n program a ¿ea s e t g i d :
_ 1 zn&yi 2*s ri^cirario
P R E C A U C IÓ N
tos cntrvrr-a ■s» nrr. cor a etuid o s e tg id ccftsvtuven riesgos pem lu seguridad
oorove. ayrtcv* -¡av *,©cv*.a2 >es <yy i m > M usuarios d«i común ce tos morrales. los
n\vno* soo contoos con ortvi*£>os de suoer.-s. arlos y oor lo tanto M W totol acceso
al n w m » ^-j^asr Kocce' 3 oarto Cei listema. Eje*?,» wtromo curiado cuan
do oj*c-.te o c--«« u r orifirama Oc root con s o tu id .
In f o rm a c ió n d e u s u a rio
A u n q u e la* co m p u ta d o ra s se d ese m p eñ a r, m u y b ien can los n ú m eros, toa a e
re* h u m an o* trab ajan m u ch o m ejor con n om b re* A fortu n ad am en U j. e x is te n
d o s m a n e r a s d e coQ verü r lo s C ID s en n om b ren lo#ilile.i p«rn los u su a rio s Lu
fu n c ió n 3 ® t i o g i r retorn a ol nom b re d e a c c e s o del u su a rio q u e e je c u ta un
proceso. C u a n d o u n o su m in istr a su n om b ra do a cceso , s e lo p u ed e p a sa r a la
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 •
¿ in d u c e <stdi:-.n>
¿ in c lu a s <s:<Jii0.h>
ü n c lu d c <3y3¿tyc23.ri>
/ t f < [ f w d í y
«inclutís
=:nclu 06 (¿pmi.t&f
in r *aln(v£id)
(
:nar *nor._3cce30.¡
s trjc t 53S5»d •auntecojé?'
l^ K o u n t o r o jJa t o * (jo:pon.vi{non_.jc¡:<na)) « n u lL ) {
p«rrorf*{¡« tp w n M i*);
4 *tt(Ex:T_FAlUüfl£);
e x I t <EXIT_SÜCC8SSJ;
/oor_ronorns
5 « i 0 5 in •'«orno kwa’ l
3«cos: Xurt wali
ÍA U O A
Las sentencias i f resguardan co n tra la posibilidad de que g e t l o g i n o
getpw nam retornen NULL. S: a lg u n a de las do 3 funciones reto rn ase NULL,
p e r-"o r im prim irá un m ensaje de erro r y el program n te rm in a rá . Prim ero,
el program a utiliza g e t l o g i n p a ra recuperar y exhibir el nom bre de acceso
del u suario que corro oí program a. Luego, u sa ese nombre p ara recu p erar el
- \ d sto de la contraserta y exhibo el nom bre completo del usuario (alm acenado
— en el campo GECQS de / e t c / p a s s wd: v e r man 5 p assw d p a ra a c e e o e rir
más información)
I
Capítulo 4: Procesos 69
In fo rm a c ió n a d ic io n a l s o b re p ro c e s o s
inform ación sobre los procesos, adem ás de sencillam ente los LDs
áe proceso, de usuario y de grupo, talcojB fljiu.u: iÁi^áóiLdeJúS-rtcursiü-«dul
r.stem a y la-? ripmpfts da p j^ n ciár.. S á le s e que he puesto tiempos do ejecu
ción y r.o solam ente tiempo. E sto se debe a que el.isem el dft í.im ix nim aruna
tres valores d isa n to s de tiem po j a r a ..los procesos, a saben
- -» • El tiempo n o rm d el que m ediría un cronóm etro1es el tiempo transcurrido.
• El tiem po de CPU de usuario es la can tid ad de tiempo que el procesa-
dóflnvíérte"éJecut5H3o~¿I código de modo usuario (no de kerncl).
_a • E l tiem po de CPU de sistema e s la can tid ad de tiempo in vertida en la
ejecución de código de Jtemel.
✓ _3 z'erene>-j «otra -ñoco usuaria y mo<Jo •a—*' se 9*¿»>ca en ‘ Qué es una llamada 3 siste
ma*. oa* 120.
El lector puede obtener esta información haciendo una llamada i tim e s o g e -
ocursos del prooesadofrstn emburro, puede ser obtenido so
lamente con una llam ada a g e tr u s a g e . Estos recunsrw tienen todo 3 que ver con
las estadísticas do acceso a memoria. E ¿ta sección comenta primero la obtención
de información referida a tiempos, y luvijo cubre la utilización de recursos.
C O N S E JO
¿Cu* 2 c « r t i » B am atí». « 4 ( C i n * s o l a d # $ f tr u a M e ,.5Í de&ertaemplear para
J . - - . . '. v . " - « ím hcrodaco . íuncic • ílidao lanío
09 8S0 » m o de SV*U UNIX, y aneóos cuentan cor amoas funtícoe*. POSlX. »i ostirv-
ai cuaJ Unut trata o* contornar, soto especifica tim e s . Sin embargo.
«tary-ytra a !ai y a {r y ? a < iy ti una daaenpaín m ía compteu» úe ’a utilización ríe ro
tunos por parta o« un oroc<nc7 ir'rtW b» « n E n ».eónca porquo UftuX (n partir do
su .*er»i«n 2.2.10: rrpíementa vüo c>nce de 'o » dieciseis recursos ceíinlúos on la os
uuetua r u t i g e Rnai/nanw a información -toere tiempos que retorna tim es es más
a*t*3*3a qua la ratomaoa per g e tr u s a g e . Oe modo cuo. st e< lector sólo '•■ecesitnse
•rJormaoPn soor* oampos o aseara acnonr st estándar POSlX. üeDcrd utilizar tla a s .
S< no ’- t preocupa mantener re coníormicatí con POSlX o ai "«coürtasa la nformne-ún
atítoon# provista por g e t r u s a g e . uonce«ata Ottlma.
TIEMPOS DE PROCESO y
La ru n c ió n ¿ti‘i e s 'i e encuentra p ro tatip ad a en < 3 y s / í i m e s . h > como so in
dica a continuación:
cioc>t_t tiM iís trjc t tas ’auflj
tim e s re to rn a el núm ero de tica de reloj que h ayan transcurrido desde quu
áTsStBHgraffAcca. lo q u e ta m b ié a conoce rom o tiempo de reloj, bu? es un
puntero a una e stru c tu ra (un espacio en m em oria o buffer) que responde al
p atró n t ~ s w e r pág in a 71) y que alm acena lo«5 tiempos del proceso en ejecu-
ciSaTf l o c í C t es el tipo d efv alo r reto m ad o .
E je m p lo
El siguiente program a utiliza la fu n d ó n sy s te m p a ra ejecu tar un comando
externo el proceso er. cuestión), y luego llam a a ti m e s p a ra o b ^ n e ria á R -
formación deseada.
f < ) J t ) I
70 Programación en Linux
In t MUifvoWl
/
1 * * 6 ° '
i ^ /
cloc*_t c o n u c o , fin a l, tics_lnsutildos;
'H 'i
s tr ic t tasrtic_conl#nzo, t lc .f ln a l;
V JU.
ce*i«m c • tiM s(Juc_co<»ienzoj;
/• £l prccoso o«t*rro lo constituyo on «sto c a í«'g r«p • GioDal Rojular
• c*pr«»sion P n n t; conando de UNIX para buwUr raemos do ditos o
• oat.-ofios do torno « p a c if ic o (on asto c»¿o ia oalübra ‘ ol* en un jrcntvo.
• la salida do gr#p jo rudirluu a f in do -'«vitar quo la aantalla ie atlttorre
c» datos /
•I _
i y it M < 'g r « p o l / u * r / d o c / * r > í'a * v / n u li, 2 > / a e v / n u l l 'l i
r i n a i - c in o s iA t ic | _ i, m # i) ;
t ic j .in s u B id o s f i n a l • com onzo
pu:s(*::aapos de proceso m jo * );
calcuIir_segtndos(*Vtuso ae CPU por usuario’ , tic_final.t*s_cutLne>;
cal:ular_s95undosi’ Vtuso de CP'J por sistema1, tic _ íir .a i. t«s_C 3tino);
íxit-:E xrr_S yC C E S S !;
)
»oio :alcular_sequndoa(eftar *caoena; do ck_t *ícs_nsuriaas)
{
r OOtMti* tíos d» roloj/sepunoo '/
long tissjxsr_»eg . sysconf< SC CLX TCKJ; -)
V
M
p rin tfC V s ; w .2 í segundas\n*, escena, (flo s t! tic s insumidos ,
:ics_3or_s35.;
i
Capítulo -5: Procesos 71
E n ax. sistem a, una corrida de p rueba del pro g ram a creó la siguiénte salida:
S u t U .r -c ir jc s '
Tíetofl «■¡Mttorf'MJo: »9.9i H íU ^ J
tisescí 3# p-OCíSO pedr»
usa ds CPU(Kr«icario: a.M s*5u*ao*
ljo se C*J ocf( i s t i a : 3.08 g u r í e s
2* :.-oc»50 lítjo
jío di CPU K - ¿i-jjrip: Z.3* seguraos
■jsc á* ZP'J pori m t u : t t« seguróos
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
♦^ c h i f l e « s y s /r s s o u '- c e .h »
# l “C lu d e <*:ii>9.h>
« in d u c e « i r i s t d .l p
■#a:d s 9 l l r _ s i _ e r r o r ( c n 3 r ♦ );
o l e c .i lc u l ,i- _ 5 « íu n d 0 3 i :h a r *. i s n g ) ;
w t « a if l( v o id )
(
s t r u c t r ^ a a - j * e c u r s o s _ u tl liM d 0 3 ;
/ • E i p r o c e s o * x ts r n o Id c o n s t i t u y e an e s t e c o so ©reo » G lo b a l R e c u la r
* f x p r c í s i o f l P r l n t ; co itard o de UNIX p a - a o u s c a r r a c i n o s d o d a to » o
* p a t r o n a l d a to x t o e « p e c i f i c o {en e s t o c a s a l a p a l a o r a 'e l * « n un a r c n tv d )
* La s a l i d a do g r* p se r i d i r i g f l a f i n d e e v i t a r quo lu a a n t a l l a t e a t i o o r r e
da d a tc a
•I
t y i '« n ( - g r « p o! / u i r / d o c / * / * > /d c v /n u i.L 2» / d o v / n u l l * ) ;
y 00t « r « r l a e s t r u c t u r a do r e c u r s o * p a r a e l p r o c e s o p a d ra • /
l f ( ( 0 0 ! r u s a ‘;a(frJS A 5c.S E L f, & re c u r-» o a _ u U lln C O s )) »■ 1}
s a l l r _ s l _ e r r o r {* g e : r u s a g e •>;
a -jts C T iiw p o o c e p ro c a s o p a d re * j¡
:a lc c l a r _ s a g u n a o s |* ',iC P u p o r u s u a r io * , r « c u r s o s _ u t i i i x a d o » . n j , u t : a e . tv _ » e c ) .
c a lc u la ^ s a g u n c o s rN tC fU p o r a m t u * , re c u rs o s _ u tiln a a o a .r u _ 5 tio e .;v _ s « ) ;
• 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
}
vais o icu lir_j40unoos(dur ’ cact^a. l<y<¡ valorjjotr'M oi
(
vaifl aalir_al_*rr«r(c tw
parrar icae**.»»;
•litiexir.rA itt* » ),
i
E ¿te p ro g ram a e je c u ta ol m u m o com ando g r e p que el anterior. S in om bnr-
go. a d e m á s do la inform ación sobro tiem pos, tam bién exhiba ol em pluo do
m i-m ona. ta n to del proevao p adre como «1 procedo hijo. U na corrida del m is
m o g e n eró la sig u ien te salida:
J ./ jtil_r*r^rM »2
'ita c c i » ; * « « 3 sacra (*- *esu*Jos)
CPu per usuario: »
CPU 90r tiltiu : •
a t t e U t i c u u f e n * t*'. src c e u ssür»
F ilia s s w í p í i ; t í
P a i l a s l a o o r t a n t r s : 65
?«f»utício^M se sabina: o
t ; m > c s ae p ro c e s o r*iJO (*r. sa;unao*}
Cí"J ?3r usuario: 2
&>J 5or i . t t w : 2
ñ tic litifu a* a e n o - i a a e i s r c e e s o p a d r a ; .
Fallas Mnor*s: 2S9S , < ' .f > '3/^
♦ji v i “»
F íi'.iJ 2ü>2
’srtiT ácicres Cí sagina: •
T ai como lo d eia a z claro la ¿ alid a de ¿*ca corr-da de m uestra. la inform ación
p . s q u e g e n e ra g e t r u s a g g .. gg orecáacom oila ;
p ó r m r e r . ATcambio. can~3 s t r u 5a g e s g j;b 3 § c ¿ j;s a ife a g p ,m u y jja r a -d o -la
u tiliza ció n o c m em o ria p o r p a rto d e u n proceso. De aecho. el nú m ero de ra
lla s Im p o rta n te s re v elad a s por la c o rrid a de prueba confirma ¡as a p re c ia d o '
76 Programación en Linux
nes anteriores acerca de !a can tid a d de E/S de disco que requiere el p rogra
ma. El proceso leyó desde el disco 21.412 veces porque los datos requeridos
no se encontraban en mem oria. No ocurrieron perm utaciones de páginas, sin
embargo.
S e s io n e s y g ru p o s d e p r o c e s o s
E xisten situaciones on las cuales.elsencillo modelo padxe/3ii;o.no-describe lo
suScienta Ja s reTacionesjentre procesos. Consideremos, por ejemplo, una
v en tan a x t s m abierta. Supongam os tam bién que se ejecutan en la x ts r.n
tro s comandos de UNTX/Linux de m an era individual: l s ‘sim ilar a d i r de
DOS), c a t (sim ilar a ty p e de DOS), y v i (un editor de texto). ¿C uál es el
proceso padre; la x te rm o la in terfa z que corro en la x ts rm ? O bviam ente,
los tres comandos están relacionados e n tre sí, pero no como pad re e hijo. En
cambio, son todos p arte de la m ism a sesión.
Otro ejemplo es el conjunto de comandos ejecutados en una pipeline, tal como por
ejemplo l s -1 ¡ s o r t ¡ more. De nuevo. esto3 comandos están relacionados
entre 5Í no como padre e hyo sino como miembros del mismo grupo de proceso®
La figura 4-1 ilustra las relaciones entre procesos, sesiones y grupos de procesos.
G rupos oe procesos
U.n grupo de procesos «ls un.conjunto de procesos relarionndos, generalm ente
u n a »ccuencia de comandos en u n a pipeline. Todos los procesos incluidos en un
grupo de procesos tienen el mismo ID de grupo de proceso, o sea el PGTD EÍ
propósito dé un grupo de p r ice . , f.u- ¡ as. Suponga-
mos, por ejemplo, que el lector c ó m e s e la pipeline (secuencia"de pipes) de co
mandos l s -1 / u s r / i n c l u d e ¡ S O rt | WC • 1. Si, m ientras esa pipeline
está aún en ejecución, uno la aborta (utilizando Ctrl+C), la interfaz debe poder
term in ar todos los procesos. Esa acción la lleva a cobo abortando directam ente
el grupo de procesos en lugar de hacerlo con cada proceso individual
S esio n e s
LTna sesión consiste de uno o m á s grupos de proces<a,.U n líder de sesión es
- .. ....... juc croa la sesión É sta tiene un tínico idcntificadotT, a S S S S é n
ÍD de sesióiL.el cual es m eram en te el PID del líd er da sesión L as sesiones
cum plen el mismo propósito p a ra los grupos de procesos'uue estos últim os
p ara los procesos individuales.
/ / / / . / / y / / / / / / ¿ * s j .i
Capítulo 4: Procesos 77
f
Digamos que si lector ejecutase el m ism o comando de pipeline mencionado re
cién os decir, i s - i / u s r / i n c l u d e ¡ s o r t ; wc - I &'j en segundo plano
y ejecutara otros comandos en prim er plano. Ahora, si estos comandos se estu-
v i» e n corriendo en u n a term inal X Window y se cerrase la v e n tan a del term i
nal m ientras las mismas estuviesen aún corriendo, el k e rre l le en viaría una
señal al proceso que tiene a su cargo el control (el líder de sesión), el cual a su
'■ez m ata a cada grupo de proceso como se lo describió en el parágrafo anterior
La m anipulación ce grupos de procesos y de sesiones es un tem a a v a d a d o
que ?e en cu en tra fuera del alcance d e este libro. R esulta im portante, sin em
bargo. com prender los conceptos y La term inología em pleados porque los
mism os tien en im portantes repercusiones p ara las señales, que se cubren
en el capítulo 5. •Señales."
Manipulación de procesos
E ste punto an aliza la creación de procesos nuevos, la eliminación (k illin g ) de
procesos ex isten tes y la espera y supervisión de procesos Las llam adas
s y s te m , f o rk y e x e c crean nuevo*? procesos, p a ra liquidar otros procesos
V« puede em plear la tu n c ió rfK llT 'm a ta r), y un proceso pueda ya een e x i t
'*alir\ o a d o r : (aforta^T para proceder a liq u id arse a sí mismo. Lhb p rácti
cas recom endadas de d(lm inÍ3tradón de recurso.1 requieren que lo» procísoa
padres aguarden h a sta que term in e n sus hijos E ate requerim iento es imple-
m entado por las diversas funciones w a it.
C r e a c ió n d e p ro c e s o s
Loe program adores necesitan a m enudo cre a r nuevos proceso» desde den tro
de mu* program as. Por ejemplo, aupongaraos que usted ere as o un program a
que adm in istre u n a base de dato s d e títulos de CD-ROMs. En lugar do ten er
que cre ar su propia ru tin a de ordenam iento, proferirlu que ol trabajo lo re a
lizara el program a s o r t . Linux ofrece tres m aneras de lograr eato. La lla
m ada a s y s t e » , provista por la biblioteca C estándar, os uno de los métodos.
Las llam adas a f o r k y e x e c , sin em bargo, constituyon el “estilo Linux". Es
ta sección analiza las tres llam adas.
u t il iz a c ió n d e s y s te m
La función sy s te c i ejecuta un com ando de interfaz que se le tran sfiere. Su
prototipo, declarado en < s t d i i o . h > , es
ir» iyíiwico**: snü- Mtrtrtg);
s y s t e s ejecuta el comando de in terfa z s t n n g transfiriéndoselo a / b i n / s f i
y retornando después de h ab er term in ad o de ejecutarse dicho comando.
Ejemplos an terio res ya h an dem ostrado el uso de la mism a. Si, por alguna
razón, s y s te m no lo ^ ara-in v o car / 5 i n / $ h , reto m a d eedigü l2 7 . Si ocu-
rrie ra éa~egmbio a l g d ^ t r o dpo ~ ?e^ffor, system ~re to m a ría -1. E l valor ñor-
ífiál dé re to rñ o ^ e s y s 1 5ir.”es“etcoargo'de salííá'derco'iñándo"transferido en
s t r i n g Si s t r i n g fuese NIJLL, s y s t e n re to m a ría 0 si / o i n / s h se encon
trase disponible o u n valor distinto de cero en caso contrario.
Programación en Linux
EMPLEO DE f O r k
La llam ad a a f o r k crea un proceso nuevo. E ste proceso nuevo, o proceso h i
jo. será u n a copia d e l proceso que efectuó la llam ada, o proceso padre. La
función f o r k está declarada en < u n i s t( J . h> y su sintaxis es
p ia _ t ro r* < v o ld );
Si la llam ada tiene éxito, f or_k.retorna ol PID dol proceso hijo a l proceso pa-
dre. y reto rn a Q_ai proceso hijo. Esto significa que a ú n si uno llam a ra a f o r k
una sola vez, la m ism a re to m a dos vece».
El nuevo proceso que crea f o rx es una copia exacta del proceso p ad re, ;.-x-
cepto por su PID y su PPID, f o r k realiza u n a copia'complet.a del proceso p a
dre, incluyendo los UIDs y GlDs reales y efectivos y los IDs de grupo de pro
coso y de sesión, ol encorno, los lím ites de los recursos, archivos abiertos y
segmentos do mem oria com partida,
Lus diferencian e n tre lu.s prucusos padre o hijo son escasas. El proceso hijo
no horeda la¿ alarm an program adas en ol proceso padre (efectuados m edian
te una llam ada u a la rm ), loa bloqueas do archivos creado» por el proceso pa
dre y lúa nertales pondiontos. El concepto clavo quo debí* sor comprendido e*.
que f o r k croa un nuevo proceso que es un duplicado exacto del proceso p a
dres, a excepción de lo indicado.
E je m p lo
£1 que sigue es un ejemplo sencillo dclom pjeo de fo rk ;
«onora <Jel ororjriaa en In x trn tt: c tu id .c ’ /•
V V
e it M i* v o
/•
• l i j o . c - Ejtplto s e n c illo tln ro rk
i n t naia<voi<i)
<
p ie _ t c fliiú ;
í
wi*iix"_succ€ss):
}
La salid a de este program a s e r l sim ilar a la siguiente
Como se puede apreciar a p a rtir de la salid a, el PPID del proo ; ,10 hijo (el ID
del proceso padre) es ol m am o quo el PID dol padre. 1149. La aalida tum-
bién ilustra una cuestión critica referente n la utilización de fo rk : no so
puede prederir i i un proceso padre se ejecuta r á a n te s o después de ¿u hijo.
E sto puede inferirse a p a rtir de la ex trañ a apariencia de la sulida. La prime
ra linea de dicha ¿alida proviene del proceso padre, laa lineas desde lu se
gunda h a s ta la cu arta provienen del proceso hijo, y la q u in ta y sexta líneas
provienen nuevam ente del proceso padre. E l program a ae h a ojecutado fuera
de secuencia; es deo r, asincrónicamente.
La n a tu raleza asincrona de la conducta de f o r k significa que no se debería
e*ecutar código perteneciente ol proceso hijo que dependa de la ejecución de
código del proceso padre, n: viceversa. H acerlo así crea potencialm ento una
condición de com petencia (race condilion), que tiene lugar cuando varios
procesos quieren u tilizar u n recurso com partido pero dicha acción dependa
del orden en el cual se ejecutan los m ism os Las condiciones de competencia
pueden ser difíciles de localizar porque el código que las crea funciona 'la
m ayor p a rte del tiem po.' R esulta di£cü p red ecir los resultados que arrojará
u n a condición de competencia, pero sus sín to m as pueden incluir el compor
tam iento im predecible del program a, u n a p a re n te congelamiento del siste
m a. resp u esta len ta de- un sistem a por lo d em ás poco cargado, o directamen
te la caída del sistam a.
LTn a llam ada 3 f o r k puede fra ca sa r porque h a y demasiados, procesos cn-
rrien d o en ese m cmsr.tó en el siste m a o porque ei proceso que tr a ta de gene
ra r procesos descendientes h a excedido e'. núm ero de procesos que está per
mitido ejecutar. Si ia llam ad a fracasa, f o r k retorna -1 al proceso padre y no
crea n ingún proceso hijo.
/ / / y / i > J ) / ) } ) ) ) ) ) ) ) ) )
' 80 Programación en Linux
N O TA
0 proceso de efectuar un f o r k involucra el copiado c e tc c a le imagen cíe memoria del
¡xo c eso p=¿-5 a proceso hijo. Este e s un proceso lento por n a t u r i o , de -vo tó o . e e s
diseñ adores de -NIX crearon la llam ada v f c r k . E sta a r r a ^ ta ~ E c*oa un a c c e s o
nuevo. pero re efectúa una copia dol proceso padre, en su :u g a\ h asta 3 u e s e i =~>= a
e x e c o e x i t . c¡ m ovo proceso corro c r e- e s p a c o c e a r e o á o n e s cei y o c e s o p»dre. s.
accede a ig jn a po ro ór c e la memoria ocupado oor e ste -ifcmo. tfeh a po-c-.Oc ce m em ora
o s copiada ai proceso hijo. Esta c a r a c te r ís r o s e denomina copiado durante escritura.
La 'zxc'y furüsamental de la existencia de v f o r k e s acelerar 13 c r t a c ón, de p ro ce se s
'u e v e s . A dem ás, v f o r k p o se e la característica adicional de garantizar que el p roceso
^■jo s o ciocute antes que el p roceso padre, por ¡o tanto e ¡¡m ra r& > 18 posibilidad de
ana condición d e com petencia. Bajo Linux, sin em bargo, v f o r k e s sim plem ente una
envoltura en tom o d e f o r k , poroue lir.ux siem pre ha utilizado el rreca-.ism o do copia
do durante escritura. La f o r k tíe Unux. por lo tonto, e s tsn repica com o la vfork de
UNIX a. cero en cambio 'a v f o r k de Linux, com o e s sim plem ente un alias de f o r k . no
puedo garant'zar c t e e l proceso hijo s e eiecutsrfl jn t e s c - e e- y o c t s o padre
UT1UZACIÓN OE exec
I-i función e x e c e3 en realidad unu íam üia-de seis funciones, en la que cada
uña do las cuales exliibecbnvoncioneg de llam ada y emplco3 levem ente dife
rentes. A p esar de la m ultiplicidad de funciones, las mi3tnas son conocidas
convencionalm ente en bloque como "la fruición e x e c ”. Lo misino qu£ f orK.
e x e c está declarada en < u n i s t d . n > . Los prototipos son los siguientes:
m t e*ocl|con»t cnar *path, conat char *arg,
Í
;nt e*eclo<con3t char
ln : o*od«(coi»8t char
• rile ,
*pa:h,
const char *arg, . . . j ¡
#¿.TCluCt «anista.fi» ^
linCigO# <sttflib.h>
•m ciüCf < stdio.n»
int *ain(<oi3]
{
a*ir 's r j s l ] * { ‘ Ibuillt* , VAL>;
w rrari'tAícve*);
•xlC(EKTFAIURS) t
>
putlfDo íe c « ru u j q u t *);
«*í:(ct :t_5>jccc$S);
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;
T 'v w E je m p lo
l'J 1 [ i / £1 sig u ie n te p ro g ra m a i lu s tr a e l com sortaipÑ iH ta de g e t e n v :
¿Ü* * kzecr* ;c ' orog-';n= Sn testeffv.c ■/ V
E-------
lEMPwO , . '
m t M ir iw id l
<
cn»r v ir u D l* - 5».«*-tarr.oi| * {’ tlIJWTA «
/ u*va r i o/ i « 4 1/ *lg vs ¡i_J a Üc »c ion / • j «ct, t j D1«1};
if!eu:«nv(v*r:a6I*_3«_*nwma)>
e u u {* 0u t«M fallo*
c lu
put>(*pat#nv tuvo « u t a * );
i'.'5ete^vCtf!_WTA*))
prlfltf( 'MI_WTA«\s vn*. jeter.v {•UIJV T K ' ) | ¡
«1»
$vt*('u:_fiUTA iLn a j l j n i r ’ J;
lftSetW^SU.flUTA'JI
print*: *Su_afTA=*rt \ n \ jscer.v{•SUJUT**));
H it
PVC3( ‘ SU_SUTA lifi 2 J i g . W ) ;
e x i t (£ x :T _ a x C c S S :;
>
La ejecución dei programa produce la siguiente salida:
s ./corcn»»oi_5'uom c
eo:e-'.v ru-.c i*¿:o
HIJW7A • ’tis ü srio /ic « l ilou-^ipU M C lon, sjacu tab lí
salid * Sj_ í U^¿ í -.^ ¿signa*
Programación en Linux
E s p e ra s e n p ro c e s o s
Luego que uno g en era {m ediante ^ o rk ) o ejecuta (utilizando e x e c ) u n proce*
so nuevo. eTprñcesó'ná'dre debe a g u a rd a r pa ra que éste finalice a fin de reco
ger su conHTaon deT alid a y e v ita r la creación de zorabie?. Igual que con
e x e c , uno dispone de una v a ried ad de funciones p ara poder utilizar. P a ra
ev itar g en erar u n a total confusión, sin embargo, esta sección se concentra
sólo en la s funciones w a i t y w a i t p i d .
¿Qué es u n zombie? ü n p ro c e s o z or.& .ea..un proceso-huio- s u o - ^ n a m a
sin que su proceso pa^rg_¿ispqngajecoger. Ja-CGndiáón.de-sai¿da_del m ismo
con wa t t o w i i t p i d . Un proceso p ad re recoge la condición de salid a de un
proceso hijo utilizando una de la s funciones w a it a fin do rec u p erar la con
dición de salid a desde la ta b la de procesos del kem el. Este tipo de proceso se
denom ina zornbio porque o stá efectivam ente m uerto pero sigue todavía p re
sen te on la cabla de procesos. El proceso hijo h a term inado, han sido libera
dos la m em oria y dem ás r e c u lo s asignados al mismo, pero aun ocupa u n lu
gar en la tab la de procesos del kern el. El kem el alm acena la condición de
salida del proceso hijo h a sta que el proceso padre la retire de allí
Tener uno o dos zombics no re p re se n ta un problema, pero si un program a eje
cuta constan tóm ente comandos f o r k y e x ec no recoge sus condicione* de sa
lida. la tab la do procesos ovontualm ento se llena, lo que deteriora el desem
peño y obliga a volver a a rra n c a r ol sistem a, lo que obviam ente no ea una
situación desoablo en un entorno do producción con requerim ientos cntico3.
U n proceso huérfano, por o ira Ja d o . ea. u n proceso hiio.cuyo padre larm inu
a n te s (te 11 ' > : * o w a i t o l d E n e ste caso el proceso i n i t asu m ejsl
papol del p ad re Bel proceso hijo y recoge su cóftdíClún do salida, evitando cr
eo na ecueñciu Tu aparición do ¿omblos
P ara recoger la condición de sa lid a de un proceso hyo se deber efectuar una
llam ada a w a it o a w a i t p i d . P a ra ellos se debe incluir los archivos de e n
cabezado < s y s / t y p e s . h> y < s y s / w a i t . h>. Los prototipos do os ta s funcio
nes son los siguientes:
pid_í waittlnt ‘status);
p:c_t pid, líit ‘ita tu s, Lnt optiona).
El p a rá m e tra s t a t u s alm acena la condición de salida del proceso hijo, p id
es la PID del proceso pos el cual se q u iere aguardar. La mism a puede adop
ta r uno de cuatro valores, listados en la tab la 4.3.
Capí-.ulo 4: Procesos 85
o p tjjsa^ esp ecifica cómo se deberá com portar la llam ada a w a i í . Puede ser •
iWCHA'íQ . que hace que waitpid retorne inm ediatam ente si ningún proceso hi-
¿o'ES^érrninado. MJNTRACED, qu* significa que deberá reto rn ar la condición de
ios procescs hijos cuyo estatus no h a sido informado, o se puede efectuar con
ambos parám etros un 0 lógico p a ra obtener ambas conducías al mismo tiempo
es decir, poner iVSOHANG ; ! MJNTRACEO como argum ento de o p tio n s ) .
E je m p lo
El program a a g u a rd a re ilu stra $1 u so de ’A T tiíp ic .
/• d«I yrcsn m er, Irrterní^: r t l t e r . c • / y
CJCMPUO
* JOwnwr.c - twiso 39rctiio ce w lt
•/
«3yi-'ty5«s.h>
*mciuo«
•ircivrt* <*tCia.n>
• t-'C lüS* « S tc its .f» »
lBt ciin(voiC )
(
o is .t m : o;
in t cocdicioc;
• fsricO ) » I) (
p « r ro r(, ío rí(, >;
♦*it|£x:T_fAIUB6);
> tii* i#(nijo •• •) (
puM(‘ £n ¡KOCtM rujo:*);
í r í n r f ; ' \ t p K J a* e ro c * » o m j e • s c \ r t \ g * tp i O ( U ;
s r i - i r f : * t e o u t . M :p p tp ■!« p r o c e s o r u j o * \ d \ n * , g e t p p i u n i ;
}
tiL:(Ei:T_9XC£SSi;
X -
*coiv3lci6rt, 0J¡T 1
lA
C~
J. . r
r-c
y-tx' •
E lim in a c ió n ( k l l l l n g ) d e p ro c e s o s
Un proceso puede term in ar por una do cinco razones
• Su fu u aó n m am llam a a r e t u r n
• Llam a a ex í t
v/ • Llam a a _ e x it
• Llam a a a b o r t
• Ea finalizado por u n a señal.
Las prim eras tres razones constituyen term inaciones norm ales, y las doa ú l
tim as term inaciones anorm ales. Independientem ente de por qué r¿ 2 Ón fina
liza un proceso, sin embargo, se ejecuta finalm ente el miamo código de ker-
nel, que cierra archivos abiertos, libera recursos de mem oria y lleva a cabo
cualquier o tra ta rea de lim pieza que sea requerida. Como este libro supone
que sus lectores poseen conocimientos de C, consideramos que la función
r e r u r n no necesita de m ayores explicaciones.
LAS FUNCIONES 6 X Í t
Ya se ha \n 3 t 0 u tilizar la función e x i t (salida), que es p arte de la biblioteca
e stán d a r de C, en diversos program as a lo largo de este capitulo. E n lu g ar
de su m in istrar otro ejemplo, listarem os su prototipo, ta l como está declarado
en < s t d l i b . h > :
Lnt e x it{in t statu s);
utiuzación de a b o rt
U tilice la función a b o r t si se ve en la necesidad de te rm in a r un program a
anorm alm ente. Bajo Linux. a D o rt tiene el efecto adicional de hacer que un
program a vuelque la mem oria, que la m ayoría de los depuradores u tilizan
pora an alizar el estado de un program a cuando 4»te so bloqueó. Aunque pro
cede a c e rra r todos lo» archivos abiertos, a b o r t es u n a llam ada “d u ra" y d e
bería :-er em pleada silo como últim o recurso, ta l como por ejemplo, cuando
el program a encuentra que no eatú en condiciones de adm inistrar, como u n a
aguda falta de memoria, a b o r t es tam bién u n a función incluida en la biblio
teca e stá n d a r ‘declarada en < s td ll b .h > ) . S u prototipo os:
voia iscrtívoKJ};
E je m p lo
El siguiente program a m uestra el com portam iento de la función a b o r t
¿¡D * Hctizn á»l jr jjfiM «o in tí^ K f abort.c ^
CiCMfLO f
• iw t ir .c • > a -,«s :fa l i ü t t M i i u i : « o a iSort
•1
•nt ati-nhoiSl
<
itxjrto;
’i t K r
'• • •' ^ Observe que su sistem a tal vez no genere o n vuelco de memoria (core
sabida dum p). Si no lo hiciera, utilice el comando de interfaz u l i r a i t cal como se
m uestra en ia nueva c o m d a siguiente. E l archivo donde se vuelca la memo
ria re sa lta útil cuando se depura un program a.
S '. li a i t -c u r.llairrí:
S ./«Sort
^ÍCPtSlj (CSM C 'JC rC)
/ / j y j. j f y .1 / ,/ \ / f i r ) \ i
8S Programación en Linux
✓Para mayor información sobro «íepuración con un archivo ce vofcaco i* -gmorta. ve' ‘ Ini
cio 3é gdb.* pfitfna •123.
EMPLEO DE LA FUNCIÓN k í l l
Los dos parágrafos anteriores se concentraron en la m anera en que u n pro
ceso puede elim inarse a si mÍ3mo. ¿Cómo, entonces, puede un proceso d ar
término a otro? U tilizando la función k i l l , cuyo prototipo es el que sigue
íp.t k iiilítc _ : pie, in: slgj;
Para utilizarla, ei lector deberá incluir en el código fuente de su program a ta n
to < s y s /ty p e s .h > como < s ig n a l.h > . El parám etro pidespecifica el proceso
que *e desea elim inar y sig es la señal que se desea enviar para ello. Como es
ta parte cubro la eliminación de un proceso, y no tra ta sobre señales, la única
señal que consideraremos por el momento es SIGKILL Ei capitulo 5 am plía el
tratam iento de las señales. Por ahora, sólo dé lo siguiente por cierto.
E je m p lo
Este programa m uestra cómo elim inar un proceso
¡ ' so o a r* a e l prograna «n [n t * r n o t : k ille-.c ’t
íin c tu c # « l i d i o . í »
Wt «am lvcld)
<
Bid_: h ijo;
Wt sondician, valarrarornaao;
if in ijo = C¡ <
/• Sajarlo inactivo lo suricienw cano para pa-aer ei-uunario *
3iee3<’ a<l0};
S*IX{EXIT_SUCC£SS|;
> *Ui í
r U t i U n r ftNOHANG w a nacer retornar a wait ínrediatajrsnta •/
; i ) t j ) ) i ) i ) )
Caoituio 4: Procesos 89
i - ( i » a i t p i ú ( n i j o . iCOrtCiCion, WOHAWQ)) — S) {
•alo '.-ííc '-'a jc = ^iU.;r.:io, SiOCiLl);
l* {v*l5r_r »:««**«) { // ~ ~ ~~ 1—
* M i l f r s c a s o , :a =odc ;u e « sp er-jr qu« <¡í p roceso r u ó f i n a l i c e
•i
puts(*iull fracasc\n*];
p « rro r|* « iir);
«aitpidí^ijo, toxxücaon, a);
) flií ^ &
5 " i n t f | 'V í i l i a i r a d o V r * , h l J o | ¡
>
\
**tt(Exir_SüCCtssj:
>
La salida de este program a d eb ería ser sim ilar a la siguiente:
S . / • l i a i n a r _ ? c >OCMO
*5T1 « liR ln rto
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
decida ignorarla. La m anera en que ur. procesó responde a una señal se deno
m ina disposición de la señai. Un proceso puede altcrnacr-.-arr.ente p asar por al
to una señal, perm itir que tenga lugar su acción predeterm inada, o m anipular
la, donde esto último significa ejecutar, en resp u esta a la misma, un trozo de
código personalizado. U na señal bloqueada tam bién es considerada pendiente.
Un conjunto de señales os un tipo de datos de C. s i g s e t _ t , definido en
< s i g n a i .n > . que es capaz de re p resen tar m últiples señales. Finalm ente, la
máscara de teñóles de u n proceso es el con;unto de señales cuya en treg a al
mismo tiene bloqueado en un momento dado.
Una y otra vez zo IccrA on este libro que Linux, aunque haya sido diseñado siguien
do los especificaciones POSLX. ha incorporado liberal mente características de las
<J« r a c í í principales de su antecesora, los LTNDC de AT&T y BSD. Esta herencia
se hace evidente en las señales Lo que ocurro es que tanto en el UNIX do AT&T
coa» en el de BSD m ha adobado también u n a API de « ñ a l compatible con PO-
SCC de medo que las diíenencas entre ambas A PI no resultan demasiado significa
tiva» i siempre y cuando todo el mundo esenba su código para la API compatible
« a POSIX. por supuesto). A continuación mostramos, luego de un rápido repodo
del desarrollo de la API do señal, como enviar, interceptar y mompulur señalas.
H is to r ia d o la s s e ñ a le s
Las señales h an sido parte de UNIX casi d«sde el principio, pero a los creadores
del UNIX les requirió no obstante un p ar de intentos lograr hacerlas funcionar
correctamente. Sin en trar a considerar de lleno todos los detalles intrincados de
su desarrollo, con la apancuin de las prim eras iraplcmentaciones de señales
surgieron tros problema.» pr.ncipales. El prim er problema fue que los m anipula
dores de señal tenían que volver a ser instalados cada ve.’, que su los utilizaba,
lo que daba lugar a una posible (o probable^ condición de competencia. Si se en
tregaba una segunda señal m ientras la p rim era estaba siendo manipulada, y
ante? de que se pudiese volver a instalar el m anipulador de señales, o bien esta
íegunda señal se perd-.a u, oltéraativamunUr. ei proceso perm itía que tuviera lu
gar la acción original de la señal, sin ningún procesamiento.
El segundo problema ocurrido con las im piem entaciones iniciales de las' se ñ a
les rúe que éstas no proveían una m anera sencilla de suspender tem poraria
m ente un proceso h a sta que arribase una SéáaL Como resultado, podía darse
e! caso de que se entregase una seña: a un proceso y éste no cayese en cuenta
de su arribo. Finalm ente, las llamadas ai sistem a no se remiciaban au to m áti
cam ente cuando eran interrum pidas por u n a señal. En consecuencia, se im
ponía u n a enorme carga sobre los program adores Después de cada llam ada al
sistem a, éstos ten ían que verificar la variable errno y reem itir dicha llam ada
si el valor obtenido p a ra e r r n o m era EINTR. Las implementaciones de señ a
les que adolecen de estos defectos se denom inan señales no confiables.
La API de seña íes POSIX que cubre este capítulo es considerada confiable
perqué h a subsanado e stas limitaciones. Bajo POSIX, los m anipuladores de
señal perm anecen instalados, evitándose a s í la condición de com petencia y
sus consecuencias posteriores. C iertas llam ad as a', sistem a se reinician a u to
m áticam ente, aliviando asi la tarea del program ador, y POSDC tam bién pro-
/ , > ( t / i I 7 ' > f ) ) » •' 1 ' 1
96 Programación en Unux
C apítulo 5: S e ñ 3 le s 97
Corao se puedo ver a p a rtir de la tabla 5.1. las señales que Linux reconoce
son una mezcolanza de señales dorivadas do BSD, do Sistem a V o de AT&T
y. por supuesto, de POSIX. Varias de los señales listadas, sin embargo, in-
cluyundo SIGEMT. SIGCLD. SIGINFO y SIGLOST. no e stá n im plem entadas
(¡por lo que ol hecho de que no obBtanto so en cuentren docum entadas on la
página 7 (señales) dol m anual constituyo un misterio!). Los siguientes pA-
rrafbs tra ta n la m ayoría de oatas señales m ás dctxdlurinmonto.
SíGABRT es generada por la función abort que se comento en ol capítulo 4.
SIGALRM y SIGVTALRM se generan cuando los tem porizadoros ífirocrs) confi
gurados utilizando loa Uamadun a la rm y s e t i t i m o r . respectivam ente, las
disparan. Lu llam ada alarm se comenta m ás ad ela n te en esto mismo c ap itu
lo en !a part« "Establecim iento de una a larm a.” SIGBUS do hecho no tiene
lu g sr en los sistema.-* Linux; cuando un proceso tra tu de utilizar una memo
ria desalineada. el kem el, en lugar do g en erar SIGBUS, repara él mismo el
problem a de íiineación y luego continúa. SIGCHLD se envío a un procoso pa
dre cuando uno de sus procosos hijos term in a o se detiene, lo que perm ite al
padre llam ar a una de laa funciones w oit p a ra obtener el estado de salida.
v' u » funciones w s it so qjolican rtotaltóaamento on ‘ Esperas on procesos*, pagina 84.
SIGMUP tiene lugar cuando termina un líder de sesión o cuando se cierra una ter
minal de control. SIGFPE se envía cuando ocurre cualquier excepción aritmética,
tal como o<.*-r?!ows (desbordes), un/lcrflows (desbordes por la derecha) o divisiones
por cero. SIGILL es generada por otra oxcepción de hardware, la ejecución de un
comando ilegal. SIGINT hace quo todos los procesos presentes en el grupo de pro
cesos que está ejecutándose en primer plano terminen porque el usuario generó
una interrupción desde el teclado, generalmente ripeando Ctrl+C.
SIGGUIT. de m anera aimiiar. se genera cuando se ti pea desde el teclado el ca
rácter de salida, generalm ente C trl+ \. O tra señal generada desde el teclado.
C tri-Z , genera SIGTS7P. Las funciones SIGKILL y SIGTERM son generadas
por !a función k i l l . Obsérvese que SIGKILL no puede ser interceptada ni ig
norada; esta configuración perm ite disponer al superusuario de un método no
ambiguo para m a tar un proceso que no se esté comportando adecuadam ente.
SIGSTOP detiene cualquier proceso y. lo mismo que SIGKILL, no puede ser
interceptada ni ignorada. Sin embargo, a diferencia de SIGKILL, SIGSTOP
m eram ente detiene un proceso que se esté ejecutando. La ejecución del m is
mo puede continuarse enviándole SIGCONT. Lam entablem ente, no existe a l
go así como SIGRESURRGCT p a ra los procesos eliminados. SIGTTIN y SIGT -
TOU tienen lugar cuando un proceso que se e sta ejecutando en segundo
piano in te n ta obtener en tra d a desde su tennina'í de control o escribir a la
m ism a. C uando u n a v en tan a de term inal cam bia de tam año, todos ios proce
Capitulo 5: Señales 99
sos que se e stá n ejecutando on prim er plano reciben la señal 3IGWINCH. Las
señales SIGUSfi 1 y SIGUSR2 están reservadaa p ara uso particular de cada
proceso SIGXCPU y SIGXFS, finalm ente, se gen eran cuando un proceso se
excede de su tiem po asignado de CPU o de su máximo tam año permitido de
orciuvos. respectivam ente.
Envío de señales
Deaie_un program a, existen dos m anaras de e n v ia r u n a aeñal a un proceso
en ejecución utilizando el comando k i l l ( k i l l ( l ) j o emplgar.30 la función
El comando k i l l es er. realidad una interfaz de usuario hacia la
función k i l l .
✓ P a ra s « * r o r w ra G n c r v c ó n - « i l i a c a <S« 'a íuncttfn H i ü , v*r *Élm ir.aoón do
sxoc*4Gt\ OM- 86
E m p le o d e l c o m a n d o k i l l
P ara poder u tiliz ar ol comando k i l l e n un program a, so debe llam ar a un.i
de estas tres funciones: syste.-n. f o r k o ex ec Como se ha visto en ol cap ítu
lo anterior, las llam adas a s y s t e n o a fo r k g en eran un nuevo proceso que
tend rá a su cargo la ejecución de K i l l . m ien tras que «xcc reemplaza al pro
ceso que efectuó la llam ada antes de ejecutar k i l i . El resultado, su i em bar
go. es el mismo: el proceso correspondiente q u ed a terminado.
E je m p lo
E ste ejemplo prim ero g en era un nuevo proceso que no hace otra cosa que
perm anecer inactivo Luego una llam ada a exec elim ina el proceso hijo antes
de que el program a finalice
/ • v » n r * s e l {¡r c $ rir.a sn [->:«rr.et: o f c l l i.c V
•--------------
• íI ia ir a .- _ e r o » 4 C .c - i t u l i r s e r a e c io da « j- l lll )
inr asm<voi5)
{
ois_t ¡U]o;
r'-a* : K r a 5 ; • C irc o ¿ to s <M un a ID n j í jr. d ifllc o para s i ca ro 2a
tsnurasion */
¿ ? U M je - fc rx (J ) < t) l
O é r r o r t f o r * . ') :
e x '.z : = X lt jA X líF £ \ ;
;• i l í * ¿f¡*.:;o == 3 í • i : srogniea » áccaentra er s i oroetse " i j c ‘
sI= 5 B (S * } ;
} sis* {
100 Programación en Linux
)
D espués do vorificar que e¡ f o r k tuvo efectivam ente lugar, ei proceso hijo
queda inacttvo (“duerm e") d u ran to 30 segundos, tiem po m ás que suficiente
p ara que ul padre lo elim ine. Si, por a lg u n a razón, ia llam ad a a o x e e fr a
casara. re su lta im portante a g u a rd a r h a sta que el proceso hijo finalice, de
modo de poder o btener su condición de -jalida, Recuérdese del capitulo a n
terior que las funcioncá de e x e c n u n ca reg resan un eódigo de salid a al pro
gram a que las llamó, a monos que tenga lu g ar u n error. El program a ta m
bién utiliza ia función 3 p n n t f p a ra convertir ol PID num érico del hijo en
una cadena alfan u m ó n ca term in a d a con un coro que pueda se r p a sa d a sin
problem as a la función e x e c l . C uando se corre ei program a, la salid a «im-
plóm ente indica quo ol padre e s tá elim inando a au hijo:
S J • I i m i 'a r j jr o c a a o
E m p le o de la fu n c ió n k í l l
El empleo de la función k i l l es m ás sencillo que la ejecución del comando
k i l l , porque no se deben realizar los pasos adicionales p ara p re p a ra r una
cadena p ara ex ec. Tbdo lo que se requiere es el PID y la señal que se desea
utilizar. La razón p a ra u tilizar a x e c l en el ejemplo an terio r fue sim plem en
te poder ilu stra r el uso de / b i n / k i l l en un program u en ejecución.
Se hab rá notado que ninguna señal cieñe el valor 3 La única que tiene este
valor es lev serlahtuía, que tiene un propósito especial. Si uno le tran sfiere a
k i l l la señal nula, k i l l no envía ninguna señal, sino que se rem ite a reali
zar su verificación ru tin a ria de errores. E sto últim o puede ser útil si se de
sea comprobar si un proceso d eterm inado se encuentra todavía ejecutándo
se, empleando su PID p ara buscarlo. Téngase en cuenta, sin embargo, que
los PIDs se routilizan periódicam ente, de modo que, en u n a m áquina a ta re a
da. éste no constituye u n método confiable de comprobar la existencia de un
determ inado proceso.
Capítulo 5: Señales 101
E je m p lo
Ei siguiente ejemplo utiliza ía función k i l l p ara enviar dos 3eñcdes a un
proceso hija inactivo, u n a de la s oxaies será, ignorada y la otra elim in ará di
cho proceso.
*3tcrt í s l progrvu
/•
• í4t»níja.C - =nv-.4r a- 5 itfttl ¡ir IMIO Cí k¿lU2)
*/
•irclvU <syi typ«..'.»
¿locIikm <»»i:.f>>
«L'Klutí* <!¿ni5*2.!*>
«ínciufi* <s:gnai.ft>
*UKluC« < Jtaio.h>
«irclyCe <swi:0.h>
in t *3 ln(voi 4 )
(
pifl.t nijc:
i-*t CSC15 c_ 0«_rttorno ;
l í u m i o • fq rk ()J < 4) (
c * r r c r ( , ? c n t, ) t
«*itiéx:r_fA:Lvaci;
) iílh ijo — « ( / • SL proqran» 1 « w c u * rtra en « 1 prcc*jo n ijo '/
tlM srW j;
} #1»» ( • £1 flrog.-afli a* #ncuentrj «n «1 procoio maro"/
/• E nvU r ufta ia¿il cu« i«a iSrvjrad* •/
p rln rf í'& w a f to a SICCHLD * W f t ', m jo j:
sar-orcyiU-.SlGT&M');
;• ri& e rir para :c t e r ír : j cor-aicior ae salida 'I
«a iip id (h * ]o , JJüU, <J J;
102 Programación en Umix
y
9xit!tX rr_3X Cc33);
)
E stá es la salida que se obtiene de un p a r de ejecuciones de este programa:
f i Joatitiijó
í.ivianco S:í>0<'.0 a a n
£ 1 proceso 071 toáavia í x ís h
M I____ E lin ir jn d o 871
ja u o a « ,/oatafii.)o
Enviado SIGCW.0 a 979
El {irocuso V9 todavt* <ixí»t«
E lin iPU n lO 879
L a prim era cosa que se debe advertir os quo. aunque parezca u x tra ín , k i l l
(en inglés, m atar) puede sor utilizada p ara onviar sédalo» difere n te s a las
ue son nocesariáS p ara tHgTSr uñ procosoJSlGKILL, SIG7ERM. SÍGQUIT).
Segundó, oí proceso lujo ignoró, «i»> hecho, a SIGOHl.D, Finalm ente, dado que
mi sistem a se encontraba relativam ente inactivo, pude u tiliz a rla neñnl nula
para confirm ar que el proceso ni quu ai* li* unviú la nerta! todavía existía, Ve
rificado esto último, SIGTERM term inó esto proceso hijo
La llam ada a w a itp id . insisto, conutiluye uxm medida de segundad para el
caso de que la función k i l l no tenga éxito. Como se observó en el capitulo a n
terior. no existe m anera de sab er por anticipado .ii «>l proceso hijo term inara
antes o donpuós del proceso padre. Si el que term inase primero fuera el proce
so padre, ul proceso hijo se convertiría en un huérfano adoptado por i n i t , e
i n i t obtendría la condición de salida del mismo. Si fuera el proceso hijo el
que tonm nase primero, sin embargo, debe se r el proceso padre quien obtenga
su condición de salida para evitar qun aquel se convierta en u n proceso zombic
que ocupe innecesariam ente un lugar en la tabla de procesos del kem el.
Intercepción de señales
SI aspecto engorroso del envío de señales lo constituye la intercepción y la
m anipulación de las mism as. C ada proceso puede decidir cómo responder a
todas las señales excepto SIGSTOP y SIGKILw. las cu.iL-s. -
tahia -> r.o pueden ser ni in te rc e p ta o s ni'ignom d a s. La m anera m S s siro-
plT de intercep tar señales no consiste de hecho en in terceptarlas sino en
sim plem ente esp erar a que sear. enviadas. La función a la r m pone en funcio
nam iento u n tem porizador (tim er) que envía la señal SIGALRM cuando el in
tervalo de tiem po a que fue ajustado este últim o expira. La función p a u s e se
comporta de m anera similar, excepto porque lo que hace es suspender lu eje
cución de ur. proceso h a sta que el mismo reciba alguna señal.
P ro g r a m a c ió n d e u n a a la rm a
La función alarm a, cuyo prototipo se en cu en tra en <unistd.h>, activa un
:erapcrizadcr en el proceso que efectúa la llam ada. Cuando el tiem po asig
nado al temporizado? expira, se envía SIGALRM al proceso que efectuó la lla
m ada y, a menos que este últim o in tercepte la señal, -a acción pred eterm in a
d a p a ra SIGALRM consiste en d a r fin a dicho proceso.
Cao:tui0 5: Soñaies 103
El prototipo p a ra a l a r a es.
a n jlg n etí in * a i s r a i a n j i j f l ^ f l i r t sa c o n tísj;
E je m p lo s
itllf 1. E ste program a establece una alarm a de cinco segundos, después de lo
cual term ina.
n rM H .0 /• s o rz'* í * i progriaa en J n t* m « tV .o y iií« 6 .í ' /
/•
* « l a r w . c - : s p l * « m a c i f l o sa n c -.lla « il« p |» )
•/
• in c lu d * < u n i» tc .n >
*\r<lw4* MtCiO.f*
• I f K lu it < Jt3iia.fi>
» : <u;n(voxa»
C
/ • * ju » tar la a l a r o •,
l ? ( ( a l a r s { S l ) > 0)
p y tíl’V» *» y a r » « L ir tu flr c - jfiiu - ia * ) ;
• 0* ja r írscziic t i procasc al : i w s u fic ie n te •/
!• toao par* la alarva íi p i r * •/
fli« P (3 9 );
/ • £1 p rc^ am no a » 5 * r ia Ufrga'- a c u l • /
O u zH 'íC c e a r „ a a i s f s g r u u l .s g o í q u 1 7 ‘ >;
íuméjUT.paiu**);
>
La salida de e ste program a es la siguiente:
./ a ia m
A la ra clack
^ E ste program a establece una alarm a de cinco segundos, observa si ya su ha-
SAU^ oía establecido alguna otra alarm a, y luego queda inactivo d u ra n te 30 se
gundes p ara proveer a la alarm a de una razonable canr.dud de tiem po p ara
expirar. E n sistem as atareados puede tra n sc u rrir un tiempo adicional e n tre
la generación de 3IGALRU y s u llegada au n q u e no 25 segundos, por supues-
:o). Cuando a rrib a La señal SIGALRM, a la r m a term in a. E l.ruensajfiJA larm
' 1' c l c ck* (.reloj despertador/ lo generó el k e m e l. no el program a a la r is a . Por
l " j,T l « a razón el mismo aparees en inglés.
-= ! 2. Este ejemplo establece dos alarm as, llam ando a a la r m una tercera vez
ejemplo p a ra cancelar la segunda alarm a.
J I ) / J
---------- -v
r NO-i&rg d e l j.-o gran a en lr.x9 rr\9 Ú ^2a lzrr..c
r
• c « i_ 3 la rt3 5 .c - Cancelación do alsrn3s
*/
í incluía «sys.'tyoes.n»
¿induce <jnijtd.tv»
vineiud* <3tdia.h>
Jfinclude <stOliti.h»
:n t Mtn<voidl
£
lcng u n cocigo_de_retorno;
/* éa ta O le ce r l a ¿ la m a *.'
t f <( a la r n c 1 S ) | > 0}
autsi'Ya so *ncu»ntra estaolecida un* a l a r m ');
/* Estaolacar una n<j«va alarma •/
Jl04p(3);
ccdlgo_d«_r«wrna • a la r«(5 )¡
if(codiQ oj:aj*«torno » 0 |
a rln tf ('R u ta n M d legundoa on la aminora alanu\n*. codjgo_d»j- eiorno>;
/• Cancalnr lu MQWIda alama •/
ll*tp<2)¡
g r in t f l- a«itan Ha laounda* «n U 3egunoa aUmaHn*, alar*(0>i:
mt(6Xir_FAII.UW);
>
La salida de este program a es la siguiente
$ ./2alaro
12 Jíg u n c c s « n la p rtn e ru alar.na
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);
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 «
./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
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.
E je m p lo s
1 E ste program a añ ad e u n a señal a un conjunto de señales vacío, y luetfo
utiliza s ig is n - .e - P e r p ara confirm ar que tu se ñ al se en cu entra p resente er.
el conjunto.
• !*ca t ‘ t 5 « i ; r c $ T i s a tA I f t t t f Ú t ! 8 ¡< i» t.e •/
r
• cr#a'_cc«}i*.i:5_»«A»:#í.c 310QUÍ8 un co n ju n to <1#
*/
íirclvc# <sl9Ml.h>
# lrcl«4* <«0li© .h>
• i f e l u ó * <*t<lio.r»>
v c :a M Í i r _ » i _ « r r o r ( c r u r * j ;
in t u i/ l( v O * ¿ J
<
^a«ro_cc^!Jjnto;
• C-**ar t i co n ju n to • /
ifl!s io e n p :> £ ít { 4 r u « v o _ c o n ] u n t c | | < 9)
5 * iir_ 5 i_ a rro r{ *t l g n c t y s a t ’ );
/• A A iú ir S2GO*i»P i l conjunta •/
l f | ¡siea63«t{JiH i«vo_ccnjuflt3, SISCWJ5)) < #)
s a lir _ a i_ « r r o r ( * ii 5M 2sat* í ;
e*it(EXir_3UCCESS};
v o id 3 a I : r _ s i _ 4 r r o r ( c i i 3 r •-o n o re _ se ñ 3 it
0«rror<nc*l>r9_s9ñai| ¡
*xtí<EXIT_?AlLUfiÉ>;
• a lm in a r u ñ a l e v c • E l in in a s e ñ a l a s o e un c o n ju n to O* s e ñ a le »
•/
• in c lu c e < s l(jn a l.n >
• in d u c e <stdlib..n>
• m d u d e <s?dlo.n>
v o io s a i t r . s i _ e r r o r ¡ c n a r • ) ;
t f l t n a w |v o i o |
<
s ig s e t_ x n u e v a _ c o n Ju n to ;
)• C ra a r e l c o n ju n te */
n , ( ( s i g r i . i l m ( 4 n u e '/ a _ c c n j u n t o } | < 8}
s a lir_ s i_ a rro r(‘ 9 i g f l l i s e f ) ;
/ • E l u u n a r SIGAiau d e l c o n ju n to • /
’. fK S iJ d o ls e tíin je v o ^ o n J u n to , SÍGA;.aM:i < 0|
s a I i r _ 3 l_ e r r o r { * s lfla i3 c se t* ) ;
) i ) i i ) ) ) i ) ) ) ) ? y » t ) ) ) y > i y
C apítulo 5: S e ñ a le s 109
•«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«»
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
E je m p lo s
1. El p n m e r ejemplo M n ollam eote bloquea SIOAU^ 7 SíGTHflU sin proce-
er a in s ta la r un h an d ler que adopte alguna acción sspedal.
»>c«s*« Oel oroQr«B4 «n blocft.c. £ 1 »«« .iitv x ti líoírtiicla
• *! \joor- m^r-ado »: :rogrj.n „ u K f & i y ) 0* »U íítion V
r
Slco¿tir_i*Aai,,.c 8iocy«* un coo'ufl» se
*/
•ircltffl# <S43rai,.t>
*lAc!utf« <jMU6.n>
♦ircluO* <ttOiO.fi>
voií ttl4r_si_*rror(cfur •
in t Min(v 0i 0>
(
s i;i» t_ r 'v.'rfO_caft]tfi*o;
' • C r # a r « 1 c o n j u g o mj
n I¿ r_ ji_ # rro r|
•'* A$r*;ar s:GTE*v y sjoaum •/
^ (($ ifito e u t(ix « v o .co a ]u n to , srariísiu <41
í i : “ - s i - * r ' 0 < "C si;aocí»t:S ÍG T c?Jtf* J;
- ' ’ ‘ * iQaóiití i i.'o«¥o_cortJ unto, ¡ < t)
s a l i - _ j i _ j r r a r ( ' * i 9«a<35» t : S : 5 A U M ');
* 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.
*/
« m clu ío <uni.std.r.>
íin cL w s «sl<jnal.li>
»:nctud* <stdio.n>
tfirtelude < 3 to lit> .r»
voxa ia iir _ s i_ a r r c r lc h a r •); /• función de e r r a r ')
void h a n d ie r _ u íu ir ia !( in t) ; /• lanQ lu r de señales
m t caln (vú id )
<
) ? } ) ) ) ) } ) ? ) ) 1 ) 1 ) > >
C apítulo 5: S e ñ a le s 113
s tr v c t sigaccicfl acción;
* C o n f ig u r a .- i i 'r t f l e ' *
a o c io n .ia jW C lV = r.3n<31er_u3uariot i
siaeflOtyM1: &acciao.*«_M**);
jccior.3i_*H5S = SAJI0CU8T0P;
• ae-gist-ir •• «aníHr •/
if({*¿SactíooiS:GU$fi1, U c t io r , MJLLl» < 9)
3a:¿r_j;_#rrof Csisactior.’ | ;
’• P*r»itir «l 3*?ici»nt« titoco c o k oari enviar una sartal •)
ílaeS 'M : .
«iit(Ex:r_5jCC€S5¡;
>
<
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
S A L ID A
La salida m uestra que el h an d ler fue registrado exitosam ente. Luego de eje
cutarse el handler. el program a term ina.
CONSEJO
SIGUSR: / SI0US32 hoa sido especialmente 'eservadas como señales den- 33$ o<y
ei yegramado' Se 183 debe emplear cuantío se desoa habitar algún Upo de comporta
miento escecial. tal cono volver 3 ee? archivo do configuración, en lugar de uti lra-*
un hartílor ío s^r.ai a fin de redofinir una « « las sortee* estándar. cuya seméntca ya
su •incuont/0 bion definida
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*);
/ • S locuair la M ñal •/
»:;proc»a»x;S;S_3L0CX, leor.Juflto.M rtalaa, V fl.li;
• D ew lw ear S!5TéRU •/
iigppoc«sit(SrG_lK8L0CX. 4ee.-ijunto_sirtal.as, nüll);
ixlTtüciTJtCCESS};
>
E n becef.do de ia brevedad se h a om itido ls verificación <ie errores. El códi
go re su lta sencillo áe interpretar. El m ism o crea u n a m áscara que bloquea a
SI3753U y luego u tiliza k i l l p a ra e n v ia r SIGTSñM h a d a s í mismo. Como
es:¿ bloqueada, ia señal no llega a destino. Se u tiliza s ig p e n d in g y s i g i s -
> > 1 'I ) ) ) } ■) ) ) ) ) ) ) > > ) 5) 5 )
rULv» r, ro & ra m ¿ * c ió n e n u n u x
Lo que viene
H abiendo adquirido u n conocimiento básico de la adm inistración de procesos
y el procesam iento de señales, el lector ae en cu en tra iisto p a ra desplazarse
h ac ia tem as m ás avanzados, tales como E/S sencilla de archivos y a ad m i
nistració n m as sofisticada de archivos, ta l como m ultiplexxng y bloqueo do
archivos. E l m u itiplexing de E / S , que os el proceso de leer y escribir sim u l
tán ea m en te desde y hacia m últiples fuentes de en tra d a y 3alida. requiere te
ner un buen conocimiento sobre señales. Los daem ons, procesos que corren
on segundo plano sir. intervención del usuario, dependen tan to de la capaci
dad de realizar fo r k t (generar procesos descendientes) y de verificar m ú lti
ples procesos de e n tra d a y salid a como de la intercepción de señales que
3ean de in te ré s y que provengan do los procesos hijos, y de a c tu a r en conse
cuencia. Prim ero, sin embargo, el próximo capítulo explica las llam adas a
.UAtema. lu in terfa z program ática en tro los program as de aplicación y los
servicios provistos por el Iwrncl.
Llamadas a sistema
E n este capitulo al lector conocerá las lla m a d a s a sistem a, la interfaz cnt.ro
su program a y el kerr.ei.
E ste capitulo cubre los siguientes teman:
• Qué es una llam ada a sistem a
• Por qué raxón y cuándo u tilizar llam ad as a sistem a
• Llam ada* a sistem a habituales
• E rrare* que g eneran las llam adas a sistem a
• E rrores de adm inistración de llam ad as a sistem a
Todos Ion program as de este capitulo pueden se r encontrado» un al sitio Web
r t t t o : //*v»**.“ c p . e o n / Lnfo bajo el n úm ero de ISBN’ 0739722151.
I / I } - ) ' ) * - ) ' ) } ) ' ) ) ' } ) )
L im ita c io n e s d e la s lla m a d a s a s is te m a
Los llam adas a sistem a e a si m ism as se encu en tran optim izadas en cuanto
3 velocidad y. con el ñ a de m a n te n e r la in teg rid ad del código de modo kem el,
tien en tres restricciones significativas:
• Cad3 argum ento transferido de modo usuario a modo k em el es de la
m ism a longitud, g en eralm en te el tam año norm al de p alab ra que co
rresponde a la a rq u itec tu ra d e l procesador a cargo del sistem a.
• L as llam adas a sistem a siem p re re to rn an valorea enteros con signo.
• A fin de m inim izar ei tam añ o del k em el y p ara lograr que el mismo se
comporte de m anera velos, todos los datos transferidos al mudo kem el
lo son por referencia, es decir, se tran sfiere su dirección en m em oria y
no m eram ente su valor. E sto resu lta particu larm en te im portante cuan
do se tr a ta de e stru c tu ra s de datos de tam año potencialm ente grande.
E n realidad, tas prim eras da? lim itaciones tienen poco efecto significativo en
los program as que uno escribe. L a tercera restricción significa sim plem ente
que uno tiene que u tilizar p u n tero s a estru ctu ras, en lugar de laa propiaa es
tru c tu ra s, cuando efectúa llam ad as a sistem a.
Q u é e m p le o t ie n e u n a lla m a d a a s is te m a
Como lo sugirió el parágrafo an terio r, la principal razón para u tilizar llam a
das a sistem a os p ara requerir un servicio por partí? del kem el al cual el có
digo de usuario no puede acceder ¿Quó tipo do net-vicioa de sistem a se e n
cu en tran disponibles? A p a rtir del kem el verr-ión 2.2.5. existen 190 llam ados
a sistem a enum eradas on ol archivo / u s r / i n c l u d e / a s m / u n i s t d .h , quo
contiene todas las Uamadaa a sistem a y define laa llam adas relevantes a
fijr.CTones y a m acras p ara poder itilizarlos. La lista de servicios disponibles
incluye ios siguientes:
• A dm inistración de procesos, tales como f o r k , e x a c , 3 o g u id , g e t u i d y
así siguiendo.
• La interfaz com pleta de adm inistración de señales, como por ejemplo
s i g 3 C t io n . s i g s u s p e n d . s ig p r o c r a a s k y s i g r e t u r n .
■ Servicios de fileayatem. tales como m k d ir. c h d l r , f s t a t , r e a d . v /r i-
te .o p e n y c ió s e
• A dm inistración de m em ona ta l como mmap, raunmap, sD rk, m lock y
a u n lo c k .
• Servicios de red, incluyendo s e th o s tn a m e y setd o ir.ain n am e.
• Program ación de procesos, que el común de los program adores nunca
ten d ria necesidad de llevar a cabo.
U na razón por ia cual alguien necesitaría utilizar llam adas a sistem a es para
¿mplcmentar su propio método de adm inistración de m em ona p ara su aplica-
ción. Como sab rá el lector, la biblioteca C están d ar provee ra a llo c para reque
rirle mem ona -ü sistem a operativo. De lo que no se debe haber dudo cuonta.
rin embargo, es que uno puede cre ar su propia m al lo e a través del empleo de
las '.lamadas a sistem a or'< y s b r k b rx y s b r k m anipulan el espacio que ocu
par. los datos de un programa.1 E sto podría tal vez rem ediar algunas de las ii-
Programación en Linux
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.
' ) ) ) ) ) ) ) ) , )
• si§ o er.cin g R etorna una m áscara de señ al que contiene todas las se
ñales que están bloqueadas, aguardando ser en treg ad as
al proceso que efectuó la llam ada.
• sígproc~ ask Establece o modifica la lista de señales que desea blo
quear un proceso.
Códigos de retorno d e la s lla m a d a s a s is te m a
Las llamadas a sistem a casi siem pre reto m an O cuando tienen éxito o u n va
lor negativo (casi siempre -1) cuando 'na ocurrido u n error, de modo que
existan como mínimo dos m an eras de verificar el valor retornado
Ejemplos
1. Este fragmento do código com para el código de retom o de una llam ada a
sistema con 0.
IftcpOTr/ujrfsre/iinui/Makofiie*, 0 RDDnly)} ( /• 0 ^donlY: A&rir sola para
tetara V
I' Tuvo lugar un error, aiísinistrnr aquí
r *l># I
í* la »9r*.ura <fcl archivo na stda oxitasa •/
)
Ente ejemplo saca partido del hecho do que las llam adas a sistem a exitosas re-
tanunO. U condición i f evaluará a vordad<?ro si la llamada a open fraciisa, de
codo de ejecutar el código de adminiH (radón do orrores que resulto adecuado
D "• 2 Sate fragmento de código haco lo mismo que el anterior, pero evalúa espe-
T s jg ) dñcataéote si la llamada a sistem a reto rn a un valor negativo.
^ iflot»r;V uv,/irc,,lirux;u.tKo<,.Lo*, 0_PCONiv> < 0} | /* O.POCNLV: A artr jalo
pira iictura •/
tj(M p io ;• ,ir trror aecurrto, rundí* it ner® •/
t «IM {
/• op»n«d tu » f i l a jjcco ssfu lly • /
I
Dejando de lado hus diferentes condiciones i f , Iob dos ejemplos se compor-
*-an exactamente de la misma m anera. El prim ero emplea una notación que
es muy común en C, de modo que el lector se enco n trará con la m ism a m u
chas m e s. Yo prpfiero la sintaxis del segundo ejemplo porque re su lta m is
jencilla de comprender por los program adores novicios, pero la elección es
del lecwr (se trata de Linux, después de todo).
Tabla de cód ig os de e rro r re t o rn a d o s p o r lla m a d a s a s is te m a
La tabla ti. 1 contiene una lista comentada de los errores que retom an general
mente las llamadas a sistema. Como el lector está todavía aprendiendo a progra
mar a i el entorno Linux, probablemente no comprenda muchos de esto¿ errores.
Lea la lista a fin de adquirir una idea general, y luego, a medida que vaya leyen
do al resto del libro y trabaje con ios programas de ejemplo, revise :a lista.
La página del manual p ara cada uno de las llam adas a sistem a docum enta
tocos los códigos de error que genera la mism a. Además, todos ios códigos
¿«áridos en POSIX, el e stán d ar al cual adhiere m ás fielmente L inux, se en-
jj J } J 1 I 1
Capítulo 5: U a m a d a s a s is t e m a 125
co.
re
Programación en Linux
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.
ETXTBSY *Jn proceso ir.tontó abrir un archivo blnuno o de biblioteca que so en
cuentra corrientemente en uso.
EPIP E El extremo de lectura lie un pipo esta cerrado y SIGP1PE ostfl $¡endo
ignorada o capturada.
ELOOP Una ruta contiene una cadena demasiado larga ce vínculos simbólicos.
A d m in is tr a c ió n d e e rro re s
Existen dos m aneras de comprobar y ad m in istrar errores cuando se utilizan
llam adas a sistem a. U na es comprobar los valores retom ados discutidos en ei
parágrafo an terior y redactar el código que los adm inistre. La segunda es uti-
hz-ar la variable global firm o que se encuentra declarada en < e r r n o . h>. To
das ias llam adas de sistem a y muchas funciones de biblioteca la asignan un
valor a e r r n o cuando tiene lugar u n error. Existen tam bién dos m aneras de
utilizar ia variable e r r n o . La prim era se basa en la Llamada de fundón a pe •
r r o r , que está declarada en < s t c i o . h> y prototipuda como sigue:
voia oerrortconst char •$);
Cspi'.'jio 6 : Llamadas a sistema 127
»' i E je m p lo s
1 La utilización de p s r r o r constituye la m an o ra m ás común do exhibir un
código de error
EiCMPlO • 3 * 1 orocrw u *n lnt«r-«t: «epl.C • /
f
• c r M ’MrPfif C
V
• lrci.aH
<»tauB.r>
•inel’jC* <«rrro.r»
int
(
FILÉ
♦ .it ( £ iIT _ S .C C E S S ) ;
y
Z \ program a in te n ta a b n r un archivo su p u e sta m e n te no existente, f OCbar.
Si fracasa, que =.-> lo que debería ocurrir, llam a a perror y term ina. Si de a l
guna m an era n e n a éxtto. el program a c ie rra el archivo y sale. La salid a de
este program a es la que sigue:
■rsr:j*js_arror
g V 'F fopeo:
• *<c sucft * ii3 o r d if« c :c ry
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);
Lo que viene
r.n este capítulo el lector ha aprendido sobre llam ad as a sistem a, la in terfa z
e n tre el código de modo usuario y el de modo kernel. A m edida que se con
vierta en u n prograir.ador de Linux m ás avezado, se en co n trará cada vez
m ás con situaciones en las que re s u lta ventajoso o conveniente u tiliz a r s e r
vidos provistos por el kernel e n lu g ar de d esarro llar código propio. E n los
próximos dos capítulos -e l capiculo 7, “A dm inistración básica de archivos en
Linux* y el capitulo 3. 'A dm inistración avanzada de archivos e n L inux"-
tend rá oportunidad de ap reciar excelentes ejemplos de los tipos de servicios
que provee el k em el y por qué razó n los pueda en co n trar preferibles a te n e r
que rein v en tar la ru ed a con su propio código.
7
Administración básica
de archivos en Linux
Efl Linux. casi todo es un archivo, ol monos en térm inos abatracto». E sta ca
racterística constituye uno de los mejores detalles do diseño de Linux porque
hace posible una interfaz do proifram ación uniform e hacia un pasm oso y
continuam ente cam biante conjunto de recursos, tales como mem oria, e sp a
d o en disco, dispositivos, canales de com unicación e n tre procesos, canales de
comunicación e n tre redes y h a sta procea*» on ejecución. En este capítulo se
com entarán las prestaciones fun d am en tales de la interfaz de Linux p ara el
manejo de archivos
E ste capítulo cubre loe siguientes tem as:
• Concepto* básicos del manejo do archivos de Linux
• Perm isos de archivos
• Tipos de archivos
• A pertura y cierre de archivos
• L ectura y e se n tu ra de archivos
• Obtención y modificación do la inform ación p resente en archivos
Tbdos los program as áe este capitulo pueden ser encontrados en el sitio Web
h t t p : / / wav» .c c p . c o s í / i n f o bajo el n um ero de ISBN 0789722151.
'4
7
Administración básica
de archivos en Linux
En Linux, c a s i todo es un archivo, al meno-s en térm inos ¿batracios E sta c a
racterística constituyo uno de lo» mejores d etalles de diseño de Linux porque
hace posible tina interfaz de program ación uniformo hacia un pasm oso y
continuam ente cam biante conjunto de recursos, tales como m em oria, esp a
d o en disco, dispositivos, canales de com unicación en tre procosos, canalón d«
comunicación entro redes y h a sta proem ua en ejecución. En este capítulo se
com entaran las prestaciones fundam ental es de la interfaz do Linux p a ra el
m anejo do archivos
E ste capítulo cubro los siguientes tem as.
• Conceptos básicos del manejo de archivos de Linux
• Perm isos de archivos
• Tipos de archivos
• A pertura y d e rr e de archivos
• L ectura y e se n tu ra de archivos
• O b te n c ó s y mcdiñcación de la inform ación p resente en archivos
Todos ios program as de este capitulo p u ed en se r encontrados en el sitio Web
h t t p : / / x w w . s c 0 . c a m / i n f 0 bajo el num ero de ISBN 0739722151.
132 Programación en ünux
P ara poder com enzar a u tiliz a r las interfaces de manejo de archivos, el lec
tor necesitará com prender los conceptos y características m ás im p o rtan tes a
los que se hace referencia cuando se habla de u n archivo. A ntes de seguir
adelante con la programación, e sta p arte se refiere a dichas ideas y nociones
con bastan te detalle.
Como se estableció, la m ayoría de los recursos de Linux pueden s e r accedi
dos como archivos. Como resultado de ello, existen muchos tipos diferentes
de archivo. Un listado parcial de los tipos de archivos presentes en un siste
m a Linux incluiría los siguientes:
■ Archivos norm ales.
• Pipes con y sin nombre asignado.
• Directorios.
• Dispositivos.
• Links simbólico».
• Sockets.
Los archivos norma.Ua o convencionales se denom inan archivos de disco y so
los define como unidades de alm acenam iento de datoa que perm iten un acce
so discrecional, tam bién denom inado aleatorio. Los mismos están orientado»
a byt«*3, lo que significa que la u nidad húmica em picada p ara leer desdo un
archivo y escribir al mismo es el byto, conjunto de ocho bits que tam bién co
rresponde a la representación de cu alq u ier ca rá cte r cuyo código num érico .se
encuentre comprendido en la tab la ASCII. Por supuesto, uno puede, y habi-
tualm ento lo hnce, leer o escribir m últiplos bytes a la ver., pero la unidad
fundam ental sigue siendo cada carác te r o byto individual.
Un pipi! 'comentado con m ayor d etalle en o! capitulo 15, “Pipe# y FIFOs"' os
sim plom cnte lo que su nom bre (conducto) dn a entender -u n canal de infor
mación que recibe datos por un extrem o y los tran sm ite (modificados) por el
o tro- Por un extrem o del pipe 3e escribo y del otro se leo. E xisten dos tipas
de pipes: con nombro asignado y sin nom bre asignado. Los pipes sin nombre
asignado se denom inan asi porque nunca aparecen en el disco rigido de un
áistem a con un nombre, tal como por ejemplo / < J í r _ p r í n c i p a i / k u r t •
_ v /a llw a ll/n o m b re _ d e _ p ip e . En cambio, I03 pipes carentes de nombro
¿on creados y dustruidos en la m em oria (estrictam ente hablando, en el ker-
nel) de acuerdo a las necesidades del sistem a. Además, como ae v e rá en *.*i
punto "La interfaz de adm inistración de archivos" en este mismo capítulo,
los pipes sin nom bre son referenciados siem pre por un número, n u n ca por
nombre de archivo. No obstante, se utiliza la m ism a interfaz p a ra le e r de pi
pes sin nom bre y escribir a los mismos que la que se utiliza p a ra leer y escri
bir archivos convencionales p resen tes en el disco.
Los pipes sin nombre son creados generalm ente como resultado de un coman
do omitido desde la línea de comandos do una interfaz, tal como se m uestra a
continuación (los pipes se indican m ediante las b arras verticales [ [ ]):
S cat /«Ci'pass»a ¡ cut -Ci -d : ¡ ha3d -5
sievíPLO
Caoftu’o 7: Administración básica de archivos en Linux 133
--------
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.
—
♦ at <1 < —«M
Como se puede ap reciar en la figura 7-1. el kernel crea un pipe sin nombre
que recibe la salid a del comando c a t , quo norm alm ente escribe su salida a
il& ndar¿ output Ha pantaliál. E l com ando C u t recibe su en trad a desde el
extrem o de lectura del prim er pipe, lleva a cabo su propia transform ación de
loa dato-? y luego envía su salid a al segundo pipe iir. nombre. E n tretan to ,
luejío de que CUt recibe toda la aalid a do c a t . *?1 kernel destruye el prim or
pipe porque éste ya no resu lta necesario. E l comando hoad, finalm ente, ex
hibe las prim eras cinco líneas do e n tra d a leídas desde e! pipe Luego quo
head recibe todos los datos provenientes del segundo pipe sin nombro, el
k em ei destruye tam bién este d i tim o. En ningún momento, sin em bargo, tu
vo ninguno de los pipes un nombre a residió en el disco.
Los pipes con nombre, por el contrario, tien en nom bres do archivo. Se los u ti
liza principalm ente cuando dos procesos necesitan com partir datos pero no
com partir descriptores de archivos (ver “La interfaz de adm inistración do a r
chivos* m as ad ela n te p ara e n c o n tra r detalles).
Loa dwectonos, tam bién conocdos como archivos de directorio, son simplemente
archivos que contienen una Lata de toa archivos almacenados en ese directorio.
Los archivos de dispositivo, tam bién denom inados archivox especíate* o cun-
troledores (d n v e n ), son archivos q u e proveen u n a interfa 2 con la m ayoría do
los dispositivos físicos Pueden ser ta n to especiales do caracteres o de blo
ques Les archivos especiales de caracteres son escritos o leídos de a un byto
0 carácter) a ia vez. Ejemplos de dispositivos de caracteres pueden se r los
módems term inales, im presoras, ta rje ta s de sonido y rutones. Los archivos
especiales de bloque, por otro lado, d eben ser leídos o escritos en múltiplos
áe algún tam año de bloque (un bloque es u n a porción de datos de algún ta
maño arb itra rio pero múltiplo de u n a potencia de 2, por ejemplo 512 bytes o
1 küobyte). Los dispositivos de bloque com prenden, e n tre otras, las unidades
de disco, las u nidades de CD-ROM y las unidades de disco RAM (sim ulacio
n es de una u n id ad disco en m em oria RAM). H ablando en térm inos genera-
Programación en Linux
les. los dispositivos de carácter se em plean p a ra tra n sfe rir datos, m ientra*
que los dispositivos de bloque se em plean p a ra alm acenarlos. Los archivas
de dispositivo se en cuentran alm acenados en el directorio /d e v .
Los vínculos simbólicos son archivos que contienen u n a ru ta de acceso a otro
archivo Funcionalmente. 3e comportan de m anera muy parecida a la de los
alias de comandos. La mayoría de las llam adas relacionadas con el manejo de
archivos operan directam ente con el archivo real al cual apunta un vínculo, on
liufar de hacerlo con el propio vínculo (esto se denomina seguir el vínculo).
Loa socket 3 . finalm ente, actú an de m anera m uy parecida a la de los pipes
pero perm iten que los que «o com uniquen sean procesos que se ejecutan en
com putadoras distintas.
Independientem ente del Upo de archivo, sin embargo, la convención que u ti
liza Linux p ara el tratam ien to de loa archivos -os decir, su hábito respecto
de tr a ta r o casi todo lo que haya p resente en úl sistem a como si fuese un a r
chivo- le perm ite a uno u tilizar la mioma interfaz p ara abrir, cerrar, leer y
escribir Es decir, las convenciones de Linux reapecto de Ion archivos le b rin
dan al program ador una interfaz consistente y uniform e por medio de la
cual in tera ctu ar con la totalidad del espectro de dispositivos y tipos do arc h i
vos existentes, liberándolo de ten er que recordar los diferentes métodos do
escribir a los dispositivos do bloque, vínculos simbólicos o directorio*.
E l m o d o d e u n a rc h iv o
El modo de un archivo, que se tija m ediante lu ejecución del comando do Linux
Chir.od, es un número compuesto de siete dígitos octales (21 biLs en total) quo
expresa el tipo de archivo, sus correspondientes permisos do acceso y la even
tual modificación de su comportamiento predeterm inado (recordemos aquí que
el sistem a de numeración octal cuenta con ocho dígitos, del 0 al 7 inclusive, y
que cada dígito se puede representar a su vez por tros bits o dígitos binarios,
de la mism a forma que cada dígito hexadecimal se puede rep resen tar por cua
tro bits;. Los permisos de acceso ocupan los tros dígitos octales inferiores del
modo de archivo (o sea los 9 bits de orden m ás bajo). Los tres dígitos octales (o
9 bita) de orden más alto expresan a su vez el tipo de archivo de que se trate,
m ientras que el dígito octal (3 bita) del centro representa el valor del modifica
dor de modo de ejecución, que veremos enseguida. La figura 7-2 ilu stra la con
figuración del modo archivo y sus elementos constituyentes.
StttanbnU
ro a i’2 2 > ? u a '» >S:«3Aí»ntaV*
U u W Si:
e l d íg it o d e m o d o d e e j e c u c i ó n d e a r c h i v o
El cu arto dígito octal (el dígito ce n tral) d el modo archivo es el dígito que
corresponde a su modo de ejecución; el m ism o :ndica ai se tr a ta de un a r
chivo setuid, setgid o ‘p e r tin a z ' (sticky). Tal como se vio en el cap ítu lo 4.
•‘P ro c e s o s/ cuando u n proceso e je c u ta u n archivo s e t u i d o s e t g i d . su
UTD o GLD efectiva, seg ú n corresponda, es p u e sta al mismo valor que la
del propietario del archivo o la del gru p o a l que este pertenece, resp ecti
v am en te. C uando e stá activado el b it de p e rtin a c ia (indicado por u n a S
m ayúscula, por ‘ S tiC K y * , cuando se e fe c tú a u n listad o de directorio con
a opción - i del com ando I s ) , s u p re se n c ia obliga al kernel a tr a ta r de
m a n te n e r el archivo er. m em oria todo el tiem po que le resu lte posible (de
ah í el nom bre de p tn in a s ;, a u n e n el caso de que el mismo no e sté siendo
ejecutado, porque eso reduce el tiem po d e comienzo de ejecución er. pos
teriores corrid as del p ro g ram a d u ra n te la sesión. Los valores posibles pu
r a dicho dígito octal son los del dígito c e n tr a l de la ta b la 7-2, que provee
las m áscaras y co n stan tes sim bólicas p a ra ia d eterm inación ¿el tipo de
modo de ejecución. El dígito octal m odificador de archivo de la fig u ra 7-2
v ale 0. p o r lo que el archivo no es n i s e t u i d , ni s e t g i d , n i p ertin a z , y
sólo puede s e r ejacutado como lo especifican los tre s dígitos o ctaies de la
derecha.
) / ) J • } ) f J f ¡ f ) t J ) > •' 1 ' ■'
136 Programación en Linux
N O TA
les bits de moG¡rlcdC¡$rt y do permiso de un archive constituyen máscaras es bits. 0 dí
gitos octales c -e son mánlpüSados y evaluados cor ¡as íurciones de manipulación ce
bits Ce C. tales como « : (desplazamiento a !a izquierda) y - (comptemento de bits!.
Afortunadamente. Linux provee un conjunto de ^aseares y constarles slTOólícas (ver
cotamna izquierda de taóla 7.1) que facilitan deoosiíicar oi modo de un archivo.
• 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.
C O N S E JO
í»5*2 0 0 «r* r informaden SOtte ;crra manisvlar el modo Oe un arclwo desde la petS*
pect.va ae .suarto ef de a ce -n arogramaccr. ver reacrt «Su.'SelfUnux in 24
Hovrs 3 i Sai; . Lr.ux Unieasned ; T n Parker) o Spe&at Soiocn 'Jsirtg Unux {Jac* Tac-
y Steven Burnen), te c e s estos libros p_ol, esees oor Sars.
Programación en Linux
La u m a s k
lector descubrirá en la próxim a sección, “La interfaz de adm inistración de
archivos", que puede c rear nuevos archivos y directorios y puede fijar los
permisos respectivos de acceso a loa miamos m ientras los crea. Sin embargo,
tanto u nivel de sistem a como de usuario, los perm isos que se asignen serán
modificados por la um ask asig n ad a al proceso, que contiene u n a m áscara de
bits com puesta por los bits do perm iso a se r desactivados p ara los archivos y
directorios nuevos que sean creados. La um a sk afecta solam ente a los bits
de perm iso de un archivo; uno no puede v a ria r por medio du la um ask los
bits que especifican el tipo y la m odalidad de ejecución de un archivo
Se puede modificar la um ask do un proceso, pero sólo p ara hacerla máa res
trictiva, y r.o menos restrictiva. Esto se efectúa m ediante u n a llam ada a
unres*. prototipada en < s y s / s t a t . h> tul como se m u estra a continuación.
jnaaK(noc»_t na w m h i;
E sta función ostablece como nueva umask del proceso !a m áscara newmask
(m áscara nueva), retom ando la umask an terio r independientem ente de quo
la llam ada a la función umask so complete exitosam ente o no.
E je m p lo
El ¿iffuiente progrnm a de dem ostración llam a a u n a sk para establecer una
nueva um ask m ás restrictiva.
« J C M I> I. O
/ • son ora d a l a-ograita an [n c o rro t: r.e*n .sjk .c * ;
r
• rtu*va_unask.c - Modificar ia uttiSK naciéndola ran restrictiva
•I
*rr.cluco <sys/stat.n>
•írcluce <sy*/types.n>
«incluae <stoia.n>
• incluce <j:oLi3.r\>
xnt oainivouj}
í
aoas_: rueva_B3scara = 666, cascara_anterior; /• los fligitcs ser ocíales
<w$cara_Mtortcr « ac4SK{ftueva_aa3ca."aj;
p r iu t f (‘ La jnask anterior era %/ro\n*, n&scara_anterior);
a r w r tC L a nueva unas* es % « '.« * , nudva_aascara|;
systeaf‘ teucn feo*);
9xit{€XIT_SUCCE88);
CacnUic 7: Administración básica de archivos en Unux 139
S . V«_UB*SV
U J i t í * * * t e r 10 * **3 Í2 2
La % f» i -*ss* es 5 éí
S 1» - l feo
............................... ^ » u rt_ n ll j*«rs a sJyl 2* 19:93 ico
Como ¡o m u estra la salida de este program a, la nueva um ask queda e sta b le
cida a 866 desactivación de perm isos de lectu ra y e sc ritu ra p ara todos los
usuarios, el propietario y su grupo). La u tilid a d to u c h de Linux, que modifi
ca la fecha y hora de u n archivo, ta m b ién crea al mismo tiempo, on ausencia
de alguna restricción específica, u n archivo coa modo de acceso 666. que
asigna perm isos de lectura y e se n tu ra a todo el mundo. S in em bargo, una
u m ask de 666 hace exactam ente lo opuesto y obliga a que todoa Ion archivos
que sean creados en el fu tu ro no ten g an activado» osos bit» do perm iso. Co
mo resultado de ello, f oo resultó creado a in bita de perm isos, que es ex acta
m ente lo que informó ls .
NOTA
E r3 ta --€ « 'c -= as aranas ce marero ae areñivos cubiertas en <esio «Je este capí-
r i o no 'Ciuver 33 r u t o » -e bftsfccteca estároar ralea co ro fc-cer. fcose y asi sL
¡M^r-e <t oue el « c o r ya 'aa ccncce. S. necesita efectuar un repaso
rkoáo. vea C Prcgra>Tv- Lü^guege. Seconc Editic»*.. de 3rfar. Xemigjisft y Dennis
Pittfte. C 2 > ltsr-z.i. X a-eg 5 = f ry . o Texfi 'terself C in 21 Zsys. ffrm Earaor.. ce Pe-
i i ; / ) ) ,t ) } f / / ) ) ) ) ) > J J J J*
A p e r t u r a y c ie rr e d e a rc h iv o s
Existen dos m an eras do ab rir un archivo. Open y c r e a r . Ambas e=tán proio-
tápadas en < u n i s t d . h>. pero se debe recordar adem ás de incluir en el códi
go f u e n t e e l a r c h i v o de e n c a b e z a d o < f c n t i . h > .
LA L U M A D A A SISTEM A O p e n
Tabla 7.4. Listado parcial de indicadores (flegs) de acceso para open y crear
Indicador Valor Descripción
o_ r o o n l y ooaa El archivo so ;ibr<9 so.o paro lectura
C_WRCNLY 0001 0 archivo so abre solo para escritura. Se escribo dosde su or-
gen fie datos
0_ROWfl 0002 £1 archivo so abre para lectura y osentura
0_APPEN0 OC08 Ut esentura de datos so reolüa siempre 3- final Cei arcnlvo
0_RAN00M « 0 10 0 drcnlvo se aore paro ser accodido de manera discrecional
(aleatoria)
o_seq ü en t:al 3020 El arcnlvo se abre para eer accedido de manera sec-jonoai
C_TSM?OHARY 0040 0 archivo es temporario
0_N Q IN H ER IT 0080 £1 archivo no hereon las varlaoles ce entorno dei programa oue
lo creo
0_CREAT 0100 Crea el archivo si este ya no existe
O^rRUNC 3200 Establece d tamaño del arcntvo en 0 by.es.
o le X C L 0-100 Empleada sólo con 0_CREAT. open no abre el archivo Si y3 :o
aühó 0_CREAT
Q _TE X T 4000 0 archivo se abre en modo texto
0 9INARY 3033 0 archivo se abre en modo oinarlo
coniinúa
/ # i ; y ) ) / } ) i ) i J ) ) 1 > )
Capítulo 7: Administración básica de archivos en Linux 141
LA LLAMADA A SISTEMA C l O S G
Pora c e rra r un archivo, utilice la lla m a d a a c i ó s e , prototipada en
< u n ist< J.h > de la siguiente m an era:
int :!«»•( int ?d);
do«e cierra el archivo asociado con fd (file descriptor) y reto m a 0 s» tiene
éxito o • 1 si ocurre algún error.
&
É
\ 11
fJEM ?LO
E je m p lo
El siguiente program a sim plem ente abre y cierra un archivo de nominado hola:
/ • .%3acr* ¡3«l en in t e r n e t : fo p u .c */
« r e « t e r e * .» * a t r t \ ) r * / c t e r r t í « a r e n iv o i
•/
#i*clod« « íc n i. ft »
#ineiuO« <urlJt3.«>
«L/telrt*
íisclude <*Wio.n>
m : u in ( v e ia )
{
:n t d escn p re r^ iren ivo ;
char r o t a r 5 * ‘ {tola*;
L
142 Programación en Linux
} elj#
printf(*ADii)r:o archivo Ns'.n*, ruta>;
if{clos«{de$criotcr_4rcnivo| < 3! {
p a -r o r C c io S í');
exit(txiT_?AlLUPE|;
) 9 l3 »
p rin tf('C e rra d o archivo %aVa’ , ru ta):
««ItlEXZTJUCCEtt);
)
La ilamadu a sistem a open trata de abrir ei archivo h o la «o modo aólo lectura
C_CREAT h ará que ei archivo sea creado si no existiese previamente pero, si ya
existiera, 0_TRUNC pone el tam año del archivo a cero, como si hubiera sido re
cién creado. 0 WRONLY hace que el archivo 30 abra para lectura/escritura sola-
mante. Cuando el archivo queda abierto, c i ó s e procede rápiduraante a cerrarlo.
En particular, obsérvese quo el código fuente verifica el valor de retom o de
c i ó s e Aunque comünmonto esto no ao lleva a cabo, rep resen ta en ese caso
un jerio erro r de programación por dos razone». Prim ero, en un fileaystem
operando en red. tal como NFS, In llam ada a c i ó s e puede fallar debido u :.¡
¡atenria de la red. Segundo, mucho» sistem as e stá n configurados con alma
cenamiento temporario (cacha) de tipo escribir después, lo que significa que
una llam ada .i v/n*. e reto rn ará con éxito, puro el «¡«toma operativo diferir A
la acción efectiva de escribir a disco h asta h a lla r alguna ocasión m ás conve
niente. Citando la página del m anual p a ra C ió s e (2):
“La coudiuúQ de error puede (llegar a ; s e r inform ada (recién) en una
operación postenor du e«enturn, pero se g a ran tiza que serfi informada
cuando se proceda a cerrar el archivo. El hecho de no verificar el valor
retom ado por c i ó s e cuando se cierra el archivo puede conducir a pérdi
d a inad v ertid a de datos."
L e c tu ra y e s c r itu r a d e a rc h iv o s
Probablem ente ei lector desee tonto leer como escribir y desplazarse por u n
archivo. P a ra leer de un archivo y escribir al minmo se proveen en
< u n i s td .h > los siguientes dos funciones:
asiie_: readfmt M, voic *Ouf, s¿Z8_t countl;
a i <rita(in: -d, ccns* void *buf, size_t count);
r e a d tra ta de leer desde el archivo abierto indicado por el descriptor de a r
chivo fd la can tid ad de bytes especificada por c o u n t y si reto rn a exitosa
m ente alm acena los datos leídos en el buffer (espacio en memoria) especifi
cado por b u f . Si tiene éxito en su ta re a reto m a asim ism o el núm ero de
bytes leídos desde ei archivo (0 indicaría u n a condición de EO F o final de a r
chivo, E sta cantidad puede llegar a s e r m enor que el núm ero de bytes solici
tados. Si se produce un error, el valor retom ado será - 1 y se le asig n ará u n
valor a e r - n o . Después de una lectura exitosa, el puntero de archivo será
avanzado la cantidad de bytes efectivam ente leídos, la cual no n ecesaria
m ente será igual a c o u n t.
Capítulo T: Administración básica de archivos en Linux 143
m MtPiwcw)
(
ii*.t s « v : r t c : o r _ * j í r t t « . d « * c r ip t s r _ n u l l, d## crio to i*_'o Q o ar. nui»_bytos;
c n a r - ío a ^ r c ft - .'io il • ‘ U c t u r a _ * « r l t u r a . c * ;
t u r e w f jje » ;
/ • At r i e ; t i a rc ftiv a ?u *n t* */
: í | ( d e s c r ío t o r _ #u *n t* * s ;« n ( r o o _ jr c i* :v o , O flflO N U l) < ») (
^ * r r c r ¡* c ^ * a l* c t u .- » _ a s c r ¿ r u r a .c * | ;
\
f A C r ir : «1 ir « iv o /fl#v/rolí •/
tf(:c* scrio tC r_ fiu U * G e« rt(* /aeW ftu ll‘ , 0 _ * fi0 \i.v )) < 3) (
p ierzr('ct*n m V /nuil’);
c lM e {c * * c r iíM f_ f« « o ta ) ; / • C « r r a r e s : a a r c h iv o , ya $ue lo Itaoianas
a s ie r r o */
5 X lt(s .x rr_ F A !!.llR s);
)
• « r t r : e l a rc h iv o / t « 0 . í - o . s a r ’ l
i * d * S C f;o to r •‘ c o ra - = ;o e r ' t a p / f « > . M r * . 0 caEAT , 0 TflUt>C OJOTCNLV,
S «ÍÍ < ») {
í-é rro n * 5 « * - t a f l r 'c c . s a r * : ;
• í l C i * : c 3 s : r ¿ a t c r _ f u-er:e ■; * -a y qu e c e r r a r l o s eos i r c n iv o s a o ie r :o s
:v,c5 ;= !:• *
c l o s a ( d « s c r i o t c r _ n a ll } ;
a * i r { £ X i : -K lU < tZ r.
>
• .te - ■-==■:= i zy'ts i=ctür3_oicrLcura.c. ’
• 1 v é 2 - ; £ - : * i s i r -.asta ? s y r e s jn l e v / n u l i •/
»r.ilí[(/iua_Dytss = *e40(C6Scripto-_íu#«ía, Cn i , 18; | = 3) f
if ( * i * í : e i £ l e s s r Í 3 t o r _ n a i i , b u f, >0 < 0)
) ) > ) ) . O } } > ) ) ■ > í > j ) > ) J
O \ 'r . E je m p lo '
^ El siguien te ejemplo lee 10 by tes desde el archivo de ingreso de d ates des-
pués de s itu a r ei cur>cr en diversas ubicaciones del archivo.
t JC M P t O . \oozr* o e l a r e ñ ir a s r s«=>:.c
{•
• 9-o-c - Utilización de Ls«?i<
*/
* i ¡ x l u 3 « < iy s / ;y p 9 3 .h »
« íp c io t e < s i í i 5 . n >
« tálese <5*dLü).i>
<fc.Ttl.h>
íio :ltí9 <vftLSW-fw
l n t zain(*o¿C)
í
c f a r a< -ctíivo _ t« 3 0 0 rir‘ o ( [ - 't s c x x x x x x \
cftif 0ufp«I;
ir ¡t i , d « s c r t ® t o r _ e .-itr a ía , « s c f i f i t o r j a l l d a ;
/• Afcrir *1 archive Ci *ntr5<ta ’i
I f 'lt t s c r is C T . f f n t r a d l • «p*n<*(Jl»po*ttt«0».tAf, Q_S0QNLY)) < <l) (
cwrrcrCicer. cu ooíitivcs.txt*};
» x ;t í£ iI T
>
/• C r«ar jí; ircn ivo ttJ*ccrario para la salida '<
• « t e r n u it s i m r c _j* ((c h s r * _:«np'.Jt#i) t i jna función proxatipada
»r. « s W U 9 .r » QU1 '“« to rn a un a u n ta ro j un a rch ivo t n u p c n r io tapXXXXXX
I f ( l í l K f i p W . U l l U * t ó H * n p n r - n iv o _ :o o c o r a r * o i^ < ») {
p + r r o r ( * e « s t * * P ') ;
í*it(£x:T_F*:LiflGi;
)
• p r irM l ’ £ 1 a rc h iv e U 1 1 1 1 4 4 t i V #\n*. j r c fc lv o jr t n o o r .ir io ) ;
• E»?aol«cer la uoicacton I n i c U l <Jfl- puntero an *1 archivo no «ntn<in •t
¿ M « H (0 tse fS p tsr^ in trM t, 1 M , 3£5K.5£T);
/•
• E i c r l f i i r t i archivo s a ü c a l e í p r la t r w it»
• es « t t íO* 5 y t « la t io s a l a rcn iv o a* salaos
•/
fx (l - i < t f t ~ l) {
'•ti<j{54scripí2r_*r.:rMa, auf, I0>,
» r i* « ( « i c r i p t o r _ s a l lú a , 5uf. 1 0 ) ;
is « » k ( a « íc r io :c r _ >s n t.-3 c a , 0 3. SEEK_CUfl); l ‘ S a lt s a r s n l e s 90 o y ts s
r e s t a n t e s Ot U s e r i a c « ~ !M ’ /
>
•::o5=(asscnptoj’_éntrss= i;
: lo s g í d es c - i c t o r _ i a i 1 « s >;
íxít{£XI7_5UCCcSS);
i
E l archivo de e n tra d a , d i s p o s i t i v o s . t x t . e stá incluido (con el nombre
aev tC 9 S . t x t ) en el sirio Web de e ste libro, ju n to al código fuente de esto
capitulo. A dem ás, en lugar de asigruirlc u n nombre cualquiera al archivo de
Programación en Linux
í ik j ; A uguin u sotr» in ir c lu d a c c *
* tp ;/^ fa x varsioiflu x P lla s H iflu x - s t a n ly . A lio c in tho puributed «i
T r u n c a d o d e a rc h iv o s
O hviam ente. p a ra extender un archivo sólo hace falta escribir m ás d ato s al
mismo o colocar el p u n tero m ás allá del fin al mismo m ediante una llam ada
á l s e e k . ¿Pero cómo se puedo tru n c a r un archivo? U tilizando u n a llam ad a
a t r ú n c a t e o a f t r ú n c a t e , por supuesto. Están funciones, declarad as en
< u n i s t d . h>, tien en los siguientes prototipos:
tnt truncar*iconst char *patnnana, off_t iangthl;
int ftruflcatednt '*d, d f j t lengtM¡
Ambas llam adas perm iten acortar un archivo, especificado por au ru ta de ac
ceso pathnam e o su descriptor fd , a la longitud le n g th , y am bas reto m an 0
si han tenido éxico. Recuérdese que m uchas de las llam adas a sistem a de E/S
de archivos tienen dos formas, en este caso una ( t r ú n c a t e ) que acepta una
cadena están d ar term inada en un cero binario ( \0), y otra, ( f t r ú n c a t e ) , que
acepta u n descriptor de archivo en lugar de una ru ta de acceso. Si tiene lugar
un error, las dos llam adas reto m an I y asignan un valor adecuado a e r r n o .
Si se emplea f t r ú n c a t e , el archivo debe de ser abierto para escritura.
¿Para qué podría una desear acortar un archivo utilizando -ana de estas llam a
das? Una razón típica es para suprim ir datos innecesarios del ñnal de un archivo
preservando al mismo tiempo el resto del mismo. Trancar un archivo a la longi
tud deseada es mucho más sencillo que crear un nuevo archivo, leerlos datos que
se quieren preservar del archivo viejo, escribirlos al archivo nuevo y luego elimi
n ar el archivo viejo. Una única llam ada a trúncate o a ftruncate reemplaza a por
lo menos cuatro üam adas sucesivas, a saben Open, re a d , w r i t e y j n l i n k .
Capítulo 7: Administración básica de archivos en Unux 147
E je m p lo
El program a tru n c a r que viene a continuación es una utilidad que resulta
práctica p a ra aco rtar archivos. Acepta el nom bre do! archivo a s e r acortado
C JtM P lO seguido de la nueva longitud que se desea asignarle.
/• x c flS 'i c e i ir-c u y o n ¡n t;rr.* t: t r v c . c
/*
• tru n c a r.c • A c a t a r un arch ivo a la lo n g itu d ta c a d a S in ta x is : truncar
-w_a«^»ivo, longítuC
•/
»toe lúa* t»tdi5.í»
« in c iv le «stdluo.ft»
*;nclue# <unuta.?i*
ísjcluc» < íc n tl.r>
ir(tru R C 4 t« (« rg v (lJ, io r g it ^ J ) {
p c r r w C in m o ta * ) ;
«xi'.texir WILÜW);
}
a*¿t(£XrT_SyCC£SS);
>
La ejecución de este program a sobre un archivo llamado t e s t . t x t del di
rectorio corriente produjo ios siguientes resultadas:
£ S is -1 t e s r .t x t
- r• - r ■ r - - 1 «urr_* 2i l u S * ri 5656!J u l 2-i55:56 t a s t . t x t
\ ^ . \ r 5 tru cc t c a t . t x t 22C«
____ S iS -1 t i í t . t x t
5 A lio * r r - ! *wrt_«ail ase rs 2-300 J u l 24 15:53 te 3 t.tx t
Luego de comprobar que se ic- tra n sn n e ro n efectivamente des argum entos,
t r u n c utiliza la fundón s t r t o l p ara convertir el texto del argum ento que es-
peeñea. la n ueva longitud de- la caden a a -on entero de tipo lo n g . Después lla
m a a " " u n c a te con el nombre -de archivo que le fue tra n sferido 7 la nueva
longitud requerida. 3: la llam ada a t r ú n c a t e fracasa, el programa imprime
ur. m ensaje de error y termina. Si tiene éxito, la ejecución del mismo term ina
sin em itir ningún mensaje, retom ando el valor cero al sistem a operativo.
Aunque fu n d e nal. ei program a t~ u n c no es p a ra n ad a lo suficientem ente
robiisto como p ara ser totalm ente confiable, porque da por ser.tadu que los
argum entos que re c b e son válidos. L*n program a con la calidad suficiente
. y ,/ / . j I f l ) > ) > > } 1 t
como p a ra em plearlo sin que genere so rp resas debería confirm ar prim ero
que ei archivo especificado existe y que el nom bre áe archivo que se le ha
transferido es u n nom bre válido. Esos detalles fueron pasados por alto aquí
por razones de brevedad.
O b te n c ió n d e In fo rm a c ió n d e a rc h iv o s
Ahora el lector puede abrir, cerrar, leer, escribir y tru n c a r archivos. Sin em
bargo, tam bién se puede obtener m uellísim a información in teresa n te sobre
un archivo, como lo m u estra el comando s t a t (1):
.p e : flc g u la r = ¿ le
----------- Ucda: ( 0 $ 4 í . ' - r w - r - r - ) U id : (S«a/KUrt_W 3il> G íd : | 1M / u s c r s )
SA L,D A Cc v í c í : 3 , 2 Inode: 53 4 555 U n ks: I
A c c e s s: 3 3 t J-j í 2-t 1 6 :0 2 :5 0 tW 9(W ¡M « .0 0 :1 5 :5 6 1
Wodtíy S a t J u i 24 ’.6 :« * :2 9 19 9 9 ÍW 3 3 0 .00: U : 5 7 l
CTtang# S a t Ju L 2< I6 :0 « :Z 9 i g 9 9 !3 s 1 0 0 0 .M :U :l7 )
’ o<^ 5 t _ 6 1 k s i2 « ; ’ t w a flo i e a lo c u a p r e fe r id o */
■jrsi;*e: lo.-; oueero i e blesues oe S12 sytes V
: ik / . * fifia /' c*e 5 * 1 u I t in o acceso c e ! a r c h iv o • /
:ice_t 3t i : i s í ; • n z " i ¡ r-ora a la uLtiaa rcdificacior del arcnivo */
:i=5_: st_ sti« e; • fscna / -.era -e i u i tí t c cmcio del cor.-enico ce i ir.&ae
Ejem plo
P ara correr este program a, tran sfié ra le el nom bre del archivo que sea de su
ínteres.
/ • ■oDcre c e : p r c g r s s i en I n t e r n e t : n s : i t . c •/
r
• n c r z s _ c e _ x c 3 .c - ""C-;r=na s e n c illo ce s*a*<l). S in ta x is : uacras_de_Mdo
•I
•in sio c* « a sista .a >
Programación en Linux
Syiclude <sy5/sta:.h>
< *t< Jlib .h >
fin c lu M < *t!lio .h >
p r in tf [* ViNOíiOS: VJ\n*, b u f .« t j i lw k K
prtntfl* Uto: VS\n*. #«ir.4t_ui0)¡
p r in t r e oro: «kj\íi \ c u rs t_ g id | ;
HtíS_ISLVic<nocc))
rtrc p y{ tipo_de_arcnivo, 'VincuLo s u ib o lic o 'l;
olse íf(S_ISnE<3|itodoS)
itrcpy{tipo_de_arcn:vo, *.\rcn:vo norjial*);
ene i*<SJ50lfl{fK>0C!)
5trcpy(tipo_d9_ar:nivo1 'D ire c to rio * I;
sisa ií(S_lSCh/l{nodol |
strcpy(tit>o_<i9jjrchivo, 'D ispositivo de caracteres*);
* l i « lf(S_:SQ L.<(n o coi)
strcpy(:ip«j3e_arcniva, 'Dispositivo ae bloques*|;
alse LÍ(S_ISPIFO(uodo))
s-rcay<t:co_de_archivd, *f : f o *|;
else if(S_i3$0CXjncía)>
s:rcpyst:po_de_arcnivo. ‘ Socket*);
3 ÍS 8
strcpy{t:po_de_arcn:vo, 'Tipo desconocido*];
arir.tf|*TXP0: "isin*, tipoj3e_arcM vo);
Capí?U¡O 7: Administración básica de archivos en Linux 151
vuem as! i
üio: e
313: a
TOO: A rcn ivo normal
TJJWíiO: 5««*«
:«iWiO D€ 9.COJC:
&.COU6S: 108
ACC€0:0C: Sa t J a l J 4 1 6 : 1 8 ’ 15 tW fl
UCO.'FrOCC. Tt* Mr 23 '9:34:26 :9 «
:v»e «MlfrCAOO: Jui V 16:22:29 1999
El código a n te rio r resu lta b asta n te árido, lo adm itim os, pero sirve p ara ilu s
tr a r cómo u tilizar la fam ilia de funciones s t a t D espués do hacer que l s -
t a t recorra eí archivo p a ra recoger inform ación, el program a exhibe el valor
asignado a cada miembro de la e stru c tu ra de patrón s t a t Cuando le llega
el turco a exhibir el tipo de archivo, el program a realiza un considerable
despliegue p ara convertir un numero ininteligible en u n a forma que tenga
significado, da ah í el bloque i f . . . e l s e (que debería on realidad h ab er sido
confinada a una fundón), m stat utilizó la constante S_IFMT, m ostrada en la
:abla 7 1, p a ra dejar tu era los bits dei tipo de archivo correspondiente al mo
do de archivo, áe modo que el modo de archivo exhibido contenga sólo los
bits correspondientes a les perm isos y a Ja m odalidad de ejecución.
El código u tiliza tam bién la función c r i n e p ara convertir los valores de
a i i r é . o t i ~ e y c t i n e en una cadena q u e los u suarios puedan com prender
fácilm ente. Como en el caso anterior, e ste program a necesitaría ser refinado
pero sirve p ara poder apreciar lo que res u lta posible hacer y sirve de ad e
cuado punto de p a ra d a p a ra la confección de un program a m ás elaborado.
E n particular, se podrían agregar porciones de código p ara verificar que el
nom bre de archivo ingresado sea un nom bre válido.
M o d if ic a c ió n d e la s c a r a c t e r ís t ic a s d e u n a rc h iv o
En esta p arte le í capítulo, ei lector e n co n trará u n a sería de funciones que
modifican la información dei inode. M uchas de esas ru tin a s riener. contra
partes que son com andos de Linux. Esto-s comandos se distribuyen h a b itu a l
/ ) ) I t .1 J
152 Programación en Linux
E je m p lo
Er. este program a :io eren un archivo vacío con un conjunto de perm isos y
luego 3e utiliza f chmod partí m odificar dichos permisos.
r sonore del archivo *n Int*rn«t; cfignod.c
r
• « r o la r _ p e r r u io j.c - Cro# un «rcHivo v Iuoqo n o d tfic a su» p tn m o a de accoso
•I
«tnclud* <«dl:t».n>
♦ ínclude <a'dio..i>
*ir.ciud* < i y s í jt a t .h >
finclude <*•/»/typaa.n>
•w c lu fle <fcntl.h>
«*ÍC(EXl7_FAllüR£|; '
>
* Zcr-^r i s : o r i o s p e ro is c -s y a s o c i f i c t c o s */
W t M t 'i s - i i r c ’i i v o . / a c i Q ') ;
•*1? CEXI~_3UCC£S3),
>
La salid a de este program a será sim ila r a la siguiente:
S ./ CS S C 13 ‘ _ 3 «r* li5 0 3
R 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 ) ;
E stas dos llam adas modifican el p ropietario y el grupo del archivo especifi
cado en p a th n a n e por la cadena te rm in a d a en un cero binario (\0 ) o por el
descriptor dei archivo fd a los nuevos valores ow ner y g ro u p , respectiva*
mente. Lo mismo que el resto de las funciones discutidas en este capítulo,
estos dos re to m an 0 si tienen éxito; 3i fracasan, reto m an - 1 y asignan a
e r r n o el valor adecuado. La decisión e n tre u tiliz a r chown o fChown d e p e n
de de varios factores Si uno conoce el nom bre del archivo, probablem ente
deseará u tiliz a r chcw n. Si se h a abierto o creado el archivo utilizando o p en
o c r e a t , que re to m a n descriptores d e archivos, q u i 2 á se prefiera u tilizar
f cnown porque se conoce ol d escrip to r del archivo. Si se conoce tan to el
nombre del archivo como su descriptor, da lo mismo utilizar cualquiera de
laa dos funciones. En esa situación yo p referiría u tilizar f chown porque re
quiere m enor can tid ad de tipeo.
E je m p lo
El siguiente program a crea un archivo y luego modifica su propietario. Ob
sérvese que p a ra que el program a funcione correctam ente, debe 3er corrido
L0 por ei usuario root. Además, se d eb en reem p lazar los valores asignados er. el
código fuente a i propietario y al grupo por valores que tengan sentido p a ra
' i J ? ) i ) ) ) ) i y )
tnt nain(v6t<J)
(
uld_t prooletario • 56#¡
g:a_t grupo • too;
tnt d*jcriptor_archivo;
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:
NOTA
C o rre a c o ta ció n r .t e r e s a n t e . p orq u e m u c r e s c e a s fu o c io '-e s r e la c io n a d a s co--> fe c h a s
y ñ o ra s Linux e s t á n b a s a d a s an el coacto, el m uy puoi ¡citado p ro b le m a d e la compatiDii •
- a d c o n el arto 7GOO 'O -ta s ic o u n gran p ro fc e m a para Linux zv-dv’sód co n lo a u e se
rá ei a ñ o 2 C 3 S . D ad o q u e t l m e ^ r e s jr . e n te ro d a rlpo io n g. ei m iam o d e s b o r d a ré en
el arto 2 C 3 8 . O & ea. t i n c _ t p u c o s a lm a c e n a r h a s t a 2 3 1 - 1 s e g a d o s , o s e a
2 l¿7.ua3.fr:7 s e g u - o o s . ? ss?.-vd a p o r alto el d ía adicion al c o rre s c c riü ¡o n tc a lo s a ñ o s
Capítulo 3: Administración avanzada de archivos en Unux 159
ü<5Jestos. en C9Ú-3 arto ftsy 3c5x2£x5Cw60. o sea 31.53S.COO. segundos As' que t i -
- 0 _ t n^0O3 aJmecery máximo do yrn&taor de 63 años ’2.147 483.547 /
3 1 536.000 . Co<no ? £'= ' W i n r a ín í ¿i*o 1970. ««mándale 63 aros 3t nt:&-rrci 30
3 1-.-3 3 ) .-^0' 2038-1-3 ■
Cecra y hora exacta en 13 aue «seo-dará varia, doo<^-
s .i^ vío «Je cuántos segados existan en catía año bisiesto.
E je m p lo
El siguiente program a crea un archivo y establece sus valores a tim e y m t i •
i e a septiem bre 3. 2001 Por ra=on<?s dy brevedad se ha omitido del código
fuente la verificación de errores.
r Kcwrt u'u a ^ 'a * » ir íntacret: emjtu<» = V
^jf-sctia* = <*•>;
Daf.ncctiac 1 no»;
P R E C A U C IÓ N
5 mate**'»' C« esta sccz-rr es svrvjmcrct: «s;»of5co a) Slssyster. pnrcpai oe Unux.
€C2. cctocoo mente ;orro '¡^syster- ce Segjnda Extensión. Otras ■•eoicnes de
.v a t*-or ta ~ ié n as S n c c -e s y estructuras Q u e varrea a correcta', psro legu-
ramente no te v y. s cemootar de '-a manea que se Escrito aquí Si usted utiliza « t a s
3r-_=C33 en un programa serpeo zsrz ser » rte&e. cece rodéanos con # if 3 9 f3 aarg
su tóófco co^-cmj y coenj 3O«CiOCameir.0 en 3*3térras cue ro sean Unux.
E je m p lo
El program a de dem ostración que v-.ene a continuación activa los atributos
sync y no-dum p p ara el archivo tra n sie n d o como su único argum ento.
• V » c -f U'. c o r s a s «n I n t t m t t : j * t 9x : 2 .c */
/•
• t c t ; v * r _ « , t 2 . c - * c t u i 1 3 1 t r d i : * c c r « » « s o v c la U * a r o n a t o » ¡¡o- «x*,2
V
• tn clu ct
tircl-jc* oja:»:c.n>
*:ncl.<3« < í t c l i 0 .ft»
l w i . i l < ltíli.í>
fl'K lv ec «cn?l.i*>
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 );
>
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 );
• TCO
C O N S E JO
L-nus eos cofngrvjos. c f 'a t t r y 15 a T T r , Q^e estaolecen a Interrogar 'os atflbu-
•.35 « » K ' í i « s Oo w?2 OUCUfcW» eo esta secc-ir Res-omitíarente. c h a t t r re cerrrurs
a yno K tü ü e e tr tos ¿".nüutos «Dedales. rr>«ntr3s au« I s a t t r « r ib e 0 3 atributos
« ? K ?'»3 *>t2 que estén activa*». 31 tos fcuOtera. E - 'a corr oa de demostración 3sl
DTOgrama arorior. (a S mayúscula rtíica cuc el atributo 0CT2_SYNC_Fl. (sy«C) ha s-do
*s?vad3. y 3 tí rrarOscuia nxiica <?je » atrQuto £xr2_f«30UUP R . támtsén na sido oc-
óv*}Q. Ver man c n a t t r y !»an I s a t t " para ootener"-né3 ¿e:a7-es.
¡ ¡ E S E E S directorios
Aunque los directorías son sim plem ente archivos que contienen u n a lista do
‘.os archivos alm acenados en ellos, tienen unn interfaz aspecial de p rogram a
ción para m anipularlos.
M o d if ic a c ió n d e d ire c to rio s
La lia m a d A requerida p ara av erig u ar el directorio corriente de trnb^jo es
g etcw d '.getM obtener, cwdecu rrtn t w orking dirretory). declarada en
< u n i s td .h > Su prototipo es el siguiente:
cnar •g#:e»c{cn*.- *cvf, t u i . t > u t|;
g e tc w a copia a b u fia ru ta absoluta de acceso al directono co m en te Ha ru ta
completa d w d e el diructono raíz, cuya longitud es de s i z o bytes. Si b u f no
es lo suficientem ente grande como p ara poder alm acenar la ru ta de acceso,
g etcw d re to m a NULL y asigna a e r r n o e l valor EflANGE. Si llegase a ocurrir-
le eso. aum ente el tam año de buf y vuelva a probar. Como altern ativ a, si en
g etcw d se hace arb itrariam en te b u f igual NTJLL y se le asigna a S iz e un
valor m enor que 0. g e tc w d em pleará m al lo e p ara asignar dinám icam ente
la suficiente m em oria p a ra b u f. S i el lector desea sacar partido de e sta va
rian te debe recordar de liberar el buffer p a ra ev itar fúgaa de mem oria
P a ra m odificar el directorio co m en te, u tilice indistintam ente la ru tin a c h -
O ir o la f c b d i r . p rotodpadas en < u n i s t d . n > de la siguiente m anera
int cftfltrfcoftít cnar *ps:n);
Iflt fCftfltrCM ía>;
C ^ d ir hace que ei directorio corriente p ase a ser el que se encuentra expre
sado en p a th (ru ta de acceso!, f c h d i r bace la mism a cosa, excepto que se le
debe tran sfe rir u n descriptor f d de u n archivo de directorio abierto.
E je m p lo s
1 E l siguiente program a. d i r _ c o r r i e n t e . que reto m a el directorio co
m e n te de trabajo, utiliza p ara ello g e tc w d , em pleando los dos métodos re
cién comentados, de asignación de espacio de alm acenam iento p a ra poder
alojar el nom bre de dicho directorio.
• 'o te rt es: prograw « Jotrn»-: cwd.C */
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 •/
)
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 );
)
La salid a de este program a tieno a n aspecto sim ilar ni sigusonte:
•/
f in c lid » «unuttf.ft*
finelgflc <it9UD.B>
fifld o d t <íT2ÍO.H>
• in clw flt <ir-fto.->
)
i y s : t n c is * i¿
•<ttl£x:r_SXC€SS);
)
* “ jo o ia r 4 ir SWS*
**5 91n/ ooc/ ♦*«/ Isg/ pro|«cts/ trcl tnpí
*
3a 1 1 o a ;*»o«*;*uPt.«tIl/proj#eM/ls«/M/vc
La salida de este program a sim plem ente d em u estra que la llam ada n c n d l r
tuvo ¿ u to . O bsérvese que cuando el program a sale, uno sigue estando en ul
directorio original. Esto se debe a q u e el program a se ejecuta en una sub-in-
te ría i. y u n cambio de directo n o s en una sub-interfaz no afecta al directorio
corriente de la interfaz padre.
E je m p lo s
•lÜ/ l El prim er program a orea un directorio cuyo nombre es transferido como
ü=X único argum ento del mismo,
ije w p u o *K>«t5r * a e l a-ogrun a «n ;n t « r n * t : n u w d ir.c •/
/*
• n u t v o j l '- . c C r* i un d ir « c !o r l& . S íi1‘ Aj(1S: ■VjíVO_filr «0 H b r9_d ir# et0 rl0
•I
íiocl'jde f-n i»:d ..i>
♦incluí! <fcntl.n>
ln t B n m iin t a rg e . cn ar * « r o v [ J )
í
ir< a k á ir (jr g v [i;, 9?SSi) (
p trro rj'M d ir'l;
#Xit(EXlT_FAlLUK>;
)
»*lt{6X[T_Sl>CC£3S>;
►
\7V7- s is -W
a ' t x r - x * x 2 k u r' « a ll u $« rs 10 2 4 J u l 2 5 2 3 : * 6 ?00
SALIDA
(
l f ( r * J i r ( ar ^ v J - ] ) ) (
9 * r n r i'r x s ir ');
m t< E * lT _ f A lU * É );
>
m tta r ja s » ) ;
)
E ste program a es aú n m ás simple que el dei ejemplo anterior. In ten ta elim i
n a r el directorio especificado, finalizando ab ru p tam en te si fracasa. La lla
m ada puede fracasar ci ol directorio no se encuentra vacio, si no existe o si ol
ttsuar.o quo corr* «•! program a carece de los suficientes permisos como p ara
elim inar ese directorio
1 iliiiiu r d i- to a
s a l id a L is ta d o d e un d ire c to rio
L istar un directorio nignifica sim plem ente leer el contenido del respectivo
archivo directorio. E! procedimiento básico no C3 complicado:
1 A brir el correspondiente archivo de directorio utilizando o p e n d ir .
2. L*er su contenido empleando re a d d i r y, ta i vez, r e w in d d i r p a ra vol
ver a pcsicionar el puntero al comienzo dei archivo si es que se lo ha
leído h a sta el final y se desea comenzar de nuevo.
3. C errar el archivo de directorio utilizando c i o s e d i r .
Todas e sta s funciones están declaradas en < d i r e n t . h> Sus prototipos son
los y ^ u ien tcs:
o :: •^iy¡ir{cor^z cnar «patrnuM );
st^uc? « ic e r» «rsadairiO M '<3ir|;
in t rniroúiriOlñ *3ir);
i n : ílcseaiP'SIfi *-3ir);
PRECAUCION
$<3io mo <n loo ml*rrOnm intcftratfes <jc lo otfnrctorn d i r o n t , <}_r.aire[ J. or. potable
(ei doclr. «ata doflnkfc por el csttoJir POSIX com© de ccnducM pfWoabie tooas to* sts-
renvjs <iuo awton cbcna normo). Todos tos aomfts inorr*yos tjt/.ñn deAnkctos (xx ®i siatoira
y deoeoMn cei mimo. OJ modo nun o o rtr w y/o ol too da <n*os quo conüonon pooco
.annr oc .n •••itcma i o>ro. Algunos 'llosyíKems. pa* eftmpo, oún '.'mitán los nonhrtv. de .v
c ív a » a 14 carachos, menlras une oíros. co>vo Lnux. potmtten hatía 2S6 coractcroo
E je m p lo
El « g u íen te programn, l i s t a r _ d i r , listu el contenido del directorio cuyo
nombre le os tra n sie n d o en ¡a línea de comandos:
C U M PLO /• .Honor» cnl pro^rana on Jntornot: ll s t d i r .c •/
r
• lls ta r^ d ir.c - le* un arcnivo 3» dire cto rio . Sintaxis: l u t a r d ir notónj
directorio
•include <stdlo.h>
♦ incli/Ue < 5 * d lib .n >
«inciudo <air«flt.n>
á ? iir _ s i_ s r r o r( ’ jM n t lir * );
• e iI = í( B i_ < J if « r tt = * í a - : c i r . ; d i r ) | 1- KVL'.I
i r i.- :- *V :Í : «ts i — , - ii jji .r s n - - > c _ r a / J 9 ) ;
c l3 5 e -3 ir(d irj;
« it{ c X I\5 J C C S $ S ¡;
)
v o ic t a l i r _ s l j r r - ^ ( c i-.3r - J é i s a j t )
<
M rro rfn e -iM fe );
í«it{cX:T_=AtluaS};
)
E; lazo w tiile constituye el núcleo de oste código. El mismo llam a ropetirin-
mcnte a r e a d d i r para recorrer la secuencia de caracteres preaenU* un el arch i
vo de directorio h asta que ñnalm entc t i to m a NULL y ol program a abandona ol
laxo. En cada iteración imprime el nombro del archivo (m y d íre n t ->d_name)
La siguióme salida ilustra el comportam iento de l i s t a r _ d í r
S ./Li«t*r_dir
t : .
2 t ..
« IÜ da 3 ;
* : KtKtflU
i : c*aoUr_f*cftyfw».c
! : Capitulo W .n p
? • dtr_corri«rrtt.c
3 : out
9 : t i tw » r _ « i t 2 .e
i# : «liian*r_air.c
11 : rtu e v c jlir.c
12 : c * e o ia r_ sir.c
13 : l i i t s r _ 3 i r .c
Multiplexing de E /S
M idúplexing es u n a p alab ra que e n in fo rm ática significa efectuar operacio
nes de lectura/escritura con varios archivos sim ultáneam ente. Ejemplos de
m ultiplexing lo constituyen, ios navegadores de Web que abren m últiples co
nexiones de red p sr* descargar tanto m aterial de una pagina Web como les
resulte posible hacerlo al mismo tiem po y las aplicaciones de cliente/servidor
1 7 0 Programación en Linux
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 ¿ .
S p ip t í 3
• N o cir? d e l o -o gran a en i n t e r n e :: n p le x .c •!
/•
• n u lT io ls x .c - Lee c a tc s destíe p ip e ' y p ip c2
• utilizando una lia?-ada a select
• Adaptado ce « o * - s e l e c t . c , e s c r i t o zor
• V ic c a e l jcrrnson y S ríX Trsan. U t iliz a a o con o i consentiruento
• de lo 3 autores ¿e lú iu x A a p líc a tio n Oavelcotent,
• M ícto a l Johnson y Erí:< Troan.
« irc k id e <fcntl.n>
♦Include <3tdio.n>
♦in d u c e <unlatd.h>
«in clu d» < s t d li0 .h >
n» - v m o j v f ao
in t aatn(void)
(
m : d « 5 c r i_ a r c .ilv o I 2 J; / • A r r o ll o ce d c s c r ip to r e o de « rc n iv o •/
cftar b u f( ’ Aj*A«o_Büf];
:n t i , co n tad o r j i a r a c t e r c * . n *y o r_ d o a cr;
•d _ 5 « : c ) t : _ a e i c r s ; / • Conjunto de d e s c r ip to r a » do io t arch ivo » qu« aeran
lo ic o j */
fd _ so t p en d ien tes de lo e tu r a ; / • C opla de c ; t o o o se rs a ara <}u# la
a c t u a lic e s e la o t •/
r A o r ir lo s p ip e s */
I^ ((c a s c r 5 _ a r c íiiv o í0 | « 0 p an {’ p i p e r , OJMXWLY , O_«JN0LCCK)> < C|
a a l i r _ j i _ « r r o r ( ‘ E rro r a l w r i r p i s a i * ) ;
i r ( ld * s c r 5 _ a r c n iv o p | = o p 8 n ( 'p ip e 2 \ G _fiX «Lv ¡ OJtONBlOCKI) < d)
s a l i r j » i _ a f r o r ( * E r r a r a l a o r i r p ip e 2 ‘ ) ;
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.
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.
E je m p lo
El •siguiente program a, ■ñapear, m ap ea y luego desm anea un archivo especi
ficado en la lin ea de comando».
• v x c re u i progr&na *r. In ta m ítr a&sjp.c '/
r
• M g e ir.e • C -'iit* i aewry -jcoad f ile . S ln ta x ii: «apear n>nora <lo archivo
•/
finehxfe <*yi tyc«s.n>
•laclvct «sys/stac.n»
i i x h a t «vrustc.rw
«iitcluoe <fcntl..*v>
*LT'l¿2a «s ta lta .r.»
í i x . 'j c a <s:cio .t>
ro l z s iiir_ 5 i_ e rro r{c iu r * u n M | s };
i r : a ain(tnt i r j c , cnar **rgv{])
{ •¡* ÍC
Programación en Unux
ir ; Ge3c-ijnor_4rcf!ive:
v o ta t .j o :
3 tru c t s ta t s ta to u f;
<
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 )
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.
i r : «IocScaiI(ín: 'la c s :;
i-it 1.:i: ;
) I f ). \ I ) ) ) f J ) ? ) ) ) ) > }
1 80 Programación en Linux
E je m p lo
El program a que sigue, c a t jn a p o a d o , im plom onta el comando c a t u tili
zando m apas de archivos en mem oria. Aunque* e sta es una im plcm entación
e4CMi>t.o olemuntal. m ueatru c larim en to cómo llevar a cabo E/S de archivos em plean
do im ágenes en m em oria de loa mismos.
• Vonürn a s i c r o q r j r j «p I n te r n e t: ifitcat ‘ I
r
• ca r jia o e a flo .c - In p le n o n ta c io r do c a t ( t ) anpleando r a c a s en neaioria
• S iflM X U : :at_T 4 oeaao nwraro de a rc h iv o
•I
v J if l i a : i r _ s i _ e r r o r ( c n a r 'o e n s s ie );
) ) I J ) ) / > ) ) ) t > > ) * * > } ; ; j )
C a e d le 8: A dm inistración avan zad a d e arch ivos en Linux 181
(
i n t :e s c r :a t o c - arc.iív©;
cftar ‘ f j íf lt * ;
« 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 ;
/• « rita I t ©ut •/
•n:*(STOOuT_F!w£íio. »tatbu# .»t_*iz*|;
/• ProLijar •/
0 9
c l t t l M t c r l t o r .« r c n w o ) ;
statayf . it _ s iz « ) ;
«ais u i ir _ i i_ * r r o r ( c M r ‘ w nsaja)
{
p trro r (M a s a je );
* * it ( t x iT _ F A :u ^ £ ) ;
>
Programación en Unux
CONSEJO
Desa punto de s-.sra practico, o; umpeo de un archivo macoodo v memo-a e~. este
e/ítrolo oQuivaila a partir ur a nuez con Lira prensa hidráulica, Cüriuo no proveía ninguna
veníala ■en ‘érminos <<; dcscrpoño o do er.ens'ón de código. Sin e r r ó lo , en 3--k>ocio-
re 3 en que e' cesempeto resulto crucial o cuando uno está en'rent&ao a ope'asftyves v>
ticas o<-. chanto a tiempo. los archivos n-ac^sdos un memoria pueden representar jna evi
<Jc*:o .«rttoja el ñapeo e - memoria puede tomoión resultar valioso on circunstancias er.
aooce se «»uloro una aüa seguridad 103 orocesos cve corren con prtviittgios do root
pueden Moquear lo» Archivos boqueadas on memoria, evitando así que «san oermutado-.
a di3cc cor 9l admirtütmdor do memora do Lnux. Como resu tnao. los archivo', w t co>
'.iwcn datos cue deben ser rosgjardacos. tales como los do contraseñas o Ce nómina oe
oaitav ser an -rnr-os prodlwn a sor rnvisados. Por supuesto, en una situoc6- as¡. la « a -
pecSva región do memoria to-dría oua ser ostnbloddo a PAOTjíCNE de modo que ofos
proceson no .•Mocados no puedan leer dicha roglón.
Bloqueo da archivos
El bloqueo de archivos es un método que perm ite quo vano» procesos p u e
dan accodor el mismo archivo sim u ltán eam en te de unn m uñera segura, ra
cional y predecible. Cada proceso que bloquea un archivo lo hace p a ra e v itar
quo otros proceoon modifiquen los datos presenten en «1 miRmo m ientras ese
proceso se en cu en tra trabajando con ol nrclnvo. No existe una razón especifi
ca por la cual a dos procesos no se les deba p erm itir leer diíl mismo archivo
sim ultáneam ente, pero im aginem os la confusión que resultar:» si dos proce
sos estuviesen escribiendo al mismo archivo al mismo tiempo Con toda pro
babilidad cada uno de ello3 sobrescribiría los datos del otro o. en algunos ca
sos. corrom pería totalm ente el archivo.
El procedimiento general s> se desea acceder a u n archivo bloqueado se lista
a continuación:
!. Verifique la presencia de un bloqueo.
2. Si el archivo no se encuentra bloqueado, establezca su propio bloqueado
3. A bra el archivo.
4. Procese el urchivo de la m an era que resu lte necesario.
5. Cierre el archivo.
6 . Desbloquee el archivo.
Observe cómo ei proceso bloquea el archivo an tes de d ar comienzo a cuxJ-
qu ier operación de E/S y com pleta todo el procesam iento del mismo an tes de
proceder a desbloquearlo. E ste procedim iento g a ran tiza que iodos los proco-
sos que lleve a cabo su program a no sean Interrum pidos pnr otros procesos
ajenos a i mismo. Si uno abre el archivo an tes de proceder a bloquearlo o lo
cierra después de proceder a desbloquearlo, otro proceso podrís acceder el
archivo en la tracción de segundo que tran scu rre entre ¡a operación de blo-
qneo/desbioqueo y la ce apertura/cierre.
Capítulo 8: Administración avanzada de archivos en Linux 183
izr-.r irenive
lle v a * a z iz c e i p ro c is a n s n ro a d ic io n a l re c -ja ric o
:ti“ « r e i a rc h iy o
i ’ J lf á r 3*svi-iCbl5r. a. ir c n i. c :a blOQuíO
ana i f
La utilización de 0_EXCL cuando se abre el archivo de bloqueo garan tiza que ia
llam ada a. C?9 n sea atómica, es decir, que no sea interrum pida por el kemeL
Ssto ¿s im portante porque se puede d a r una. probable condición de competencia
r o e condiíior. cuando dos procesos tr a ta n de abrir el mismo archivo. U n se-
gundo proceso podría a b n r el archivo m ien tras la llam ada a open del prim er
proceso está ¿iendo interrum pida por e l kemeL E¿ empleo de 0_EXCL evita es-
) ) i ) ) J- J 'J ) ) ) ) ) ) ) ) ) ) } )
134 Programación en Linux
E je m p lo
Este program a crea u n archivo de bloqueo, y luego tr a ta de bloquear el a r
chivo principal u n a segunda vez. El segundo in ten to fr a c a s a r! E l propósito
EJEMPLO de! program a es iiu stra r la lógica correcta a em plear p ara utilizar ios arc h i
vos de bloqueo.
/• NosCr.» cal orojrana 9n Internet: lo c k it.c •/
/•
* bloquearJirchivo.c - U tilización Oe archivos de Cloqueo. Sintaxis: cloquear
bloquea.-. c.Ick
•I
*include <ynistd.n>
ílnclude <*cntL.h»
einclude '«rrn o .n > r Por la posible presencia de EEXIS" •/
*inclu<l* <atdliti.h>
íincluflé <3t3¿0.h>
3 *i*.{£xr*_SuCC£SS);
>
U na corrida de dem ostración de l o c k i t produce la siguiente salida:
5 ;Dlocj=a-_archivo &ioqu«ar_arcftivc.e.lcJc
SIckjuíc astailacldc :c* íí?« prograna aaor» al archivo
£1 3rcíiir3 yt 35 «Kuffttra Siojusaao ser otro proceso
A menos que ocurra algo inesperado. & io q u e a r_ a rc h .iv o bloqueará debida
mente el archivo (cuyo nombre le es pasado al programa como újuco argum ento
en la línea de comandes?) cuando se ejrcute la prim era sentencia open. Después,
en la segunda sentencia acen . D lo q u e a r_ a rc ftív o trata de bloquear el mismo
archivo una segunda vez creando el mismo archivo de bloqueo. Lu especificación
de 0_Cfl£AT en la llam ada a open. ju n to con OJ-XCL. significa quo la llamada a
opeñ fracasará si el archivo yo existiese- Para exprra&rio en otras palabras, la
creación o ap ertu ra de un archivo do bloqueo utilizando la aintaxm moatruda <;n
sil «íjomplo anterior es totalm ente equivalente a bloquear el archivo cuyo nombro
so obtiene eliminando la expresión . !c k de dicho archivo de bloqueo; eliminar
ur. archivo de bloqueo es exactam ente lo mismo que desbloquear un archivo. Co
mo la segunda apertura del archivo do bloqueo fracasa, el programa informa
que el archivo ya se encuentra bloqueado. Ya do nuevo en el bloque cornwpcm-
diente 4 mainO, el programa ¿ e rr a ol dnscnptor do archivo y desvincula (aupri •
me) el archivo do bloqueo, desbloqueando así el archivo principal.
B lo q u e o d e s ó lo c i e r t o s r e g i s t r o s
Aunque los archivos de bloqueo son sencillos de utilizar, tienen v a n a s des
ventajas im portantes:
• C uando un archivo <e bloquea, nn se en co n trará tampoco disponible pa
ra otro- procesos que m eram en te q u ieren leer tos datos del mismo
• El indicador 0_SXCL es confiable solam ente en los filosyscems locales,
no en filesystem s de red a l e s como el NFS
• Los bloqueos son sólo inform ativos; los procesos pueden ignorarlos.
• S i iin proceso term in ara an tes de elim in ar un archivo de bloqueo (el
que term ina en .Ick ). éste perm anece activo p ara el correspondiente
archivo bloqueado y los dem ás procesos no cuentan con u n a m anera
efectiva de d eterm in ar 3 i se tr a ta de un bloqueo ya perimido, es decir,
dejado allí por u n proceso que finalizó prem aturam ente.
E stas lim itaciones condujeron al desarrollo del bloqueo de registros, que
brinda a los program adores ia capacidad de bloquear regiones específicas de
les archivos, denom inadas registros. Los bloqueos de registros, alg u n as ve-
Programación en Linux
ccs denom inados POSIX, perm iten que distin to s procesos bloqueen diferen
tes porciones del mismo archivo o que. inclusive, lean loa mismos segm entos
del mismo archivo. Los bloqueos de registros tam bién funcionan adecuada
m ente sobre NFS y otros ñlesystem s de red. Finalm ente, dado que el control
de los registros bloqueados es llevado a cabo por el k em ei, cuando un proce
do term ina, su s registros bloqueados son autom áticam ente liberados.
Los bloqueos POSDí vienen asim ism o en dos variedades: bloqueos de lectura
o com partidos y bloqueos de esentura o exclusivos. Los bloqueos de lectura
se denom inan tam bién com partidos porque muchos procesos pueden estab le
cer al mismo tiem po este tipo de bloqueos sobro la mism a región de un a r
chivo Los bloqueos exclusivos, por otro Indo, evitan el acceso a u n a región
bloqueada m ientras que los mismos se en cu en tren un vigencia. Además, uno
ao pueda cre ar un bloqueo de escritura m ientra» «e encuentre en vigencia
un bloqueo de lectura p a ra la misma zona do un archivo.
NOTA
Recordase -mi cwtuio 4. •Procesos’ , qu» ios procesos nvos no heredan ¡os bloqueos oe
■ircnno* cuando tiene lugar un Cork, owxjua por el connivió un proceso ¡niciaflo mncmnto
una Herrada a ewc herede. .j« hecho, too archivos bloque*»* rrnmeníi» *. podro.
✓ La 'tarr.aúa i s-stema lseek esta cutortfta «n 'Po 3.-oooarrilento dol punteo <J* archivo',
pagír-e
E je m p lo
El program a siguiente. b l o q u ® a r _ r a g i s t r o s . establece u n bloqueo de es-
c n tu r a sobre u n a p arte de un archivo y un bloqueo de lectura sobre o tra p a r
te S j j»e corre este program a en dos v e n ta n a s de term inal, se puede ap reciar
claram ente como funcionan tos bloqueos de registros.
• hoooí-* fl*I p*og*i*4 «n Internet: recicK.c
IflX
(
y it <3e*ef!0tor_ircfttvo;
nr'jCt f l oc» 6lW_r«g;
/•
• E i t W l K i r un al¡>ru« ae e s c r itu r a la sr*
• lo s j lr i a c s ! M oytes fiel ercíUva
•I
3 loa_'ffl.l_tyc« • sjWtOC;
fcloo_r*fl.l_eneflc« ■ * S££X_9<0;
9 lo q _ re g .l_ * t3 rt = •;
aloq_r« g.I_l« fl -
c ís ta a le c e r e i oicccec •/
i f ( | fs n tl(c e s c rie :c r_ » rc h iv o , ?_3€Tu<. i c i a c j t f l ) )
put9( •Sioc-.eo 34 e s c ritu re est-isU cia a * } ;
3 Isa {
f:ntl(fle*c-'ipter- ircniva> FJSETLX, 4blc<j_r« g );
p r if lt fr * * f liS t r o s ya 3 lo c j« a a t pa<*3 e s c ritu ra aor jroesso PIO *KJ\r*.
:ioa_"*:.l_cis;;
.1 ) ) f ) ) J ) i ) ) t ) / ) ) í t ) > 1
188 Programación en Linux
/* Añora a s t s b la c e r un b lc q u e : da l e c t u r a • ;
b lo < 5 _ 'í!;,'._ t y :s ■» ?_3DLCX;
b lo q _ re < l.l_ w a n c e * SEE:<_5H0¡
DÍoq_r^g.i_stact = 0;
b i o c j - s g .l ^ l e n = 100 :
if( :fc a t l( < J€ s c r U > t o r _ 3 r c h iv o . F_Se‘TLKH, ib lo c ^ r a g ))
w t 3 ( ’ S lo cu e o co lg c t u r a e s t a o le c iC o ’ ) ;
9isa {
í c n t l l d e s c r l p w r j u 'c h i v o , ?_GeiUC, 4 ¡Jio a _ r* g > ;
o > -ii!tfv * fia g :itro 3 ya o loauead os nara le c tu r a por p ro ceso °ID w n \
c l o q _ r s g . l o íd ) ;
)
38tc h a r ¡) ;
«M itlÉX IT 5ÜCCES5Í;
J
Lo que viene
E ste capítulo extendió la discusión de la E/S ce archivos, concentrándose en
sus características avanzadas tales como m anipulación de directorios, m a-
peo de archivos en m eraona y bloqueo de archivos. El próximo capitulo,
T teem o n s’. an aliza la creación de procesos en segundo plano, lo que finali
zará la sección correspondiente a program ación de ¿is te mas.
4
9
Daemons
En este capitulo, o! lector aprenderá cómo crear un ’daem on', pronunciad»
¿émon. Los daem ons 30n procesos ejecutados cu segundo plano que corren do
m anera no interactiva. G eneralm ente proveen algún tipo de servicio, yo sea
p ara el sistem a en su conjunto o p ara determ inados programa* de usuario.
Este capitulo cubre los siguientes tem as:
• Las características de los daem ons
• Las reglas p a ra la creación de dae mona
• La* llam adas a fu ndones que d eben em plearse cuando se program a un
daem on
• Cómo tra b a ja r con la u tilidad s y s l o g
• Cómo deben a d m in istrar los daem oos los erro res en tiem po de ujocución
Todos los programa.? de este capítulo p u ed en ser encontrados en el sitio Web
n t t p : / / * v w v .n c p .c c ,n / i n f o baju el n ú m ero de ISBN 0789722131.
) ) ) ) ) ) - \ ) ) ) ) ) ) ) )
192 Programación en Linux
✓ Los rjucci do procesos y los lidoros do procesó conV.ituyon c.‘ teme do ‘Grupos tío proce
sos.* stfgine 76. . .. ...............
Creando un Daemon
Para crear un programa que se comporte como un daemon mío debe seguir una’»
pocas reglas sencillas y llam ar a varias funciones, todas las cualcts h an .sido vis
tas por el lector en ios capítulo» previos. En el caso de lo» daemons, sin embargo,
la manipulación do errores presenta dificultad»^ especiales y requiere que el pro
grama use la utilidad do ingreso al «interna, s y s lo g , pora enviar mensajes al re-
sTstrodol .¡.Htemn (que a menudo en el archivo /v a r/io g .-m e s sa g e s). Este tema
so cubre en ‘‘Manipulación do errores", m ás adelanto en este mismo capítulo.
Existen unos pocos pasas sencillos a seguir para cro.'ir un daemon que al mismo
tiempo ae desempeñe adecuadamente y so coordine correctamente con el sistema.
Pnm ero se debe ejecutar un f o r k p ara hacer term in ar al proceso padre. Igual
que la mayoría de los programas, los daem ons son iniciados desde un scripí de
interfaz o desde la linea de comandos. Sin embargo, los daemons son diferentes
a loa programas de aplicación porque no 3on interactivos: corren en segundo
plano y, como resultado de ello, no poseen u n a term inal de control. Como pri-
m er paso tendiente a desem barazarse de la term inal de control, su proceso pa
dre efectúa un f o r k y term ina. Si uno reflexiona un minuto sobre elio, esto tie
ne totalm ente sentido. Los daemons no leen de s te lin ni escriben a s t d o u t o
a s t d e r r , de modo que no necesitan en absoluto de u n a interfaz con un term i
nal, excepto p ara que ésta los haga comenzar.
El segundo paso consiste en cre a r u n a n u ev a sesión por medio de la llam ada
a s e t s id . La U am aca a s e t s 1 0 desconecta dicho proceso de cualquier te r
minal E n otras palabras, esto hace que el proceso lujo (el daemon) no posea
un term inal de control. El program a co n tin ú a ejecutándose, por supuesto.
Capítulo 9: Daemons 193
El paso siguiente es hacer que el directorio corriente de trabajo (cwd) del pro
ceso sea ei directorio raíz- E?*o re su lta necesario porque cualquier proceso cu
yo directorio co m en te se encuentre sobre un ñlesystem montado evitará que
dicho Slesvstem pueda se r desm ontado. N orm alm ente este es el comporta
miento deseado pero. 31 el sistem a debe p a sar a modo monousuario por alguna
razón, u n proceso dsem on corriendo sobre un ñlesystem moneado se con g erie,
en el mejor de los casos, en una m olestia p ara el superusuorio (purque éste de
be encontrar el proceso problemático y eliminarlo), o. en una situación de
emergencia, u n a verdadera am enaza p a ra la integridad del sistem a (porque
evita que un filesystem mentado en u n disco que p resenta problemas pueda
ser desmontado?. H acer que el directorio de trabajo de un daemon soa ol direc
torio raíz es una m anera segura de e v itar am bas posibilidades.
Luego viene establecer la u n a sk a C. S3te paso es necesario p ara prevenir
que la urcask heredada por el daem on in terfiera con la creación do archivos
y directorios. Consideremos la siguiente situación: un daemon h ered a una
u ~ a s ’< de 055. que elim ina los perm isos de lectura y ejecución p ara ol grupo
del propietario y p ara los dem ás u suarios. Si el daem on luego procediera a
crear un archivo, por ejemplo de dato s, el archivo asi creado podría se r leído,
escrito y ejecutado por el u¿uuno. pero el grupo y el resto de ios u suarios só
lo podría escribirlo, lo cual seria absurdo. Sem ejante situación 3e evita h a
c e n d ó la del daemon igual a <3 Tam bién le otorga al daem on m ayor
flexibilidad para croar archivos porquo. con u n a u.nask de 0. el daem on p u e
do establecer con precisión los perm isos quo sean requeridos en lugar do te
ner que conform arse con los valores predeterm inado* del alaterna.
F inalm ente ie deberá cerrar cu alq u ier descriptor de archivo que el proceso
hijo huya heredado pero no necesite. Ente es sencillam ente un paso dictado
por ci sentido común No existe razón valedera p a ra que u n proceso hijo
m antenga abiertos descriptores heredados de su proceso padre. La lista de
descriptores de archivo candidatos a ser cerrados incluye por lo menos S t ■
d in , s t d o u t y s t d e r r O tros descriptores de archivo abiertos, tales como
tquello* que se refieran a archivos d e configuración o de datos, puoden re
querir asimismo ser cerrados E'U-e paso depende de las necesidades y re q u e
rim ientos del daem on en cuestión, d e modo que re su lta difícil establecer esta
regla de m anera m ás precisa
L la m a d a s a fu n c io n e s
P ara sau sfa ce r los requerim ientos d e l p rim er Item so debe llam ar u f o r k
p ara en g en d rar un proceso hijo y luego h acer que el proceso padre llam e a
e x i t . P a ra elim inar el term inal de control se debe crear u n a nueva sesión
llam ando a s e t s i d , que se en cu en tra d eclarada en < u n i s td .h > y tien e el
siguiente formato:
p :c .t HtJiCivoW);
s e t s i d crea una nueva sesión y u n nuevo grupo de procesos. El daem on será
entonces el líder de la nueva sesión y el líder de grupo de procesos del nuevo
grupo de procesos. La llam ada a s e t s id g aran tiza tam bién que la nueva se
sión no tenga un term inal de control Si ei proceso que efectúa la llam ada es
ya un líd er de grupo de procesos, sin embargo. la llam ada a s e t s i d fracasará.
Program ación en Linux
E je m p lo
El siguiente daom on crea un nuevo archivo de registro. / v a r / l o g / I p e c a •
t e d . lO Q , y escribe la focha y hora al mismo cada minuto. A 5n de que el
f Jf MPLO daeraon funciono, debo sor iniciado pur ol u suario root.
/• Ipedated ( U 7 7 1 no e x i s t e en I n t ? r n « t . Lo que hay B íjO IdUflílCO “.oubro OS un»
v a ru rtfl d *l
m iao qu» i « encuentra nao adolanto en e»to niiaa capítulo •/
Lnt Min<voidt
l
ptd_: pid, s id; /• pía - icentir'icador oe procesa: Jid « iden tifica-
sor as sesior- •)
t u a . t tirabuf;
t n t c 9 5 c r i o to r _ a r c n iv o , lo n g i tu d ;
p id - f o r k ( | ;
íf < p l d < 8} {
p e r r a r {* ío r K * > ;
«xitisxir_FA¿LJRS);
i f ( p i d > 3)
/• En e. pracsso aaOre. *r.ara, s a l i r •/
é*it(Ex:r_sw:cessi;
r A fo ra , en a i cro c eso h i j o • /
/ * P r ia e r o , d a r conienzo a jn a nu av a s e $ io n */
C a p itu lo 9 : D 3 e m o n s 1 9 5
i« ((U 0 * « ts id O ) < 4; {
o trro rj • » : * « • ) ;
}
/ * a c o n i r u a c i o r . , ^ a cer cu» e i c i r a c t o r x o c o r r i e r e u« r r a c a j o sea « 1
5 i r * c ; o r j o r a i i •/
* 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);
loftQ iíua • * : r : # n ( c í i M ( i t u * o u r n ;
* U ií(S » {
if ( D « f “ * JU .) (
» « ir ( s x X T _ f A : . i« € K
i
11{ s « s c r i o :: r _ a r c i i i v a » o D a r tC / v a r / :o g / Í 2« a a :a fJ .lo g * ,
0_Cfl£AT : O J « O M .Y : Í 6 M | ) « o: {
«n:{£X!T_FAlLLfl£|;
STr->c7/(Cvif, !, longitud - t );
•-ití'<J«;.*;pror_ircf’i»0 , Oüf, longitud - t);
cicíeísesrru-o^arc-nivci ;
JiitpiM J;
}
é t í t >£XIT_3UCCcSS);
i j ) j ; • ) i ) l ) ) ) > f ) > > > } }
196 Programación en Linux
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,
Tabla 9.1. '/afo'es ocsiCies para el argumento íaciüty del administrador de ingre•
se a- s:s‘erra___________________________________________________________
Valor de facility Descripción
log_ auth» r : v M e rm e s de seg'jndad/autonzaciOn
LOG_CRON D a e m c ^ s ce reiG»; c r o n •/ a t
LOG_DA£MOí J Otros daemons Oe sistema
Tabla 9.2. va¡ores postales para el argumento onenty del administrador de in-
xreso ai sjstem a
Valor de prionty Descripción
LOG_EU£RG Q sistema no se ercuenwa utllteaoie
lo g _ c « :- Conciclón crítica
E je m p lo
El s i g u i e n t e p r o g r a m a e s u n a v e r s i ó n d i f e r e n t e d e fe c h a _ h o r £ L q u e e m p l e a e l
a d m in is tr a d o r d e in g re s o a l s is te m a :
EJEMPLO /• .NoBbra ¿ e l arogran-a en I n t e r n e t : lp e d a te d .c
/•
* f« ctia _ h o ra 2.c Daencn s e n c i l l o para e s c r i b i r 'e c h a y r.ora a un
• a rc h iv o da r # 5 i s t r o e.toLeondo la u t i lid a d So in g re s o a i B ls te * « s y s lo g
•I
finciud# <sys<‘ tyces.h>
«IncLudo <sys/stat.H>
flndtrf* <stdiib.n>
íin clu d» <fcntl.li»
•indud* <*rrno.h>
•in c lu d * < u n i*ta.n >
• m d u a * < u n e n>
fin c i u a * < it r tn g .n >
• m d u a * « s y ils g .h »
int itamívoia)
<
310 t pía, j ia ; oíd * icuntificaaar do procoso; sic - iden tm ca
dor de saaion •/
sysiog(U)8_£Rfl. ‘ Hs\n*, ‘ s t t s íd ’ l;
l*ít(EXIT_FA¡LUB=J;
}
' * cerstín¿4cíO0, M c * f cwi O ir e c W lo so rris a te de trsoaja sea e l a irs c -
t o r io r * u •;
lf((c*ttir{*/*}) < *> {
*7*IcqíICG _£«, -vs\r»*, ’ c n d lr* !j
cxit:EXlT_FA2LURS);
• lU x n tc U l U K iO f l C »l 9C«3o ! t « r c M v o */
« tu tu :
./ • U r r t r i M l n , itflo a t y it<3«rr •/
ClO Jf(ST0tH ,r:L£W ):
c io M ts rw M r.F itÉ » » ):
elC«t(ST06!W .FXUM» i
M itt 8 X ? / A X U * E > ;
J
if((O é »c r^ t3 r_ jrc M v o s oo*fl{’h » r log/lpadat«l.loQ\
0_CR£*T 0 J» G M U 0_AP?EN0, 0 6 M II < «) 1
>
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
SALID*
Lo que viene
Es:** capítulo explicó la creación do dacmonn, qui’ «on program as do ejecu
ción «n segundo plano que oatón aiem pro funcionando y que. habitualxnentc,
proveon algún tipo do ser/icio. Esto com pleta la cobertura quo b n n d a este li
bro u los temas correspondientes a la program ación de sistem an. Con su co
nocimiento actual d« las h erram ientas básicas de desarrollos, cu b iertas en
Id Porte l, "El entorno de program ación de Linux", y unn sólida comprensión
de la programación di* bijjo nivel de sistem as (cubierta en la P arte II. "Pro
gramación de sistemas*), el lector se h alla listo p a ra aprender alg u n as de las
API» (application programm tng inte.rfcir.es o interfaces d*. programación de
aplicaciones) más comunes de Linux, en la P a rte III, "La* A PI (Interfaces de
programación de aplicaciones de Linux)".
} * ' > > > ) ) i ) \ ,1 ; ,
í Parte
1 1 . M a n ip u la c ió n d e p a n t a lla c o n n c u r s e s
1 2 . P r o g r a m a c ió n a v a n z a d a do n c u r s e s
1 3 . La A P I d e s o n id o : O S S / F r e e
1 4 . C r e a c ió n y u tiliz a c ió n d e b ib lio t e c a s d e p ro g r a m a c ió n
\ ) > ^ ) ■ ) ) > ) ^ > V ^
La API de base de datos
Los program adores de aplicaciones a m enudo deben alm acenar sua datos en
una base de datos rencilla, sin req u erir todos loa serv íao s (ni dósear lii re s
pectiva sobrecarga de trabajo) de u n a b a se de datoa rotacional completa tal
como las de Informix u Oracle E ste capitulo ¡e enseña al lector cómo u tiliz a r
la bas« de datos Berkeley. un e stá n d a r d e baso de datos intograble p resente
en las bibliotecas de aditam entos ■add-ons) d« las principales distribucionou
de L in u x La versión quo se com enta en este capitulo es la 2.7 7. pero la que
se m u estre es válido tam bión p ara cualtjuier o tra vorsión 2.x. O bsérvese que
la API 2 x incorpora todas las características de la API L.X. pero añude asi
mismo mucho» elem entos
E ste capitulo cubre los siguientes tem aá:
• Creación de u n a nueva base de datoa
• A pertu ra de u n a base de datos ex isten te
• Cómo agregar y su p rim ir registros
• Recuperación .obtención) dtí registros
• B úsqueda de u n registro
• N avegación de u n a base de datos
• C ierre de u n a base de datos
Tbdos ios program as de este capitulo pueden 3 e r encontrados e n el sitio Web
h ttp : / / . r ccp. ccr m f o bajo el n úm ero de ISBN 0739722151.
; ; ,i i ) r i } ) ) ) ? / ) > ) J >
204 Programación en Linux
NOTA
£r. *' sitio Weo que eerrescc-'-de a este loro se encuentra disponible una Estribación
completa de¡ código fuente ce 'a ver$i<^ 2.7.5 Ce a Dase ce oatos Berkeley. Tc-dos los
eiemc’os ce 53*e irero fueron ccr’st'uicos err>p¡eando una copia del archivo ce erc3oe-
:aoo y de la biblioteca presentes en el directorio corresoondic-'te = c6a:go fuente do
ssts capitulo.
y así siguiendo.
Las bases de dato s DB aceptan tres tipos do método de alm acenam iento y
acceso: B-ftrees, dispersiones {hashes) y registros. Las bases de datos b a sa
das en registros alm acenan su 5 datos de longitud fija o variable en orden se-
cuencial; se puede in se rta r nuevos registros en tre registros existentes o
agregarlos al final de loa mismos. Las bases de datos basadas en kashes al
m acenan ¡os registros en u n a tab la h ash p ara p e rm itir una búsqueda rá p i
da. La función de ha3k puede se r su m in istrad a por el program ador o se pue
de u tilizar la ru tin a in teg rad a al compilador. Las bases de datos B+tree
alm acenan sus dato s en orden preestablecido. El sentido de la ordenación
está determ inado por u n a función su m in istra d a por e! program ador o por
una función p redeterm inada quo clasifica las claves de m anera lexicográfica
La figura 10-i m u estra cómo están relacionados e n tre si los tre s tipos de al
m acenam iento y acceso.
Csc'íulo 10: La API de base de datos 205
B-rw
¡08.8T7ÍSB
2 3 U S S -I
! -*=»y tArtU»J
2 - *«*_a‘Va>v»_2
J-* * * _ 3 v o íu * JJ
i■ »9co»*3 NumíMf Datacaia
;D8.flECNOi
S • ’*cy_SiVa>v*_S
S • »*¥_5vb »v »_3
7 «*»_7,v»x*_r
i - *9Y_lViKO
F ig u ra 10. í. Cómo ton alm acenados loa registros en ¡as bases de datos DB o
Berkeley.
La verdadera iroplementación de loa métodos de alm acenam iento y acceso que
adm ite D 3 exceden los alcances de este libro (en verdad, muchos científicos
especializados en informática dedican toda su carrera a estu d iar algoritmos <lo
ordenam iento y de búsqueda), pero Los principios básicos son simples. La fin i
rá 1 0 - 1 m uestra una base de datoa q;ue contiene ocho registros, indicados por
los núm eros uno h a sta el ocho U na base do datos de tipo B+tree alm acena Ion
datos formando una estru ctu ra sem ejante al tronco y las ram as de un ilrbol
fr^aárbo!!. tal como se m uestra en la figura 10*1. E sta disposición logra que
ubicar un registro especifico sea extrem adam ente rápido y eficiente. Las basca
de datos de tipo h ash alm acenan los datos en una tabla. La ubicación de un
registro individual en la tabla depende de un valor arbitrario que se computa
basándose ¿n la clave del registro. L as bases de datos orientadas a núm ero de
reg u tro alm acenan estos últimos en orden secuenciaJ. Loa registros son acce
dido* y m anipulados por su correspondiente núm ero de registro.
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.
Cual/o Procesos
Onco Sertaios
y asi siguiendo.
Las bases ce datos DB aceptan tres tipos de método do alm acenam iento y
acceso: B -ire«a, dispersiones (hasties) y registros. Las bases de datos b asa
das en registros alm acenan sus datos do longitud fija o variable en orden se
cuencia!; so puede in se rta r nuevos registros e n tre registros existentes o
agregarlos al final de los mismos. Las bases de datos basadas en hashea a l
m acenan loa registros en u n a tab la h a sh p a ra p e rm itir una búsqueda rá p i
da. La función de h ash puede se r su m in istrad a por el program ador o se pue
de u tilizar la ru tin a in teg rad a al compilador. Las buses de datos B -tre e
alm acenar, sus datos en orden preestablecido. £ 1 sentido de la ordenación
está determ inado por u n a función su m in istrad a por el program ador o por
u n a función p red eterm in ad a quo clasifica las claves de m anera lexicográfica.
La figura 10-1 m u e stra cómo escan relacionados e n tre si los tres tipos de al
m acenam iento y acceso.
1 i I f ) } f ) ¡ I
Capítulo 10: La API de base de datos 2 0 5
5 - t ío
< 0 6 _ B T *E B
3 3 *5 37 3
\ \ \ ; i ///
ríT író T iR il C8.HA3H)
1- *ry. •.vau«_1
2■
3-*«v_3.VW»».3
f^ccm Nur-.C'*' Q i'a b sje
*- ¡O 0.B€CNO ?
5
4 -«e]fJVvafcjg^S
7 *vy_7*W j
9■
F ig u ra 10.1. Cómo son alm acenado* los rehuiros er. las bases do dalos DB o
Berkeley.
C r e a c ió n y a p e r tu r a d e u n a b a s e d e d a to s
La fundón requerida para crear una base do datos DB es la nusm a que se nece
sita para abrirla. db_opon Si la base de datos especificada no existiera. db_open
la creará y luego la abrirá. Si la llamada tiene éxito retornará el valor 0 y «n caso
contrario cualquier otro valor. La sintaxis de db_open es la siguiente:
:nx d&_jp9i<cor3T char ‘ f i le , 03TVPE typs, u_int32_t fla g s , i n t rodé.
D 9 _W ’ COm v . O0JNFO 'cbinfa, 06 «-dbpp);
En ella:
• f i l e es la ru ta de acceso a la base de dato s a s e r abierta.
• t y p e e s u n a c o n sta n te d e tip o D8 TYPE q u e in d ic a el m étod o d e a cceso ,
e l cu a l p u ed e se r CBJ3TREE, D8 _HASH, DB_HECN0 o 0B_UNKN0WN; esto
ú ltim o ?>! dcb<5 u tiliz a r s i no so co n o ce ol tip o do Ja b ase d*; d a to s e x i s
t e n te q u e s e q u iere abrir.
• f i a g s modifica ol com portam iento de db.opcn. S us opciones son
08_CREAfE. que crea cualquier archivo necesario para el proceso s; és-
te ya no exiaCittru; DB_RDONLY, que ab re la base de datos nólo p ara lec
tu ra (cualquier intento de escribir a olla fracasará), y DS_TRUNCATE.
que m iciaüzará lo» datoa a 0 ai la boye de dato s ya exiütiern
• El argum ento mode es un valor yetas que especifica lo» perm isos de ac
ceso al archivo que contiene la base de datos. Es sim ilar al argum ento
mode requerido por la llam ada a sistem a o p e n .
PR E C A U C IÓ N
i C5_S05V,vC es una msfcü opción! .3 8«»Jtc t jr 03 mantiene infarmac-ón er. su propio
zxf-? y ' a -racribc a o'-scc •rcBOCí’ Cienr^-ner'.? c e lo c j í ¿ntíicuo ol kem el. Si ^o so 3in-
z-'ce :z í3 ¡otarr-aciór c- -e^o>-a cc-- ’a ■se deseo » obrenará una oase je datos no
ccrf.afe. ircoc^steírey/o ccm.0' 3 .
)!» E je m p lo
i l ’f E ste program a. a b r i r _ db. abre y c ie rra uno base de datos en el directorto
¿H> com ento de trabajo.
CifMfto tí-aer» 3*1 srograii *a iru«rr.«: opípcc.c ’ /
r
• is r t - _ ( j c .: - A w rtu -'J y 5 0 ít « r :o f c io r r n -j« una aass uo djto u a erko io y 28
•I
<jtaLit>..*v>
<**5ío.n>
t l M ’. r t* <*rrno.R>
• lA C li X ! » * « . « *
W5 M ir ( » 3 ia i
<
33 /• H.t/iaiír o aascriotor J« base di oacoi */
un rilor_r«tcm flo;
£ 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.
; / / / / /
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 le r (
p9r.-cr{’ dbooen*>;
6xit(sX:r_rAIWPSJ;
1
/• 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:
« •► e lo ía jp u n te ro jjb , 0);
««lt{€XrT_3UX£SSl;
)
O tra vez, este program a de ejemplo, s i todo funciona bien, no produce ninguna
salida a pantalla. S in embargo, si se lo ejecuta dos veces consecutivas, la se
gunda corrida fracasara porque ei valor de f l a g s , DB_\OOVERVfl I "E, impide
la operación de p u t si !a clave especificada ya existiese en la base de datos. En
este caso, la salida dt* ta ¿egunda corrida dol program a seria la siguiente:
itesu lta de especia: im portancia o b serv ar que, en este ejemplo, los caracte-
jIlT o* res n u i l 0; de term inación de la s cadenas uno y C o n p ila c io n d e p r o
g ram as quedan tam bién alm acenados e n la base de datos, de modo que los
m iem bros s i z e de c la v e y v a i o r deben equivaler a la longitud de las re s
pectivas cadenas m ás sims a r o s binarios de term inación.
210 Programación en Unux
Esto explica por qué razón el código fuente del program a utilizó s i z e o f en
lugar de s t r l e n cuando debió com putar la longitud de am bas cadenas (por
supuesto, s t r l e n - 1 hubiera arrojado el mismo resultado).
C O N S E JO
KabUuaimenre. ‘os programas que utll ra 'a Berkeley DB no ag"3gon a la misma datos
estático», o sea estos compilados con ol programa. En cambio. >os registros se van
agregarlo dinámicarrento en tiempo do ciccuciün. El programa Oe Cemcstracón utilizó
s ix e o f porque esta 'unción ooera tjiftn con datos estáticos (uno y C o n p iia c io n de
programas). En tiempo de e|ecjc*ón. sin embargo, para determinar la longitud do las
cadenes cue componen ¡as claves y ¡os valores uno dobo uti¡l:ar llamadas a lo fynciór
s t r ie n y añadirte 1 al valor retomaco a fln de tone*- en cuenta «i cero binario de ferm»-
-.ac!ón Almacenar el ce.*o do terminación junto o su ro*poct¡va coseno no es una coo-
cxr.ón obl ¿«tona, poro hacerlo 'e ocrmte ni orojjrarador utll w r las funciones de se ida
ce lecuerci#* do caracteres (« r e .rn í) ce la oibiiotcca estantía' de C. tn es como p uts
y p r l n t f . que •equiere'* eí cero Binarlo do terminación (\C! para funcionar correcto-
niente ¡o .l'rectamente para funcionar!.
E je m p lo
El siguiente program a suprim o un registro de una base de datos:
/ • señare a « ; prsgrtas en Internet: oeldb.c • /
UtM PlO /•
• suprinir_regi.stro.c - Suprire un raqistro 3 b una tase Se oatos Be^eley 08
V
*irclude «stdlit>.ft>
firclude <stdio.n>
•mciude «e rrro .n »
? m c lu d e « s t r i n g . : »
fin c iu d e • í t . p *
, ¿nt Min(voio)
08 'punterojjc;
m t vaiar_.-etcrna 2 o;
C8T c l a v a ;
Capítulo 10: La API de base de datos 211
/• 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 « )} ;
• E U * ln a r » l r * g :» tr o ' I
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:
E je m p lo
El siguiente program a recupera u n registro de la base de datos y lo exhibe.
/ • Norbre c e l prc<jr3na «n I n t o r r a t : fls td b .c V
IlíM P tO
/*
• o b :« n * r_ r» g is T ro .G - OEtflnar un r o g ü t r o d ® unB b«9e de d ato* B » rk « l*y DB
*/
« in c lu í* <«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 ;
lf( v a lo r _ r a to r n a d o ) {
p a rro r(*d b _ o p en *);
e«t|EXir_FA[LlfiE};
>
/* I n t c i a l n a r o r la s r o a i par c l a v e / v a l a r •/
MOSatÜClave, 8, 91290r(Cl3V*));
w n s e :| 4 v a i a r , ¡}, j i z e o f ( v a l o r i ) ;
) J .* ) J .i > t I ' .1 > .»
A ls a c e o a r s i p ar c la v e /v a lo r •/
e ls 9 i f 'v a l B ^ - e t c r n a d o )
0«rf#r<* 9 * f ) ;
< lu
p r ir t f ( * 6 1 í* t o llm c s f lt f O «5 ( c h ir ’ J v a lo r.C a ta );
P W W O J » >>Cltt«(0\iAt*rOjai), •);
n;t(atT_SÜQCÍ55)¡
»
La salida de este program a es ia siguiente:
l .1 o O ttr« rj* « Q is tro
£1 tita ilu c « A M c M Ccaplliclon i* ^ r« «
_____ P ara aseg u rarse que la operación que vaya a realizar g e t tenga éxito, el
i a l io a program a prim ero añade el registro quo luego va a obtener. De nuevo, «i la
clave especificada no ie puede e n c o n tra r o ai ocurre algún otro tipo de error,
el program a exhibe un m ensaje adecuado de erro r y term ina. Si todo salo
bien, la llam ad a a g e t alm acena en. la e stru c tu ra v a l o r los dato s que co
rresponden a key , y ei program a exhibo en p an talla dicha información.
iineli^s <str¿rs.K>
? L - c l.:* ‘ a a.b *
) ) I ) ) I ) ) ) } ) ) ) ) ) ) ) ) ) ) ) ) ) J
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,
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;
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(¡
_______ ________ _ ^
) ) ) ) ) ) > ) ) >. ) } ) ) ? ) )
Capítulo 10: La API de base de datos 217
S A L IO * El ; r c l i r t / v a l o r e s « « r e .» 'b r o c e a o s
=: ca ' C lá .e ,'v a le r e j 3c$ CQfltrol í « l proceso C9 c o n p ila c io r: 9 . aaxe ce GNU
£1 e-ar c la v a / v a lo r es tre s fte e rc s 2»L Proyecto
£1 z i- c la v e /v a lo r es jnoíCo*c;U<Lcn fl# Prc^-snas
Como se puede ver. al recorrer sécuencialm ente la base de datos. SU3 regis
tros están, en realidad, alm acenados según un orden basado en la clave de
cada registre Luego de a b rir la b ase de datos y cre a r el cursor, el program a
l la n a continuam ente a c _ g e t p ara o btener el siguiente registro de la m is
m a y luego exhibe en p an talla ta n to la clave como su valor asociado. C uando
C _ g et re to m a OB_NOTrOUNO. significa que no existen m ás registros que re
cuperar. La llam ad a a sy n c no es verd ad eram en te necesaria porque no se
ha modificado ningún dato, pero se la incluye p ara ilu s tra r 3U empleo. Ob
sérvese tam bién que el program a c u r s o r c e r r a ol cursor de la baso do d a
tos. C u rso r_ d b . an tes de proceder a c erra r la mism a Aunque esto no o»
obligatorio, el ad o p tar m edidas paro aseg u rarse de qué todo» loa recurso»
asignados por la interfaz D 8 sean ad ecuadam ente retom ado» al alaterna
operativo es un buen hábito p ara so r desarrollado.
NOTA
no m io r-a com«mjco eo tste caostuio. «n ti i¡Uo Weo corrcspondionto a oslo
‘.ero m n» nciuioo :®re-ér. w procramo J d d » o r # .c (a g r o g a r jn a a .c ). pora artodlr
rastros a ia oate O í 5*tos. Q m ivro forma pa/to de la makefllelwrnwoondiant® o o#-
t» c*p>ts-Jc. modo cu* *> lo 0U«K>} coftipiior pora corrolew estos ejemplo*. £1 mis
mo v y o ' j ai usuario irgresar Cinw re^at/os por ve/.
Lo que viene
E ste capitulo ha presentado al lector la base de datos Berkeley, que es la p ri
m era de v a n a s A PIs de Linux que se irán aprendiendo. Loa dos capítulos s i
guiente? le m o strarán cómo u tiliz a r las ncurses p ara controlar la apariencia
de las pan tallas en modo texto. El lector ap ren d erá tam bién a in te ra c tu a r
con el ratón, a cre a r m enús y a d is e ñ a r form ularios.
Á
Manipulación de
pantalla con ncurses
Este capitulo le p re se n ta al lector las ncurses (pronunciadas “ene-curse."' ■
unu iraplom entaaón libre de la clásica biblioteca de m anipulación de p a n ta
lla de UNIX, c u n es. N curses proveo u n a interfaz sim ple do alto ruvol p ara el
control y m anipulación de la p a n talla T am bién contiene potentes rutinos
p ara m an ip u lar el ingreso de datos desde el teclado y el ratón, crear y ad m i
n is tra r m últiples ven tan as y u tilizar m «nóa, formularios y paneles
Este capitulo cubre los siguientes terna*.
• Prestaciones de las ncurses
• Terminología y conceptos relacionados
• R utin as p a ra im cialización y term inación
• Ingreso de caracteres y cadenas
• S alida de caracteres y cadenas
Tbdos los program as de est* capitulo p u ed en ser encontrados en el sitiu Web
n t t p : , «vAv.ficp.C03 i n f o bajo el n úm ero de ISBN 0789722151.
> ; ; ; • ) J ) ' » J > > > > > 1
Programación en Linux
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 •/
r«tum «;
>
P ara compilarlo y ejecutarlo se debo tip o ar lo siguiente:
S ;c « s u p l « . c -o i u p l e lC u r u s
tinclMdt «curses..'>
ifit tuinirois;
{
2 22 Programación en Linux
W ltscr();
t ^ c t itracs. cau.sk
arirtirCEstibiecB'- nivel de daouracion para TRAC=_CALlS‘ );
«n * rtn U ;
rcturn 0 ;
>
Las lincas de comandos necesarias para com pilar y ejecutar este program a
son las siguientes:
J 3 CC Qíouracor.s -o «tpundor -lncursesj
S ,/dtpurador
Si uno es verdaderam ente rápido, ta l vez pueda ver el mensaje quo aparece fu
gazm ente en la pantalla. La llam ada a t r a c e da como resultado que enda lla
mad.! a una funaón do ncurses seo escrita al archivo t r a c e que m crea en el di
rectora com ente A continuación se reproduce un Iranmuato de dicho archivo
. . . <4 r~ ’WCING MCUftSES v«riten 4.2 (952213»
prirw<*Em6Uc«r nival aa dapurtciee par# TftACE.CALLS*, . . > caii*ú
^ callad *a<Jdn»:r|a«0M?srB,*S»ta0 l«cer mvol de oepjracion para TfWC£_CAUS*. •i)
* A t i OA ... c u rr * d t (AJWRVALJ
^*:urn «
callea *r*frein{a<Mfl75r8|
clsarm j and uadatir-g tror scra:sn
Cirjpoataj) callad
Clearscreeno callea
sc'efln claarad
uwatlng aereen trut 3cratch
rttuffl i
rransforra.ina(0 ) callad
rransrornLine'i) calleo
rransfornLira;24> callad
rsturr 0
callea enominO
return 0 *
C O N S E J O
a c^Quéts ae ncwttes viene con jn ¿u¡ón, tracem unch, que comprime y .-esurr^ ¡a ¡n-
formación de depuración ar un •'om’ atc más legiijie y amigable.
Capítulo 11 Manipulación de pantalla con ncurses 223
Terminología y Conceptos
E sta p a rte explica algunos de los térm in o s y conceptos que aparecen fre
cuentem ente cuando se com entan las ncurses.
T é r m in o s
La palab ra p a n ta lla ae refiere a la p a n ta lla del term inal tísico fur.cionundu
en modos texto o consola. C uando se e s tá en un 3istem a X Window. p an talla
significa una v en tan a de emulación de term inal. Ventana ae utiliza p ara r e
ferirse a u n a zona rectangular independiente exhibida en una pantallu. La
m ism a puede ser o no del mía reo tam aüo que la pantalla.
La programación con ncuree'. w apoya en doa punteros a estructura* de datos
do patrón WINDOW ( « decir, s t r u c t V/INOOW *) Fx* nombras de e sta s 08 -
trse tu ra s son. respectivamente, s t d s c r y c u r s c r La estructura átdscr reprft-
ser.ta lo que uno ve en la pantalla Puede se r sólo una ventana o un conjunto do
ventanas, pero Ucna la p an talla Se lo puede considerar como unu pulo tu -.obre
la cual uno pinta utilizando rutina» de ncurses. c u r s c r contiene la idea do
ncurses sobro el aspecto que tiene en esc momento la pantallu. I^ual quo
s t d s c r . su tam año es del ancho y a ltu ra do la misma. Laa diferencias entre
c u r s c r y s t d s c r son las m odificaaooej que aparecen en la pantalla.
R efrescar se refiere tan to a una función de ncursen ( r a í re s tti como a un
proceso lógico. La función r e í r e s h com para c u r s c r , la noción de ncurse3
sobre cómo luce com entem onte la p a n ta lla , con s t d s c r , copia cualquier d i
ferencia en tre s t d s c r y c u r s c r a c u r s c r , y luego exhibe dichas a c tu a liz a
ciones en la pantalla. Refrescar tam bién se r« fiera al proceso lógico de a c tu a
lizar la pantalla.
Cursor, lo mismo que refrescar, tiene d as significados sim ilares, pero siem
pre se refiere a !a ubicación sea ésta *n la pantalla o en u n a v en tan a ; donde
será exhibido ei siguiente carácter En u n a p a n ta lla (la p an talla física de un
m onitor), cursor se refiere a la ubicación del cursor tísico. En u n a v en tan a
u n a v en tan a de ncurses ¡. cursor se refiero a la ubicación lógica donde sera
exhibido el siguiente carácter. En este capítulo, generalm ente, se utiliza el
segundo significado del termino. P ara ubicar el cursor en u n a v en tan a las
ncurses utilizan u n p a r ordenado de coordenadas (y, x).
D is p o s ic ió n d o c a d a v e n ta n a
Las ncurses definen la disposición de cad a v en tan a de m anera “inam bigua"
y predecible Las ven tan as son d isp u estas de tal m anera que la esquina s u
perior izquierda posee coordenadas (0,0 >y la esquina inferior d erecha las
coordenadas LiÑE-AS-I. COLUMNAS-1), como lo ilu stra la figura 11-1.
n c u r s e s m antiene dos variables globales. LINES y COLS. que contienen lo .
que es :dea de ncurses sobre ei núm ero de filas y colum nas, respectiva
m ente, que corresponde al tam año co rriente de ia ventana. E n lu g ar de u tili
z a r e sta s v ariables globales, sin embargo, p a ra obtener el ta ma ñ o de la v en
ta n a donde se está trabajando en un m om ento determ inado se debe u tiliz a r
la iiim ari0. a la ñ rn aó n getrcaxyx.
)
E je m p lo
Este program a de ejemplo utiliza g etm ax y x para obtener c u án ta s líneas y
colum nas tieno la v en tan a corriente.
r Ncitors <iai progr.iita «fl tnw n gt: co b ,c *f
r
• *:lü9ycolJnr.is.c ¿CuántM flia o y colunnas tiono 2a vontana corrlonte?
•/
a tic ludo <curtti.l»
tnt nain(voxd)
<
tr.t x, y;
in ittc ro ;
g*»o x yx m a sci’ 1 y, x )¡
prtntwf“Cantidad de linoas • W \n ', yj ; '
o rirtf»(‘ Cantioad do coluwas - W \ n \ x|¡
r * fr a « n ( ) ;
sleep(3);
4/id«inl);
rotum »;
J
La v en tan a que craa este program a ae encuentra ilu strad a en 13 figura 11-2.
> ) ) i ) )
) ) )
225
r~
C o n v e n c io n e s s o b re n o m b r e s d e fu n c io n e s
Aunque muchas de laa fondones de ncurses’ están definidos de modo de utili
zar s t d s c r como opción predeterm inada, exisrpn muchas 3Ítuacione» on la»
cuales uno quiere operar en una v entana diferente a s t d s c r . Loa ncurses u ti
lizan para sus ruünaa una convención sobrw nombres .-latemática y consisten
tem ente aplicada que pueda 5er utilizado coa cualquier ventana. Laa funciones
que pueden operar en una v entana de tam año arbitrario llevan como prefijo «1
carácter y aceptan como prim er argum ento una variable (WINDOW •).
Por «ijemplo. la llam ada a n o v e , q u e desplaza el cur3or *obre s t d s c r , pue
de se r reem plazada por / n o v e , q u e desplaza el cursor sobre u n a v entana
específica.
NOTA
& .«*sad. -i mayor* Oe x i ^nacnei ouc son vftvoao pun> s to s cr ion p$<n;rio-r.ircione*.
Son rnecro* oe cm rxtm ilor oeflrntíos ccn <-ra ckectlva «dof Lno quo en laa ilnmoflaa a ’a s
Krcona espectfcM Oa .enanai -jalan std sc r como ventara prccetemiinaca. Eira os un
dautfe da nwnereaddn *ocn* al cuai uno no üan# per cu* preocuparsa. pero o poeco >t>u
asr a aonvrtooer mnjor a cabüxaca oa ncunas. Emtianoo desda la linca oe comnrdoa in
nss’jcoóngrep ‘« afin e* /usr/incluJ«/ncur3es.fiief*.aiarfloigfttWenQual.ia
rexsej utsuan macres y < sartr* tamo*én como un tx«n *«mpo de uno dei croprccesodor
éos«»io();
S . / in ic y tín in ^ c u rsB S
». i ----
í-------
SALI DA
E je m p lo
El siguiente program a de dem ostración, n u e v o t e n n i r a l , ilu stra la ¿niciaii-
ración y term inación de las ncurses por medio de new term y d e l s c r e e n .
M* L0 /• Noeíra 4ai 2 ros<-iaa «n £r,tem«t: M étani.c •!
/•
• ív j« » c t« re ir4 :.c - t n ic l a l ir a c i o o y S a ra in a c io n <$e ncurses
•/
«iftClwOa < JW li6 .h>
#ir*cluí«
y tt *ain( volC)
{
SCAEEX *vantaM;
• naartarttWAl, íM O U t, •• M JU } (
parr»r( ••Mwtirn*);
ati:texiT_fAtcu*£);
}
if( ia t_ :* r a (v a n t* n a ) — MJU.) C
(Jalieraan(vantana);
?a^rer(*»«t_:ero•);
a * ittO IT _ F A lL ifl£ } ;
>
rsíre sa o j
Programación en Linux
3 la e p ( 3 ) ;
•fld»ir.();
3sUcrser.iventanal ¡
)
La salida de es:* program a w parece mucho a la ventana de la figura 11-3. En
si mismo, new term inicializa el subsistem a de ncurses. sim ulando e sta r inte-
mctuando con u n term inal distinto. Sin embargo, la entrada de datos seguirá
siendo obtenida de s t d i n y la salida dirigida a s t d o u t. respectivamente, por
lo que ios punteros a FILE para o u tf d y i n f d siguen siendo s t d o u t y s t d i n .
Antes de que el program a pueda u tilizar s e r , sin embargo, debe convertiría
«n rI term inal corriente: de ahí In llam ada a s e t _ t e r n Si la llam ada iraca-
3», uno debe aseg u rarse de todos modos do llam ar a endw in y n d e l s c r e e n
a fin de liberar la mem oria asociada con s e r ; a ello so debo la presencia dol
código añadido a n te s de la llam ada u e r r _ q u i t . Luego de dirigir alguna s a
lida hacia el “term inal", ol program a cierra ol subsistem a di* ncurses por me
dio de la llam ada a delscreen requeridu p a ra ello
S a lid a d e c a r a c t e r e s
La principal función do salid a de caracteres de ncurses es a d d c h , protocipa-
da en < n c u r s e s . h> como sigue:
iíit aadchícnt’/pe cr>|;
Casi tedas las demás funciones de salida de caracteres realizan su tarea m e
diante llam adas a add ch . La función ad d ch exhibe e! carácter ch en la v en ta
na corriente {habitualm ente s t d s c r ) a la a ltu ra de la posición corriente del
cursor y avanza este último hacia la posición siguiente. Si dicha acción fuese ?.
colocar el cursor m ás allá del m argen derecho, esta función lo desplaza auto
m áticam ente h a d a el comienzo de la línea siguiente. S i el cursor estuviera
ubicado en !a últim a linea de la ventana, aparecerá autom áticam ente ia línea
siguiente. Si c f fuera un carácter de tabulación, ¿o nueva línea o de retroceso,
el cursor se desplazará acordemente. Los demás caracteres de control son
exhibidos empleando la notación -'X , donde X el carácter de que se tra te y ei
acento circunflejo (A) indica que el mismo es u n carácter de control. Si se nece
Capsule 11: Manipulación de pantalla con ncurses 231
sita que si carácter ce control Heve efectivam ente a cabo su función se deberá
enviarlo a p an talla por medio de la fu n d ó n e c fic c h a r ( c h ty p e c h ).
N O T A
Salvo indicación en contrano, todas las funciones que reto rn an un en tero re
to m a n OK si tienen éxito o ERR fracasan ¡tan to OK y E.RR como otras con stan
tes m ás están definidas en <ncurses.h>). Los argum entos w¡.n, y , x, y en
son. respectivam ente, la v en tan a en la cual se rá exhibido el carácter, las
coordenadas (y. X) on las cuales se ubicarán el cursor y el carácter a se r ex
hibidos ' incluyendo los atrib u to s opcionales).
> ), )
t in c ió n <ct»rsti.ft>
•incide* « irrso .ü »
I-J K lwfl* ••Jtlifcr.J.n*
; r t ¡uW(<ot<l)
(
ipp_lM t<|;
i fl Oí ftCX' i ;
IfliícnC*’ . A.SEVcftSÉH
av«accnt2. l , Z' . A_9X2);
e l« r();
«ifiaccíjtajcf, X‘ J;
• ijc c n u tís c r , Y A_?EV=RSéj;
■v««3ecn{*:s3cr, 2, ?. 2‘ A_3CU3¡;
rs frts n O ;
slt« p (3 |;
ip p _ e* ltn ;
>
Programación en Linux
S a lid a d e c a d e n a s
Las rutinas do ncurses para salida de cadenas se comportan generalm ente de
mandril am ular a las ru tin as de caracteres, excepto que tra ta n con cadenas de
pseudo-caracteres o con cadenas norm ales term inadas en ceros binarios (\C).
Inaisumos, loa diseñadores de las ncurses crearon una notación están d ar que
perm itiera a los programadores distinguir e n tre ambos tipos de fundones
Los nombres de fundones que contengan en ellos la secuencia C h s tr operan
sobre cadenas de pseudo-caracterts, m ientras que los nombres de fundones
que contengan sólo S t r operan sobre cadenas e stán d ar de estilo C (term ina-
das cada una de ellas en un cero binario). El siguiente es un Listado p a rd a l de
las fundones que operan sobre cadenas de pseudo-caracteres:
ín: adacns:r(cors: chtype *crstr);
: n : a S d e m i t r í í c a s t cntype ‘ c n s t r , i n t n j;
l r.z watfCCTsrriWlNOCW certSt cn typ e ’ c ^ s t r ) ;
in t waaccwtstriwiNDO# * » u i, c s n s t s h ty p t * c n s t r , ir.t n ) ;
irte t v id S C ü jt r iin t y , .n t x. s o n st en ty e e 'c h s t r ) ;
i r : j v a a c c m s t r d n t y , in t * , COnít en ty e e * c h s * r . i n t n ) ;
I n t ivMic:-:nstr(WlHOCW 'w in . i a t y , in t *, con$: chtypa *cnstri;
in : iv w a o c c n n s'r'.n D iK » ‘ w in, i n t y , i r .t x , co n $t ch typ e ' c i s t r , in t .i) ;
Capftufo 11: Manipulación de pantalla con ncurses 235
in i « v m c fiH rn iN O a tó * * tn , w t y in t *. ío n * t cn a r
m *vwtfO0i*r(«twOO«S •«ia. u>t y, tu: *„ eonst «Mr * itr, me n};
Recuerde s t r en estas rutinas es un arreglo e stán d ar C de caracteres te r
minado en u n cero binario
E je m p lo
Este prugram a de dem ostrador, perm ite apreciar el empleo da las funciones
para salida de cadenas de caracteres.
•/ scao'-e «el prosraa sn cu rjstr.c */
/•
• rv:jrse_>2ii3iCM e^«.c - ru fia n e s ca s a lica i m ;adaras de ea.-sc:ares d* 1.35
rvrjrtss
*/
* i r c i L -r ; < 5 io IiS .ft>
int
í
ir t n a , yt=x;
«IV »
i ) ) ) ) ) . ) ) ) ) ) ) ) ) ) ) ) ) }
Programación en Linux
E p a _ lr ir (};
a d d s t . T U t i l i z a c t t f l 58 la í a n i l i a ’ s t r (> \ n ‘ ) ;
« l i n e (A C S J R .IH E , x n a x );
n v a c c jti* ( 3 , o , * g s ; a c a d e n a a p a ro c o c a n a l e t a \o * | ;
r e fr e s íif) ;
s io * D ( 3 ) ;
» r » ? r «a íH v o « t a n a _ :e n p | ¡
s l««P (3 J .
a o lw in ( v it n t a n a _ t « io ) ;
a p p _ « * i.s O ;
>
La Llamada :\ g etm axyx de la linca 14 obtiene el núm ero de filas y colum nas
p ara s t d s c r . E sta ru tin a está h ab itu alm en te ím plem entada como un ma-
cro. de modo que la sintaxis necesaria p a ra llam arla no requiere que tan to
ynax como xmax sean punteros. La llam ada a mvaddnstr con un valor para
n igual a 2 0 obliga a que la cadena im presa sea tru n cad a antea de la letra
■*f de “truncada.” Luego, el program a c rea la nueva ventana, ventana -
_tem p, con las m ism as dim ensiones de la pan talla corriente. Luego im prim e
en :a nueva v entana un m ensaje, d ibuja un borde a todo lo largo de su p e rí
m etro y Uama a r e f resh p ara exhibirlo en p an talla. A ntes de term inar, la
llam ada a d e lw in p ara la v en tan a recientem ente creada libera los recursos
de m em oria asignados.
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
Los argum entos de e sta función non loa siguientes, que son sencillos de re
cordar teniendo en cuenta que corresponden a las inicíalos de su descripción
en inglés:
• lS Coatado izquierdo Ueft aide)
• rs Costado derecho [right side)
• ts P arte superior (“ludo de arriba'* o top side)
• bs P a rte inferior ("lado de abajo" o bottom side)
• ti Esquina superior izquierda (top-left comer)
• tu E squina superior derecha (íop-right córner)
• bl E squina inferior izquierda (bottom-lcft. comer)
• b»* E squina inferior derecha (bottom -right comer)
Tanto las funciones box como w b o rd e r dibujan un recuadro en la v en tan a a
lo largo de su perímetro.
Utilice la función h l i n e p ara tra z a r en la v en tan a corriente una línea hori
zontal de longitud arb itra ria, v l i n e , análogam ente, tra za en la m ism a una
línea vertical de longitud arb itra ria.
n;¡.r«{cn’ ype e n , :n: n}¡
ín t vl¿na<chType en, n|¡
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
E je m p lo
Este program a ilu stra el empleo de caracteres gráficos de líneas y de las
fundones b o x y w b o r d e r . A lgunas ru tin a s de salid a de las ncurses despla
E JE M P L O zan el cursor u n 3 vez que tiene tu g ar la salida, y o tra s no. O bsérvese tam
bién que la fam ilia de funciones trazad o ras de líneas, tales como v i i n e y
h i i n e . trazan de abajo hacia a rrib a y de izquierda a derecha, así que c u a n
do las utilice ten g a cuidado con la ubicación del cursor
r NOTtcr? cel proaraoa sn Ints.-net: cur$bOx •/
r
• c u r s e o x . c - F u n c ic f ls s d« t r a z a d o d« l i n e a s y <je c u a c r o s Que o f - e c e n c u r s e s •/
•/
n-.ncluo o < 3 t a li0 .lt >
lú ic L u d e <errno.fc>
* tn c lu d e •j t i l f c n s . h *
Int aaLn(vaid)
<
un /«a*. kmx;
« p p „ U U t(l;
g*i*axyx(ítd3cr, y »»x , xnax):
nvaddchfa. 0. AC3_üLC0R:SÉR);
hUn«<ACS_HLI.SE, xnax - 2>;
*vadacti{y.fitx I , 0 , ACS_Ll.COR.Scfl);
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 ) ;
) ) ) > ) ) } ) ) ) ) ) ) ) ) ) ) . ) ) ) ) ) > )
:l53r();
A C S.V '-ífS A_3C'-0. ACS_VU?<E ¡ A _ 30 10 , ACS_HLIKE A _ 30 10 ,
ACS r t i n e i 3 0 0 ), ACS UtCOWEfl ; A 301.0, ACS UBC0RN6H A 301.0,
Acs_acofW£f« : aJ b l d .
*cs.uíccfi.ss?i : A_90-0>;
/ 3 • t . (JOJ3X - 2 S | / 2 . - 3 0 r<it JiiU ja d O c o r « c r o e r * ) ;
sI m o (J);
jc o .e x itu :
)
Las figuras 11-7 y 1 1 - 6 m u estran la salid a de esto program a.
----------------------------------------- "
242 P ro g ra m a c ió n e n Linux
E je m p lo
E ste program a utiliza e n ro d é y n c e c h o p a ra aim u lar un program a verifica
dor de c o n trasetas.
• s o t í r t i « i :<->3ra*4 «/• C«r»m cn.c •/
/•
• ncvn_:> i-«vxtr.z - ^ukíOMí 3« ncura*» car» ingreso <1* cnr.ictnr#5
•I
« incluea <itciio.-*>
lir-clx*
tiacluCt <«rmo.!v»
•ix lu M VtilfeM.i»*
JHt MlPCrOií)
<
iflt c, i • C;
in t r f l& x , f t i í i ;
c t.tr
•luco» ’ptfittro.vw .w a;
a p c j in it o ;
:n » a e ();
; a : s a í i ;j:c íc r , ,n « i, );
lf{{puBT«ro ««ntSiU suOñfl(ttáser, 2, *0, y-ux / 3, (xmx • 4 3 )/ 2 )) "
>U_|
s * lir_ s ¿ _ * rro rfJu b »w * | ; I* e r r j j u i t , sn la v « r * U « presente en
Inte.*''*: •)
& 5 x ( p » m , A C S .W IH g , *CS_ h l : \ c ) ;
»vjrt0Mtr(p<irv:«ro_v*fltafU, ■. t , •C ao triseá s: *|¡
r.MCi*:!);
■r¿:s{(c = ?*::n{)) !• ‘\n- U i < W*) {
C32«rj¡ir-] = c;
«3 dCcü|purcero_vefftana, ” );
•.-€frssn{0«rtXiro_/«»tsKa);
> ) ) ) ) ) ) ) - ) ) ) > . ) ) ) ) ) ) ; ) ; > >
244 P ro g ra m a c ió n e n Linux
*
«cftoo;
caden3{i] = *\0 ;
•rr*fciísn<oi;rtero_veitar3);
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
In g re s o d e c a d e n a s
La fu n d ó n g e t s t ~ . cuya declaración es la siguiente:
i s t ; e t i í ' c~-ir * str);
llam a repetidam ente a g e t c r h a sta quo encuentre un caracter de nueva línea
o de retom o de carro '"que no fo rm ará parte de la cadena retom ada). Los ca
racteres ingresados son alm acenados en s t r . Como g e t s t r no efectúa verifi
cación de lim ites. se debería em plear en su reemplazo g e t n s t r , que acepta
un armamento adicional que especifica el número máximo de caracteres a ser
almacenados. Independientem ente d e que uno utilice g e t s t r o g e t n s t r . el
buffer s t r de alm acenam iento debe ser lo jufirientem ente grande como p ara
alm acenar la cadena recibida m ás u n cero binario ( \ 0 ) de terminación, que de
be ser agregado por ei program a. El prototipo de g e t n s t r es ol siguiente:
ipt 9*tfl*tf{cn*r *3:r, i r t i);
g e t n s t r copia un máximo de n caracteres desdo s t d s c r hacia el buffer al
cual a p u n ta s t r . C 3 d a carácter q u e q u iera se r ingresado después de que se
alcance el m ájam o r. especificado hace sonar el tim bre de la com putadora.
scanw obtiene ingreso formateado d e caracteres desde el teclado al estilo de
s c a n f (3 ) la respectiva fam ilia de funciones En verdad, laa ncurnes tran sfie
ren los caracteres recibidos como e n tra d a a SSCanf ( 3 ) , de rrnkio que lóS ca
racteres que no se correspondan con los argum entos disponible» en ol campo
de form ato serán deaechados. Como de costum bre, scanw tiene v arian tes que
incluyen operaciones de desplazam iento (las funciones precedidas por “mv") y
v an a n te s que son aplicables a v en ta n a s especificas rías precedidas por aw">.
Además, la fam ilia de fundones scanw incluyo un miembro, vwscar.w, que
opera sobre listas de argum entos d e longitud variable. Los prototipos do la»
ñmciones relevantes de esto grupo san lo» siguientes:
ült KMfim(cW *fn: {. jrgJ
w t nncs-«ia:*oai *»in, :«»>• * 'a t, < í_ lu t v írg list);
Las páginas del m anuai c u r s _ g e t c n ( 3 ) . c u r s _ g e t s t r ( 3 ) y c u r s _ s -
c an w (3 ) docum entan plenam ente estas ru tin a s y sus diversas v ariantes.
E je m p lo
• V:«re 5*1 sr-sg.-ja* *r. cursgstr.c •/
r
• ftcv.“s_os::j-3«ni.c • Funciares ae icu riej pira ingreso úe cadenas. •/
/• Slt: íx ii -v;«rj_cotCiC9«ii cadena */
•t
»ircluíe ««olí».»»»
<Cj : ü í .1»
«i^clt-de <írno.P>
t ineljó* <»t'ing.“>
h -tcI.:* •jtilfc.’S.í»*
fCafiTB tAMAÁO.SLf 20
246 Programación en Unux
(
Lie c, i * 3;
cnar ca<J«na(23];
cftar ♦pvat«ro_caoera;
a o o _ lo it ( » ¡
crnouelj;
r * fr»s n (};
3«tn»:r(ea4«fla, rAVAíioeuF);
prifltw l’ 3* tlpao: xsln’ , endona);
r»fr*ah||;
»Uep(3|i
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
Lo que viene
E ste capitulo presentó ai lector la API do ncurses. a n a interfaz diseñada p a
ra poder controlar la pan talla en lo» programa.» de modo texto. Aunque Li
nux es un sofisticado sistem a operativo da avanxuda. aún poseo muchas
aplicaciones en modo texto (no-CUI) q u e son muy populares, do modo que
resu lta im portante com prender cómo re d a c ta r aplicaciones que m anipulen
la p an talla un modo texto El próximo cap itu lo continúa con la exploración
de las funciones de ncurses concentrándose en las qun son utilizadas para
em plear color, crear m enús, acep tar ingreso de datoa desde el ratón y tra za r
form ularios y paneles.
f ' i ) > • ) ! ) r ) ) ? t / ) ) ) ) ) ) )
Programación
avanzada con ncurses
E ste capítulo continúa con lo iniciado en el capítulo anterior. Explora m u
chas de laa características av an zad as do las ncurses quo le perm iten a uno
crear u n a in te rta ; rr.aa atractiv a y iencilla de utilizar en su s program as de
modo texto
E ste capitulo cubre loe siguientes tem a»:
• Utilización del 9ub3istema de color de las ncurses
• Creación y m anipulación av a n za d a de ventaniw
• Cómo in te ra ctu ar con el ratón
• Trabajo con m tn ú s
• U tilización de form úlanos y p an eles en progrumna m ediante ncurnea
Todos loa program as de este capitulo pueden ser encontrados «ti el sitio Web
n t t p : / / * w * . c c p . c c n / i n f o bajo el num ero de ISBN 0789722151.
2S0 Programación en Linux
Utilización de color
Ya se ha visto que las ncurses aceptan varios modos de resaltado. Como dato
interesante, tam bién adm ite color de la "misma m anera; es dedr. uno puede
efectuar un 0 lógico del valor deseado de color con los argum entos que corres
pondan al carácter en un3 función addch o cualquier otra ra tin a de salida
(c h ty p e ) que acepto pseudo-caracteres como argum entos. Este método resulta
tedioso, sin embargo, de modo que las ncurses tam bién disponen de un conjun
to de rutinas p ara establecer los atributas de pantalla ventana por ventana.
También para utilizar las prestaciones p ara color do laa ncurses, uno debe ase
gurarse de que el term inal corriente adm ita color. La fundón h a s _ c o l o r s re
torna VEROAOERO o FALSO s<j¡{ún 3 ea que el term inal corriente dinpon^a de ca
pacidad para color o no. h a s _ c o lo r s tiene la sintaxis siguiente:
bw l n»t_color<(void);
El tipo b o o l {booicano) de vaJor reto m ad o so encuentra definido en
< c u r s e s .h >
Los colores predeterm inado# de las ncurses son los siguientes:
• COLOR_8 LACK (negro, valor num érico l )
• C0L0R_RED (rojo, valor numérico 2)
• COLOR GREEN (verde, valor num érico 3)
• COLOR_YELLOW ¡.amarillo, valor num érico 4)
• C0L0R_8LUE (azul, valor numérico ¿)
• COLQR_\IAGENTA (m agenta o p ú rp u ra, valor numérico 6 )
• COLOR_CYAM (cian o azul verdoso, valor num érico 7)
• COLORJVHITE (blanco, valor num érico 8 )
D espués de haber determ inado que el term in al efectivam ente adm ite color
se deberá llam ar a la función s t a r t _ c o l o r p a ra iniciar el subsistem a de
color de las ncurses. El prototipo de la m ism a es:
mt jcartj:aloi*<voi.aj;
N O T A
L55 p a r a m a s que u*j¡lzan rutinas c e color Os tas rvcu.'Ses deben s s r co rre o s en un
e n a ^ o o r d e term ina c u e á cep tt color, tai ccm o u r x t e r n , rx v t c nxtarm con co<Of.
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 :
a t t r s p u ed e se r u n a o m á s co m b in a c io n e s o b te n id a s m ech an te u n Q lógico
d e co lo res y a trib u to s d e vid eo. A m b a s r e t o m a n OK s i tie n e n é x ito o ER R ai
o cu rre a lg ú n tspo d e error.
E je m p lo
E l a g u i « a t « progra m a traza sob re la p a n ta lla lín e a s do colorea
•0*'. »rogr*B« *« Int«rn«t: c o lo r .c . */
(¿IMPLO • fcít* prog-*aaa m junto cor. ; o j d * l C a p itu lo t t v
r
• s o le r .c - AC*líU*tr»eio« 3*1 c o lo r con ncunjt»
•;
íir c lu d # *-»tello.n>
ilfC lu O * <cyr»t».f*>
»incloe* <*rr*«.n>
• in c lu í* < u n u t 0 .n >
•li'd u c* *«tilfcfl».n*
m t M iA (« o id )
í
ir t n, t u i , *a«y,
y it .£SC€ \fOJ»G- 2, 3, Cl>.N_*EOAO- «,
BLAttOJtfOM)* 5. S. t í lí. N B f lO - 7, AUASt'.I.O.SEGPO* 8
tftir • s y r» tíra _ t4 0 s ra ;
a p c _ in it();
• D rtc r u r ir t i tí u r* in a l ic o ití c o lo ra s •/
if(lfu s _ c a lo r* ()) {
p r i« it» t* E a M t e r a i u l *e a a n t a c c l c r 'n * ) ;
ra fre in f);
sleep ta j;
*Xlt;EX"_FAIUf!:;
>
• In ic ia r i l : • c o la r s= l a s o c u rse 9 •
i-* -su r recció n — íflfi
s a l i r 5i _ r r r o r ( • 3 T í r t _ c o l o r , t ; • « rrjjy it, in .a v e rs ió n p re s e n ta 9n
In te rn e t V
refreinO;
}
sl(i#oi3>;
4PP„«XI«()¡
*»it(Ex:rjuccESS>.
»
El primer bloque condicional do este programa comprueba que r;l torminal ad
mití color :i fin de deridir .ii continuar o no; si el term inal no admite la aplica-
d in de colore» ei programa tcrminu. Luego do micializar los pares de colores,
oíectila algunas asignaciones simples de color utilizando m i t j : a i r Después,
d programa dibuja lineas en el term inal, compuestas por el carácter
9 :.ACS_8 LOCK). utilizando nem sat y a t t r o n para establecer los atributos co-
rreapondientes do exhibición para la ventana corriente, en este caso s t d s c r .
a t t r o r 'f cancela el modo en vigencia antes de- pasar al siguiente par de colore.-,.
Como de costum bre, las ncurses proveen un extenso conjunto de funciones
de manipulación de los atrib u to s de la exhibición en ventanas. Los mismos
están totalm ente docum entados en la página del m an u al correspondiente a
c u rs _ 2 t t . '\ Las páginas del m anual que corresponden a C u r s _ c o lo r co
mentan con aumo detalle la interfaz de m anipulación del color que ofrecen
las ncurses.
La calida de este program a se m u estra en !a figura 12-1. L am entablem ente,
los colores aparecen en dicha figura sólo como tonalidades de gris.
) ) } J ) J J . I J t ) )
C apíraio 1 2 : P ro g ra m a c ió n a v a n z a d a co n n c u r s e s 253
Administración de ventanas
U na de iaa principales v en tajas de las ncursea. adem ás de la total ind ep en
dencia que p erm iten obtener do los term inales donde 3e correrá el progra
ma. es s u capacidad de cre ar y a d m in istra r m últiples ven tan as adom ás do la
s t d s c r provista por las ncurses E sto s ven tan as definidas por el p rogram a
dor vienen en dos variedades: sub*voncanas y ventanea independientes. To
das las ru tin as do m anipulación do v e n ta n a s que se com entan en e sta se c
ción e stá n docum entadas on la p ág in a del m anual cu rs_ w in d o w .
CONSEJO
EttesW conoe « o ~3ga *o*ar «*(wrífleamenw, a» -c u n o » mano|.in les códigos tic
wsrro f rr.»r*ra r*jy cástrente: las tonctortes cue 'otoman un valor «ntoro rotor*on
OK v tfenm «uto o E M * fracnuar, 'a i que retoman ounteros rfttornart NUIL en caso
de cue je oradme* u-i error
Las sub-ventanas se crean por medio de la función sutjv/in. So denom inan
asi porque constituyen ven tan as b asa d as en una v entana existente. A nivel
del lenguaje C. las sub-ventanas 3a n p unteros a otros punteros que señ alan
a un subconjunto de u n a estructura, de dato s de patrón WINDOW ya existente.
E ste subconjunto puede incluir toda ia v e n tan a o sólo parte de ella Los sub-
ventan as. tam bién denom inadas v e n ta n a s hijas o derivadas, pueden so r a d
m inistrad as prescindiendo do su s v en tan a s m adre, poro los cambios hechos
en las v en tan a s hijas quedan reflejados en las ventana* principales.
Las nuevas ven tan as autónom a* o independientes se crean m ediante la fun
ción nemmin. E sta ¿unción reto m a u n puntero a una nueva estru ctu ra de p a
trón «INCOtf que nu tiene ninguna relación con las dem ás v entanas. Los cam
bios efectuados en una v en tan a independiente no aparecen en p an talla a
menoá que se io requiera explícitam ente. La función newrtin añade al re p er
torio de programación potentes prestaciones de manipulación de pan talla pe
ro. como resu lta frecuentem ente el caso con el poder añadido, el mismo trae
aparejada a n a m ayor complejidad. S e requiere que uno m antenga un segui
miento detallado de la v en tan a y q u e solicite explícitam ente su exhibición en
la pantalla, en tan to que la actualización de las sub-ventanas es autom ática.
’
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;
E jem p lo
El program a siguiente crea una vontona hija, escribe cierta cantidad de tex
to en la raúxna y luego la desplaza por la v en tan a m adro, ilustrando así có
mo las suo-voutunay pueden .ser a d m in istrad as con preacindnncia de sus
ventanas m adre.
/• sofl'jrií <joi pnorama *n Intornei;: sutr-in.c •/
r
• íua vantana.c - ¡toxinas u tilita ria s üu la » para gestión ae
»uB-v*nt<m* •/
V
ilr.c h .u o < 5 td lia.li>
ifin ciu d * < c u n « 3 .n >
*;n cluce <errr.O-ft>
•ir s r lu o c <unist<l.n>
«incluís •uulfcns.ft,
in : nain(void)
(
WlíitJCW *ventana_ni]a;
in t y w x , xa¿x, n = 0;
wbjcgd(5tascr, X > ;
w re fr3 s n (s ta s c rj;
= si;Ewini3W scr, v i, 10, z, 3)) w ll)
s a i i r ^ á i j í r r o f ^ 's u t r n i n ') ; I ' « r r q m t , en la v e rs ió n p re se n te en
in te rn e t ' /
■tokgdfventanajtija, 1 •};
«p rin tw ív tn ta n a j’. i j a , *\flSUB-VSNrw<A\n');
C a e ííu io 1 2 : P r o g ra m a c ió n a v a n z a d a c o n n c u rs e s 2 5 5
s ím o ' i j ;
tvw in (v e n T 4 n a_ f!Íja , l l y i u * • ! í » / 2 1 , n ) ;
r« fr?a h ();
s lM 5 ( i) ;
n •• 7 ;
>
•tit|EXtT_flHlu«É);
>
Prim ero. la v e n tan a m adre se llena de X m ayúsculas, y luego so croa una
sub-vontana on blanco de 10 filos por 10 colum nas. D espués de im prim ir on
ella ia palab ra SUB - VENTANA, la ultim a p a rte del program a mueve la aub-
v en ta n a dentro de su v en tan a m adre O bsérvese quo como el contenido do la
ñub-vent-ana nunca cam bia, sólo re su lta necesario refrescar la v entana m a
dre. Debido a la n aturale^.i dinám ica de la salida de este program a, on la fi
gu ra 1 2 - 2 sólo se m u estra p arte de la m ism a.
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
tu ; naLnjvoiOl
(
víI hüCk •p-.int4i'o_ventan¿«;
U it /n a x, «rax,
a p p .tn lt! ) ;
t r i l w l f l - a w w u t p í , 3 0, I, 1 ¡) — MULLI
s a lir j¡:_ e r r o r | / • • r r j q u i i , en lo vo rsio r. pre«„*r.:e «n
IOMrn«c •!
n vv«jrim w {puft:ero.,ven tana1 5 , 1 , ‘ NúSV* V E N W W |;
s o m p u rts r o v ír it w a . AC3 V L I í í , AC3 HUME}; /* v e r TaDla an A'JS en Cap 11
•V
«rrefrein(puritero_viptana>;
s ie e p (t);
n v w in ip u r.ra ro j^ a n ta n a , 5, ' 0 } ¡
»era=e<5 tascri;
refresh();
wrafres?J{«in);
sl< epi21:
C sqí' u 'o 12: Programación avanzada con ncurses 257
=•«?*«*( >:
«r 5"r= =-! 5¡.-ti-3_vr-tsn= ;
*iwo(2);
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
C ONSEJO
Cerro la interfaz oor les ratones no se verifica en otro am&to que no 593 el do 135 -cur
ses. el lector so te te zscQirv Oe t&XV todo cód'gc relacionado con o: ratón cor. una ex
presión < * ifd e f/ «e ls e / ^ e rd if, de modo que e< programa r>o soa comprado en un si?,
tema que no utíüce ncurses. Ce hecto, el mejor diseño es o! Que aísle las secciones del
cótf&o fuerte relacionadas con e< ratón en tan pocos módulos de corr^> nación coroclonaI
ccrra restfte pcs&e (prefooO¡emento sóio uno). Por ejenp-'o. para compilar de manera
condicional cótfga para el ratón, v.T';ice una construociór que so asemejo a la siguiente;
XC(JflS£S_WUSE_VERSlCN
r
• 51 te aan Lis conciciones para ¡tcoptar ol ratan
• ei cotíigo que involucra al ratón l * u aquí
*I
«ola*
r
• Si el ratón no sudta&e ior aceptado
• Colocar aqui algún rotoío alternativo
•I
«endif
St el sistemo admito «I uno dol ratón, m « I f d o f ev.iiuiKft n 1 (vrroncero) y v¡ ejecuta
ra la sección do código quo vwrne despuós de M tfd o f, En coso contrate 'o auo so 0J0-
cutará sera «1 blequo Oe código que viore denpuéa do *oiso
G e n e ra lid a d e s s o b re la In te rfa z d e ra tó n
El procedimiento básico a seguir pitra u tilizar la interfaz de ratón es razona
blem ente simple. P ara h abilitar la detección de las acciones dul ratón se debe
rá llam ar a la función inousemasfc. Con el ratón activo, los lazos presentes en
el program a deberán e sta r atentos al valor retom ado KEY_M0US6 de w g etcn ,
que indica quo so encuentra en cola de espera una ucción del ratón. P ara ex
tra e r la ucción de dicha cola de espera, utilice la función g e tn o u s e antes de
efectuar la siguiente llam ada a w getch.
Las acciones de rató n que se pueden in terce p ta r incluyen, según sea el e n
torno de programación, las de p u lsar y lib erar cualquiera de sus butor.es. los
clics, dobles clics y triples clics, y posiblem ente el estado de las teclas Ma-
yús, A lt y Ctrl. P a ra ingresar acciones del ratón, se debe esta r ejecutando ya
sea gpn ( 1 ) , ol servidor p a ra ratón de A lessandro Rubini para la consola Li
nux. o x te rm y program as sim ilares, tales como r x v t , que inform a de Sas
acciones del rató n a través del servidor X.
PRECAUCIÓN
-ámen'ao.eíT’ente. la mayoría ae las versiones do gpm, el controí&dor ce consola psra
■atón. oue nace funcionar el contrcíacior de ratón de ;bs ncurses. están íinK.eadas con la
biblioteca de clises BSD (li b c u r s e s . [ a. s o ¡ ). Como resultado de olio, o! código di-
ser seo oara administrare ratón 00 funciona adecuadamente fuera del c^Mro. Psra lo
g re aue óircicre cor-sctamente. se ceoe descargar y recompiiar el cóc.-go fuente oe
as ncurses que viene cor a correspondiente distribución y luego reconstruir ei caer-on
y a Oibiioteca (lib g p a ) del gp>n. Unkeéndoia con las ncurses asi reoonstruicas.
Capítulo 12: Programación avanzada con ncurses 259
3 JJ j . E je m p lo
- :. i y Este program a d em u estra el procedim iento básico de intercepción o inter-
,- ^ 1 pret¿ción de acciones de ratón en un p ro g ram a ncurses.
ejIM Pio ' -.5K - Í ;s l o r a r a n » an I n t im o s : ¿ s a n o u s e .C */
/*
• - z . r u _ r .c - s e n c i llo 25 -in te rc o c c ic ? 3= ic n o n a s da •joüsc
2=-2t5Tts : c . r i í i
L
> ) ) ) ) ) ) ) ) ) > ) > >
260 Programación en Linux
«include «ruases.?i>
Ju x lu a e < í t d iia .h >
# in d u c e « e r r io .h »
•ín c iu d a < c t y p e »
* in c la d e • ü t i l f c n s . h ’
in? aám(vo:ci
i
nra9*_t lascara;
MEVSNr a c c ic fl_ ra tc n ;
In t c tx lig D _ a sc ii;
4D0_irilt I >:
ccreax(); /• Activa rodo soroak •/
/* cSt-JO lecer 3tdSCr •/
k 9 y o a d |* M s c r. rnuE); /* P a r n it t in t e r p r e t a r p u ls a c io n e s 39 t e c l a s y
ü o tgn a j ijo ra tó n •/
/ • E s t a b le c e r la m a c a r a do a c c io n e s p ara - e q l s t r a r l a s tc d ss • /
r a s c a r a • ncjs4n,in«(ALL_MO-J5f-_EVEHTS, M U I);
9X¿t{SXl T _ r A í i . U S s I;
J
El program a establece el modo c b r e a k , de modo que la m ayoría de las pul
saciones de teclas p asará n por el controlador de term in al del kerr.el sin ser
afectados. Keypad in te rp re ta la s secuencias de escape generada por los clics
y orras acciones del ratón, lo que e v ita que tenga que decodificarlas el propio
p ro sram ad er v su código fuente se llene de montones de símbolos sim ilares
a * [ (U# 1 ).
D espués de configurar la m áscara d e acciones del rató n p ara que ca p tu re to
d as sus acciones, el program a in g resa a un lazo y aguarda alguna acción del
ratón p a ra interceptarla. La m era acción de oprim ir uno de I03 tres botones
del rató n g en era el m ensaje correspondiente; si la acción es otra, el progra
m a im prim e un m ensaje de A c c ió n de ~ a to n no i n t e r c e p t a d a . Ti-
oeando ’s* o ’S ' se desactiva el modo e b r e a k y se sale del program a.
La figura 12-4 m u estra la salid a o b tenida luego de oprim ir cada botón del
ratón en orden de izquierda a derecha, y luego haciendo doble clic con los bo
tone» derecho e izquierdo.
E je m p lo
Est«* ejemplo crea dos ven tan as sensibles a la presencia de un ratón. C uando
uno hace clic en una de los ventanua, el program a exhibe en qué ventuna tu
t J t M P lO vo lu g ar dicha acción y m u estra las coordenadas correspondientes en In ven
ta n a adecuada.
/• Vc«cr* ¿el proflrtni» en Internet: ua«HWa#.C 'I
r
/•
• icu rstjM ta n 2 .c • Progran* sencillo de intercepción de acetonas ce *ouso ne
niante n c u rm
•/
lU n cluae < c u r s« j.n >
*w clod« <s:alib.h>
#Uicluoa <arrno.h>
«include «uniste.n»
•indita* <ctyp*.ft»
# indude *jtilT c n s .n *
in t M in j v o id l
<
nnóSK.t «aseara;
ygvéNT accion_raton;
WIKOOW •ount6nj_ver.Tara;
in: :a r 2cter_ascu;
app_tnit();
ce < **a < 0 ; /* Activa aoca cDreaic */
C a p ítu lo 1 2 : P r o g ra m a c ió n a v a n z a d a c o n n c u rs o s 263
/ * E s t í s l f c í f a ta s e r *
* v o r im s ( 2 , t , ' V c k 'ía j • • • \ i r t n ’ ) ;
♦ « 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
• £ 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 ).
* f t i l « f ( t o c p c * r ( e a r » e t * r .a » c u * g e r c a i ) ) ) * -S ‘ | {
if(c a ra c T « r_ a ic :i *- KE'f_M0US£) {
g a - jc js t (ia c c ic n j-a to fl>;
i ' « ''c l i s a t p u l í e r s _ * e n : a n a , s c c i o n j ‘« o n . y , a c c t o n _ r a ta n .x | ) (
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 * ) ;
}
so* s t : s c r , A C S vU K é . ¿ C S _ r fl.:s ;!:
sc< I i n , ACS_VT.:ME, ACS_Hi.:Né);
J ) ! I > ! ) f ) l } ) ) ) > ) > •
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:
Utilización de menús
La biblioteca de menús de las ncurses provee prestariones independientes de
term inal para crear sistem as de m enús en term inales de modo texto. Las mas-
mas incluyen funciones para crear y modificar ítem s de menú y para agrupar
ítems en menús. exhibir ios menús en !a pantalla y ad m in istrar v ah as otras
ínreracriones de usuario. Igual que con casi todas las ru tin as de las ncurses.
antes de que se puedan utilizar los fragmentos de código correspondientes a
j > ) j ? f ) ) } 1 ) ) J . » i ) i > ))
Capítulo 12: Programación avanzada con ncurses 265
£_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 je m p lo
E ste program a crea u n m enú sencillo con in a lista do cervezas M u estra có
mo navegar m enú arrib a y menú abajo.
(K M Pio I* H>*or# 3 «l #r Intem eir uj**#mj.c */
/•
• w a jM ^ a .e - u t l l i í í c u n at le* i«ny* provisto» 00*“ neurita
•I
< cu m i.it>
#LXiuC«
•tn c lu o *
•l/iclyc* <c:yo#.P>
ItncU rt* ’ uxil^ cnj.n *
tn-; M ia|voi3|
í
i t K Í C C0«*T : r ¿ r * c * < ir * :i» [I •
{
'3j«»«:s*r*, MUlUr', ‘Pj &st*. ‘Scftlitz*, ’MGO', ‘Ccorj'.
•S M r« r\ * ? M r r , ’ LCfl# S t a r ’ , *Aair.t»r*, ‘ C a rla o n ’ , « r . l
i;
co*5t : m r •*pcfltír<j_cervMss;
m : c>3i$o_3sc:i:
■Tai (c*rr«i*s)];
rríll '•pafttero.tteM • iteas;
i©*¿
' I n í c ia lú a r TCvrsss *
»5 C _ i* ít();
• í'- T C z r e - .z r p o lsa c ic r .e s : s r a d a s p a r a c u r $ c r ;r u r c ic n * /
Ííy2»3ís-:cíc.', T31S;; /* i t s m terprsTar pulsaciones 3e te d a s y
M t - y ü 3e ratón ‘
>
/* 3 # tlra r «1 nitmj •/
un poi:_n«flu(nijM nu|;
r F i/ ia lt ia r la s ncur9es •/
k«ypac(stOscr, FAlSE};
a p p _ « x it ( J¡
>
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
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
n t fr**_íon»(FCF*
int o c s t . f o - í ( P C • f o n i .
int unpcst_fOf*(FQ& ’ f :* a );
int f c r í _ í r * « s r . ' f f o a w • ? : ' * , I r t c » ;
ne#_* - e i d crea ar. nueva campo de he íg f i t álas y w idth colum nas. E sta
llam ada ubica la esquina .superior izquierda dei campo en laa coordenada»
7 , x) especificadas por el p ar "oprow . l e f t c o l ) Si cualquiera áe las filua
del campo tu v iera que perm anecer oculta, se deború tran sferir s u num ero
respectivo a c ' f s c r e e n . n b u f f e r s re p rese n ta el núm ero do buífors adicio
nales a se r asociados con el respectivo campo. new _f i e l d reto m a un p u n te
ro ai nuevo campo o NULL si tiene lu g ar a lg ú n error.
* re e _ ? i e i d libera los recursos asociados con f i e l d . La función retom a E_OK
tiene éxito y E^SYSTEM^ERROR o £_SAC_ARGUMENT ai w produce algún error.
La S tn ical de todas estas fundones corresponde a la imrial de EXECUTICN.
n e » _ * o rn crea un nuevo formulario, asociando con ol mismo los campos
presentes on f i e l d S y retom ando un pu n tero que señala la ubicación del
nuevo form ulario, o NULL si ocurre alg ú n error.
f r e e _ * o r n libera los recursos asignados a r.flv#_í o r n y desvincula dol m is
mo los respectivos campos. Si free.form tien e éxito, retorna E OK. Si tiono
lugar algún, reto m a E_SYSTEV_ERROR, E_BAO_ARGUMENT o E_P0STED.
p c s t _ ' o r “. exhibe el form ulario en su v e n ta n a , después du una llam ada a
r e f re 5 h o alguna fu ndón similar.
u n p o s t _ 'o r'"! re tira el formulario de la ventana. E sta función retorna.E_OK
s: tiene éxito. Si ocurre algún tipo de error, re to m a rá uno de los siguienteo
valores: E SYSTEM ERROR. E_9AD AflGJUMENT, E_8A0_STAT£. E_N0_R0CM,
E_NOT_POSTEO o E~'¿OT_CONNECTEO.
5 e t _ ' ield_bu^^er* asigna el valor de la cadena al buñer indicado por buf que
esté asociado coa field. Estoa bufiers son creados por el argumento nbuffera
transferido a new_í l é l d _ b u f f e r0 sa el que es manipulado por la biblioteca
de inenus. Todo? los demás boffers deben ser administrados por el programador.
s e t _ f ¿ a id _ O D ts perm ite establecer div ersas opciones Toda* las opciones
válidas p a ra * i e i d e stán activadas como opción predeterm inada, de modo
que opts contiene las opdones a desactivar. La tab la 12.3 lista las opciones
que se pueden desactivar.
s e t f i e l d u s e r p t r asocia a i*«eld los d ates de aplicaciones transferidos
a userptr. Dado que u s e r o t r es un p u n tero vacio, puede se ñ a lar a cualquier
tipo de puntero.
’ i e i s u s e r o t r perm ite recuperar los dato s señalados por ñeld de
s e t _ f i e i d _ u s e r p t r . que reto m a ei p untero a f i e i d .
Tabia 12.3. Opctcnes cíe ñe-'d que se ouecen desactivar._________________________ _
Opción_________ Descripción_______________________________________ _____________
0 _ V !S I3 L E 3 campo es e*riC*dO.
C _ * C TIV E 3 campo será visitado d u a nte el precesam-ento. Un ;amco invisible
re puede Se' visitaGo.
continúa
272 Programación en Unux
:n : n*in(vouti
<
FOBM •(‘enrularlo;
FIEU) *canpos(Si.
tr.t co a ig o jia cll. 1 - 3 ;
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É);
WLH; '
í¿ 3 C « S [ 2 ; - >2, 2 , t , S, J i¡
S € t _ f i ;l i 3 _ 5 u í í * r ! ^ « p C 3 { 2 ¡ , 9, *¿0«IUO9 : *):
í t t . f i t i i . O O t i u o a o s ¡9 ¡, ■ f : 3 : c _ : í t s ( ; a - a c s ( 2 : i 4 -0_ACTTVE);
CÍ*3C3>;2Í * M V / i e L d l I j ¿ i , 2 , t 4 , Í , Í ) ;
* « :_ ? Í « U _ u $ t r o t r ( C M e o S [ 3 I , m a.i i :
/ • C re a r e l 'o r s u ia .- io y u o ic a r io en p a n t a lla •/
fo n u la rio = n*»_to*fca«pM | ;
p o i? í » “ B |c a c o G 3 ;, * =3*.i fu n c in r ¿ e j.3 i '. fa m u L a r lo l i s t o p ara e x n iO lr an
H ftt llil "
r* fr* s r(); • é s t a fu « c :o r es la tjue v e ra a -je ra re n te uoico o l fo r m u la r io en
p a n t a lla •/
? 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),
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.
Lo que viene
En este capiculo el lector compietó su estu d io de alg u n as de las prestaciones
m ás avanzadas de la s ncurses. El próxim o capitulo, “L a API de sonido:
O SS’T ree". continúa con tíl recorrido de la s interfaces de program ación que
ofrece Linux.
La API de sonido: OSS/Free
H asta no hace tan to tiempo, tas tarjeta3 de sonido y su correspondiente soft
ware se podían obtener sólo como dispositivos com plem entarios o accesorios
add-ons) que se instalaban después do la compro de u n a PC. A ctualm ente,
h asta las denom inadas ‘PCs p a ra negocios" incluyen en su plaqueta principal
mutherboard) algún tipo de h ard w a re de sonido. E ste capítulo enseña loa
fundam entos de la programación de u n a ta rje ta de sonido. El miamo ofrece
un breve panoram a general de la tecnología de ias tarjetas de sonido y luego
comienza con el análisis de la API d« sonido de Linux OSS/Free (Opcn Sourcc
Sound/F nre ®n español Sonido da código fuente abierto/Gratis):
E ste capítulo cubro los siguientes tom as:
• Descripción del hardw are de sonido
• P au ta s generales para p ro g ra m a r el h ard w are do sonido
• M anipulación de dispositivos m ezcladores
• Program ación del hard w are p a ra MIDI
• Redacción de program as de reproducción de sonido
• Presentación de prestaciones a v a n zad as de sonido
Todos los program as de este capiculo pueden w r encontrados e n oí sitio Web
n t t p : / / '« w w . n c p . c o a / i n f o bajo «1 núm ero de ISBN' 0789722161.
278 Programación en Unux
Generalidades
Las tarjetas de sonido no son dispositivos de hardw are monolíticos. Por el
contrario, 3e hallan formados por varios componentes. Aunque existe u n a con
siderable variedad de diseños entre los distintos fabricantes, y h a sta en las
tarjetas producidas por un mismo fabricante, la mayoría de ellas cuenta con
una interfaz MIDI, un digitalizador de voz, un dispositivo mezclador o ntixer y
un sintotizador La comunicación do Linux con esto tipo do dispositivos se ob
tiene por medio do archivos ubicados on el filesystcm /d e v , a saber,
/d e v / m l x e r , /d e v / d s p , / d e v / a u d i o , / d e v / s e q u e n c e r y / d e v . m i d i
H a r d w a r e d e s o n id o
La interfaz MIDI {M iu ita l Inntrum ent D igital Intcrfacc) es un puerto por
donde se puedo conectar a u n a com putadora dispositivos exvomon, especial
m ente aintetizndoros. poro tam bién «quipos do iluminación y otros acceso
rio» de empleo en espectáculos.
El mezclador o mú&rr es un dispositivo do control que supervisa los niveles
de volumen de la en trad a y la salida y conm uta e n tre los dispositivos de e n
trad a disponibles, talen como micrófonos y discos compactos.
Los digitalizadores de voz se em pican p a ra g rab ar y reproducir voces d igita
lizadas G eneralm ente se los denom ina según los codea, o algoritm os, u tili
zados p ara g rab ar y codificar u n a m uestra.
Las dispositivos sintetizadorcs se utilizan p ara ejecutar m úsica y g en erar
una am plia variedad de sonidos y efectos do sonido. En general, los sinteti-
zadores com prenden dos categorías. Uno de loa grupos esta basado en Jos
chips Yamaha OPL2 y OPL3, que son los empleados en la mayoría de las
tarjetas de sonido. El segundo grupo son los sintetizadores de tab la de on
das. que producen sonido a p a rtir de m u estras de instrum entos pregrabadas
en chip3 p resen tes en la tarjeta. De los dos tipos, los sintetizadores de tabla
de ondas producen sonidos mucho m ás ricos y completos.
D is p o s itiv o s d e s o n id o
El ñlesysrem de Linux /a e v contiene archivos de dispositivo que Be corres
ponden aproxim adam ente equipo por equipo con el hardw are de sonido dispo
nible. Tbdos las archivos de dispositivo finalizan en u n núm ero N. general
m ente Z, 1 o 2. al cual es vinculado simbólicam ente el nombre de dispositivo.
Por ejemplo, en mi sistem a, /d e v /m ix e r es un vinculo simbólico a
/ íe v /m ix e rfl. El resto de este capítulo, excepto cuando sea necesario alu d ir
a archivos .específicos de dispositivo, hace referencia a vínculos simbólicos,
/d e v / m i x e r es la interfaz al hardw are del mixer, m ien tras que / d e v /d s p y
/d e v / a u d i o son las interfaces principales con los dispositivos digitales de
voz. Las únicas diferencias e n tre los dos es que / d e v / a u d i o utiliza como
opción predeterm inada la codificación que respur.da a la Ley u (p es la ierra
griega m u), que rep resen ta m uestras de 12 o 16 bits en S bits, m ientras que
'd e v , d sp utiliza codificación lineal sin signo de 8 bits. El dispositivo utili
zado p ara a d m in istrar 1a m úsica electrónica y los sonidos em itidos por ios
juegos electrónicos es / d e v / s e q u e n c e r . E s la interfaz a los chips del sinte-
Csoítulo 13: La API de sonido: OSS/Free 279
tira d o r p resen te en la ta rje ta de sonido y tam bién puede ser utilizado para
acceder dispositivos externos de MIDI y a la tab la de or.das. Finalmenco.
/ C e v / r i d i se u ü liia p ara las salidas d e MIDI de bajo nivel.
P a u ta s p a ra p ro g r a m a r s o n id o
Las siguientes p au tas h a n sido e x tra íd a s de la guia de program ación del
OSS. escrita por K an n u Savolam en. a u to r original de la API de sonido de Li
nux. El docum ento completo puede ser encontrado en la Web en
h t t o : / /VMM. ¿ f r o n t - t s c h . con-./ p g u x d e / i n t r o . h tm l.
Prim ero y principal, la API do sonido e s tá diseñada para p erm itir que las
aplicaciones escritas con ella sean p o rtab les tan to entro sistem as operativos
como e n tre hard w are de sonido. A C3e fin. la API so apoya en macros defini
dos en <sys/souncícard.h> Aunque la implernuntación hn cambiado y
continu ará modificándose a medida que el controlador de sonido se vaya de-
?arrollando. los macros siguen siendo coherentes. Además, no redacte en sus
aplicaciones código que empleo los archivos num erados de dispositivo. E n su
lugar, utilice los vínculos simbólicos d escritos en la parte anterior, "Disposi
tivos de sonido*. Los usuario* pueden c o n tar con v an o s dispositivos de soni
do diferentes o ten e r otras razones p a ra u tiliín r númoros do dispositivo d i
ferentes. pero los vínculos simbólicos a p u n ta rá n uiemprc hacia los
dispositivos que los mismos deseen e m p lear para un propósito determ inado.
Evite sobrecargar su aplicación do prestaciones glamoroaas pero de poca im
portancia p ara el propósito principal de la misma. Si va a escribir un repro
ductor de CDs. por ejemplo, éste no necesita contar con la capacidad adicional
de g rab ar sonidos En la m ism a tesitu ra, no dé por sentado que codo el mundo
vaya a em plear la tarjeta de sonido m ás avanzada do todas. En cambio, escrí
bala p a ra el mínimo común denominador, 13 tarjeta Sound Blaster, y luego
agregúele código que detecte otras ta rje tas de sonido específicas y utilice con
ellas determ inadas prestaciones avanzadas o especiales (ver el título "Progra
mación avanzada de audio' para obtener información sobre cómo hacerlo).
m
i ) ) ) ) ) ) . ) ) } ) * ) ) ) i y ) )
C aoítulc 1 3 : La API d e so nido: O S S /F re e 281
«í.’Klwae <s:o:o.ft>
t i r c l ' - c t <s>»ríoc:1..-.>
«ificlyc* <trtiisc^nCitr3.t-.>
« o ;c i c ; r i 3 i r _ i s ; s 3 0 ? : í f l T c c n a ic io n ) ; • F u rcia n p> m p r i n i r a s t a c a s c o r r í a n o s
:i c o n :rc ls i 7
i r t n a ir u o id l
{
ifl: c e a c n s t c r ^ a r c e i v o ; I • c ^ a c n p iG r a « 3 rc m v o p ara ? i a i s p c s i t i v o
n e ic la sc r ’ t
Programación en Linux Capítulo 13: La API de sonido: OSS/Free 283
son»? char *rotU lO S[| - SC^JíJO DEVÍCE -ABELS; I ' Xonbres de lo s c a í a lo s -Jal
M íe la t ío r » t
pm _s?a tl(t « 1 1 i d i5 c o s it lv o _ « t t r ío ); I ' ¿P';»de ooerar on
in t l ; M M e s t«r«> ’ *7
/* V i s a r a s ce b i t s para a ju s t o da lo s d i s p o s i t i v o s ' !
in t fje n t e _ g r io .ic ia n , T ascara d i s p o s it iv o s , ita scan i g r a a s c is 'i
■ 3 iJD 0 5 i:iv o _ 9 ít« ir?o , ca p á cid a tíe s; i* ((1 « l ) i :ispo3itivo_ast9r90) { Si ■»! dispositivo «S «sto
r*o, acstrar los mvelss de 1 « fie» d ía le s */
/ ' ¿ in -ir « I d is p o s it iv o iw z d a d o r s o lo para le c tu r a •/ : f (d e < t l(í* s c r ‘ pí*r_3rcíilvc. MÍX£R_S£AO(l|, in iv u lM < 0)
i * ' { 3 e s c r íp t a r _ ir c h l v o - o p H n < d iso o sltív o , 0_RDONIY)) < 0 ) f p e - ro r r s a w j.w lx s flje A O * >;
e r r o r jf 'o p o n ’ ) ¡
p r ir t -r VJCÍVS v j d W , n i v « l 4 0 « f f . {n ive l 4 Sx'fOO! » B|;
e x itis x r r jA iu u B c ) ;
>
) aisa ( /* Si « 1 «a re , aostrar aoio un canal */
• O o :e i« r in fa m a c ió n jo b ru o l i n ic i a d o r •/
Ifd lc c tK d o s c rip to r jrcR iva , wtXSa_RÉAC{ 1), & .H v«i)) < ai
i * ( ( i o c t l ( a o s c rlp to r_ irc r» iv o , SWKO_MIX£a_REAÜ_RECSRC, S íu n m a jjr o b s c ic fl) ¡ < 3 |
pa.'r.jrf •S0UN0_MtXSa_a£4a-);
[w rr?r< * SOUSO.U I X€B_n 0 ,0 _R£CS«C * ) ;
^ ^ i r i ; io c t U d u ic r io t 3 r ,.ir c n iv a , 3IXjN0_UIX£R_flf-AQ_C€VMASK, « M $ c a r u jils i» s í.t iv o » > ) V f lS V , m v « : i « « f f >;
p e r r o r (• SOUND_UIXH.i1_REJ'0_06VHASK') ;
>
^ i f ( í i o c t l « l « a c r i p w j » r c h l v o , SCUW>_M! xCfl^EAOJlECUASx. SffasC B M jjraD A cio r.l)
J
pirrorCSCUHO.»IIXEfl_REAO_RECWA$K-1; >
< ^ M, ( l i c < t l < « o s c r i p : o r _ ,i .'m v o 1 KXirojítXERJtEAbjiTEflÉCaEVS, M ls p p B ltiv O jíS te r s p ) ) /• LSon ix c iv > « n m U » fy«n:«s para grabación? mi
p r y i* f(‘ -r.Ate<v:icfl: -.as opcicr-ti d* fuente para grabación ion *).
3 * r r ; r { ■SCUNC.urxERJIEADJTcREODEvS* 1 ;
i f ¡ ; l o c t l « l e s c r ip t < J r jjr c i iiv o , SOüNO_MIX£R_REAO_CAP$. ¿ c a p a e id a o iis l) < i | i f | iicasacidadas 4 ia JHQ¿¿?_ZXCA._:Wl))
psrrO(‘ ('SCUND_U!XEfl_READ_CAPS"¡ ¡ príntf(*!>o •);
v ir .’t ( ‘ í*riuy*'-t»s. vn* l ;
[fsp ria iir m ro rn a c io n sobra o l ro z e ia d o r •/
p r i r t t f r - s t a o o do % s:\n \n *, d i s p o s i t i v o ) ;
c r m t f | 'C an al Fuento F ia n te O is p o s itiv o * Cérrar e l dispositivo «eíciacor •/
w iv « l\ n * ) ¡
clossídescriptor ze archivo),
p r iflt Y ( ’ Uo£claO cr ü.-aaacion A c t iv a £ s t ir& c
returfl i ;
C«*intí( * ----------------------------------------
--------------------------- \n-);
ron ; i = a t < SOUKOJUIXGR.NROEVICES ; * -i¡ t f Racorrer todos los roía iaprixir_3staoos{int co ^ic io n
a is o o s it iv o s ’ i
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 ;
•ir c lu c e otdLo.it>
•incl¡jd« < s y s /io e ti.t>
atpclw d* < *c n tl.t*>
#irclud* <jyj-jcuc<jcar: f>
m t « t i f l l í a t i n ¡ C . citar •«r^w{ | )
(
i r t canal u c u ltrd o , canal deracno, n iv e l; !• Ajusto* do volunon
•/
int e u p c a ttiv o ; /• Que dispositivo* configurar •/
U t l;
in t descriptor ard u vo ; /• Qoscriptor ce arcnivo ael d is c o iltlv o
Mxciaoor •/
t.*!t « K i r i dispositivos, d iip c s itiv o esteroo; r «asearas do Q lt» para
ajuste so lo»
S u p o s itiv o s •;
sfcar 'd i s p o s i t i v o • V 'd e v / n i x o r * .
cnar a u f[51;
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
•/
n iv a l * (canal_derecno « d| » canai_izquierfio;
í* 11 (EXIT_FAII.ÜB£);
>
««sc-icto^ar-r* ro):
iftv rr' •;
>
La salida de este program a es ia siguien.ce:
3 i'íijar_*oluo*c
i-ie v c .-¿v» 1 á» * o lu * tn ?5
* i « « I í « veluacu Ce d * W »H «r astaalecido *n 75S t ?5H
Después de declarar sus variables, f i ] ar_voL um en abre el mezclador acceso
de lectura y escritura luego llam a a i o c t l con los macros SOUND MIXE •
R_READ_D=VUASK y $OlM>_UlXEfl_REAO_STEHEOOEVS como argum entos a
fin de determ in ar los prestaciones del mezcludor. El paso siguiente es obtener
el nivel de volumen preferido por el u suario Obsérvese que el lazo do •w h iie
conUnúa h asta que se ingrese un nivel do volum en válido (entro 8 y 100).
La fijación del volum en es un poco m ás in trincad a. Tal como so vio a n te rio r
m ente. p ara codificar ei volumen dol can al derecho en el byto sup erior (o
m ás significativo) de n i v e l se debo u tiliz a r el operador de C de d esplaza
miento de bita h ac.a la izq u ierd a La expresión requerida es:
m v*l • ic»naX_d*r«cfto « S) • e«/>»l_Uqui*ft»o;
La expresión en tre p arén tesis desplaza el valor de c a n a l_ d e r e c h o ocho
bits h a d a la izquierda, ubicando ¿ d o s su s bits en el byte superior, y luego le
agrega el valor de c a n a l _ í z q u l e r d o , asig n an d o el resultado a n i v e l . I-a
API de sonido decodifica adecuadam ente n i v e l d« modo de obtener loa nive
les de volum en im puestos a los canales izquierdo y derecho.
P ro g r a m a c ió n d o a u d lo
Este punto m o strará cómo llevar a cabo u n a programación sencilla de audio
concentrándose en ia reproducción d* sonido y dejando de lado la grabación,
principalm ente debido a limitaciones d a espacio (bueno, y tam bién al peque
ño y triv ial detalle de que yo no dispongo de m anera alguna de g rab ar soni
dos en mi sistem a -. Las técnicas de grabación, sin embargo, son esencial
m ente las m ism as. Donde la reproducción requiere u n a llam ada a w r i t e
que incluya el descriptor de archivo del dispositivo de audio, la grabación re
q u erirá u n a llam ada del mismo dpo a r e a d .
NOTA
pya Bfivsr a caco -c rras órnese. graoar scr-ocs en -.anotas oe s.vco senvoup,!:*, toce
o <3j» se raoúere -oce-' rS vaertss’ un m-cnifano 8 13 eotrsaa óe a misn-a rotulaos MIC y
z& rer¿ x i ffT A ü _as taretas za Oup<c» cieno. o *uiicuc<ex. an carrea, son irás com
^eíss a este 'esoeco xnzue uno Jueoe granar y rsproajar ai mismo tiempo. Zo moflo
3j6. acedas ae Jacor uc&ardo ja micrófono». una ta«Jeta '-¡Kiupiex perrr. te graoar por
: can* *3 ce envaoa c que se cszt ejecutanoo er, ese memento oor su c=ra¡ o
candes « ca.3 & c 3 r« a a se?*.?! r-e se graoe toco ’joo de oanstarmacores
CONSEJO
--=rs ooísnsr más infirmación soore - prcgramacicn w a ^cirimecia. osoeciaimenja
so-co. en Linux. ver anta V u r-s¿ 3 Guido. de -H‘‘ 'ranter.
J J ) ) t- ) ) ) ) > ) ) ) J > J ) }
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.
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© • /
c-‘“4 r ‘ d i s p o s i t i v o * ‘ /« tv /tí» c ‘ ;
e r a r c w ff« r _ « * * s t ^ { T ia u v c _ 3 U F ¡; / • S u f '« r p a rs la n u a st-a V
r * e i" ir /« *w a » p • ;
: í ( < « * i : r i a t 5 r _ « t i p « * i : i v o « o o * n { < J i w s i t t '» o , Q j**C n ly ;> * o /
j f ( t r r « o — D U S *} {
# p r u » t f ( « a « r r , •%* « t * a «o u a o v n *. a u p o t i t i v o ) ;
>
f p r i n r ? n : a * " r , *V *: % a ln \ e u c o j i t i v o . » t r a r r o r ( « r r n c i );
• * i t { 6 x :T _ p * :u a t £ ) ;
• ¿<L« , 0 '-* a tM ío r a c a it id o * i c t u a l M r t e ? •/
i f ( , i o c t l ¡fia J C r i p t o r _ o u p o s í t i * 3 , 5 »O C '-_ D S * _ G E ’ FV73, i f j r n a t o H < 0> (
C « r r o r ( •SHOCT!.j5S P _3fTFVTS * j ;
♦ n n o :r _ F A iu jp £ j;
>
• - ü t á * i o i -o r t a t o a a e tu a la e o ta a is o a r u & L e í. •/
i ? ( f a r * « 0 i Js F V T jC ^ x p u t S | l, , -tA?VT_«<U_LAJi, J ;
iT iT c ~ * a t5 & AfMT A p t i t s { * \ t AW_ A_ ! _ A#• ] ;
i
) } ) ) ] ) ■ ) . ) ) ) ) ) ) ) ) > > J > )
2 92 Programación en Unux
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
por^orCopen 8«W.«V}¡
•xlt|€XtT_FA!UlMF);
*
/ • 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
AFVT_S:9_lE
« e c o «S T JO ltcK Jo: WNO
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.
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
<
in t W * crtptcr_arcnt*o;
i-tt y n t i c i M i í , ;• u t c i n u o i t i •/
cw d is p o s itiv o !| • •/oeWflíp*;
lf | {d # s e r ip t o r _ i r e f t l v o * a p * fl| a * »U * . 0 _ H 0« * ¡ | < 0) (
per.*cr{*0S*''');
« U t{ a i7 _ -A IL J» £ );
>
itf i o c :.{d * » c p i2 t o r _ iir c p i.i« o , «ftO c rL .o s p .a s rc A P S , i p r e j t a c i c .i e s u < » i (
»
a c ir r ft'P re s ta c io n e s c a l d is p o s itiv o *s:Vn*. d isp o s itiv o } ;
if<C3C5 i O S P _ W _ O U P L » )
p o tS C f u l i au p lei* );
iffe a p s i 5S?_CAr_S£AL::iei
■ c a c o ;:» c04i*»Ci0n » r : i ? n w r e a l ' ) ;
i? ; c a c j i 3S?_CA?_anTCH)
g vts('ttC u er.ta cao s L u c e itta ie n te l o c a l') ;
iíj c a c s -i 8 SPSA ?jK*f!0C 1
j j ) ) ) j- ) . ; t i ) > ) r ) ) i ) > ■>
2 9 6 P ro g ra m a c ió n e n L in u x
i f - c a p s 4 OS?_CAP_MUPt
)
La siguiente salid a m uestra las prestaciones algo lim itadas de mi Sound
B laster de 16 bita:
S ./0 0 'e r .e r _ p r e 3 :» C iC * « i
/P r e s t a c ic n e s d e l d t 3 c o s i u v o d ev/d sp :
S A L ID A Cuenta con g a U ll a d o { í . - i 0 $ e n / ig | do g ra b a ció n y reproducción
P t r n t e a cceso d ir e c t o a l o s b u fío r s do iu hard»ar«
Lo que viene
En este capítulo ol lector h a aprendido la program ación básica do las ta r je
tas de sonido m odiante la API de sonido OSS/Free que se pncuontrn in te g ra
da en ol kerael de Linux. L am entablem ente, la program ación do sonido es
un tom a extenso que merece su propio libro, de modo quo con cote análisis
ap-onas hemos roíado la superficie del mismo. El próximo capítulo. "C rea
ción y utilización do bibliotecas de programación", lv m o strará cómo u tilira r
en ñus program as las bibliotecas do program ación existontos y cómo crear
:ius propias biblioteca-i Dado quo las bibliotecas en general im plem entan las
APIs com entadas en esta p arto dol libro, resu lta esencial com prender a d e
cuadam ente, las técnicas y cuestiones relacionadas con la creación y u tiliza
ción de bibliotecas.
; / / / / # / / / / ' • ' ' * ' . ' ' '
Creación y utilización de
bibliotecas de programación
E ste capitulo tra ta sobro ia creación y utilización de biblioteca* da progra
moción, que :-on colecciones de módulos de código que pueden sor reutiliza-
dos cada vez que resulte necesario en ur. program a Las bibliotecas son un
ejemplo clásico del S anto G n al del desarrollo de softw are: la reutilización de
código. Las m ism as reúnen ru tin as de program ación em pleadas con frecuen
cia y módulos u ü lita ñ e s en una m ism a ubicación.
L as bibliotecas e stá n d a r de C son ejem plos do « u tilizació n de código Las
m ism as contienen cientos de ru tin as frecuentem ente utilizadas, tales como
la función de im presión p r i n t f y la función de ingreso de caracteres g e t -
c h a r , que serian tediosas de rescribir cad a vez que se creara un nuevo pro
gram a M ás allá de ia reutilizacion de código y de la conveniencia del pro
gram ador. sin embargo. las bibliotecas proveen una considerable cantidad
de módulos utilitario s totalm ente depurados y bien probados, tales como ru
tin as p a ra program ación de redes, m anejo de gráficos, m anipulación do d a
tos y llam adas a sistem a.
E ste capitulo cubre ios siguientes tem as:
• Obtención de información de una biblioteca
• M anipulación de bibliotecas
• Creación y empleo de bibliotecas estáticas
• Creación y empieo de bibliotecas com partidas
• L 'úiizacó n de objetos cargados dinám icam ente
Todos los program as de este capitulo pueden s e r encontrados en el sitio Web
n t t o : w.v*r. ~ c p . COffl in fo bajo el n úm ero de ISBN 0789722151.
i i ; ) - ,i / i ) ) )t)
¿00 Programación en Linux
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.
E je m p lo
El ejemplo siguiente u tiliza nm p ara exhibir los símbolos que contiene la bi-
hlioteca / u s r / l i b / l i b d l . a :
EJEMPLO S na / U 3 f / l i O / l £ M l .a head -10
T _dli>cén_s?iecK
ü jjljjp m
U (H orror ruii
SALIDA
NOOíflaa w dlopen
aeowaac t dlopífi_<íoit
d lc lo s e .o :
u _ a l_ c’ cs9
C c D itu lc 1 - : C re a c ió n y u tiliz a c ió n d e b ib lio te c a s de p ro g ra m a c ió n 301
La p rim era colum na producida por e sta salid a inform a la ubicación, <>3ea el
corrim iento relativo offset) en b y tes, expresado en notación hesadecim ai.
respecto de’, origen del miem bro d l o o e n . 0 . de los diversos símbolos que se
en cu en tran listados en la tercera colum na de dicha salida. La segunda co
lum na es u n a ú n ic a letra que in d ica la condición de cada símbolo. U (por un.-
defined) significa que el símbolo listad o no e stá definido en el m iembro, a u n
que puede e sta r definido en otro archivo. U na T (por text) indica que el
correspondiente símbolo ?e e n c u e n tra definido en el á rea de texto (código)
del miembro. W por wriuible) especifica un símbolo que, o bien no será te n i
do en cu en ta si llegara a e sta r p resen te u n símbolo de idéntico nombre en
otro archivo o. s: no se llegase a e n c o n tra r otro de nom bre idéntico, se rá de
tocas m an eras reem plazado por u n 0.
El com ando a r
El comando a r cre3. modifica o ex trae archivos dei archivo comprimido donde
se encuentren almacenados. Su uso m ás común es en la creación de bibliote
cas estáticas, que son archivos que contienen uno o m ás archivos objeto. Laa
bibliotecas estáticas son archivos objeto cuyo código e stá diseñado p ara sor
linkeado a un program a en tiempo de compilación en lugar de serlo dinám ica
m ente en tiempo de ejecución. Las bibliotecas asiáticas constituyen la antítesis
conceptual de laa bibliotecas de linkeado dinámico de Windows (DLL o Dyrm-
míe Linh Librar/). Los archivos objeto que las Constituyen M ddñOtiiiAOA
mtembroo El comando a r tam bién crea y m antiene una tabla quo efectúo uno
referencia cruzada entro los nom bres de los símbolon y los miembrojj en los
cuales aquellos se encuentran definidos. En la parte 'C reación do una bibliote
ca estática ', que se encuentra m ás adelante en este mismo capitulo, se brinda
un ejemplo de uso del comando ar. E l mismo tiene la siguiente sintaxis
tr {■c a s p q r -» -t x> [cccuyw l [ a t w c r o j a r c h i v a _ c c < t p r i m < J o a r c h i v o [ . , . |
a r crea el archivo comprimido de alm acenaje de archivos denominado a r c l u •
v o _ C O * p riaid o a p artir de la lista de archivos que jigüe a archivo. So requie
re ai menos una de las opciones d. ffl, p, q, u. r y x. Normalmente so utiliza r.
La tabla 14.2 descnbe las opciones de a r utilizadas con mayor frecuencia
Tabla 14JL Opoooes del comando ar.____________________________________
Opción_____________ Descripción______________________________________
•c Crea a r c r u v o _ c c < n p rlm id a si «sto r.o existiese •/ suprimo el
mei*.sat« que emitiría a r si aquel no existiera. El arcn.vo serta
creado igualm ente aunque -c no fuera especificado. Lo que s e
Suprwrira e s el correspondente m ensaje.
.3 Crea o actualiza el m apa que relaciona ent/e si los símbolos
con el m em o ro de a r c n i v o _ c o m p r im d o en el cual s e en
cuentran « fin itío s .
•r n se rta un a r c n i v o en a r c h i v o _ c o n p r u n id o y suprime
cualquier m tem ero existente cuyo nomore comcica con ol que
e s tá s»erao agregado. Los nuevos m.-emoros son a raaitío s al
fina: de a r c h í V Q _ c o m p r is id o .
■q Agrega á re n n o s ai ñnai ce a r c h tv o ^ c o m p r im id o sin verificar
s: se decen e f e c t ^ r 'eem piazos.
P ro g ra m a c ió n en L in u x
El c o m a n d o l d d
Aunque flm lista ios símbolos definidos en u n a biblioteca, no resu lta dem a
siado útil a menea que uno sepa qué bibliotecas requiere un program a. P a r a
eso estd ld d . Este comando lista las bibliotecas com partidas que requiere un
program a a fin de poder se r corrido. Su sin tax is es ¡a siguiente:
ló3 (opciones I archivo
ld d imprime los nombres de las bibliotecas compartidas que requiere a rc h iv o .
Dos de ¡aa opaor.es más útiles de ld d son -d, que informa sobre las posibles
fundones fallantes, y -r, que informa tan to aubru las fundones falcantes como
sobre loa objetos que no se encuentran presentes. Las otra? dos opciones que re
conoce ld d íon V. que informa el núm ero de versión de ldd, y -V, que informa
el correspondiente número de versión del linker dinámico, Id . so.
E je m p lo
Ldd informa que el cliente de correo m u tt (que puede o no e sta r instalado en
el sistem a en uso) requiero do c:nco bibliotecas com partidas,
í loa juir/Qin/muct
ÜbMl.JO.t •> /U6/1ÍM91.4M (&X4l)l>!U<J00)
llbjljruj.ía ■ -> mr/llU,'UbsUnQ.ao, t <Dx4^2*0Wi
::2.«.10.6 •> /Ub.'UBn.iJO 6 (tX4M72QMH
UBc.to.fl •» /U 0 /lía c .in .8 (Ox-iWWÍ&Mj
SALIDA
Ua/lo-llnux.íO.? ■> /Ub/ld-Unu*.so.2 (0X4M96MQ)
(el aigno => ea m eram ente un símbolo de indicación y no mi operador) T ín
gase en cuenta que la salida de ld d puede 3er diferente en el sistem a del
lector. La salida indica las bibliotecas que el archivo binario m u tt requiere
para ser corrido. La prim era columna m u estra el nombre de lu biblioteca,
que a m enudo ea un vínculo simbólico a la ru ta de acceso completa a .a bi
bíioteca que e stá listada on la .segunda columna.
El c o m a n d o l d c o n f i g
E l comando l d c o n f i g , cuya sintaxis es la siguiente:
loccfl^ic !-:pcicnas; ;Bibliotecas]
determ ina los vínculos en tiempo de ejecución que requieren los program as
a bibliotecas com partidas que se hallan ubicados en / u s r / l i b y / l i o y que
son especificadas en bibliotecas en la línea de comandos, y alm acenadas en
/ e t e / I d . s o . c o n f. O pera ju n tam en te con I d . s o , el linker/cargador d in á
mico. p ara poder cre a r y m an ten er vínculos hacia las versiones m ás corrien
tes que se en cuentren disponibles en el sistem a de bibliotecas com partidas.
La fu n d ó n de I d . so es com pletar el linkeo ñnal en tre loa program as que
utilizan funciones presentes er. bibliotecas com partidas y los archivos com
partidos de biblioteca que definen esa3 funciones.
U n comando l d c o n f i g sin ningún argum ento sim plem ente actualiza el a r
chivo de caché, / e t c / l a . s e . c a c h e . El argum ento o p c io n e s controla el
com portam iento de l d c o n f ig . La opción -p le indica a l d c o n f i g que liste
todas ias bibliotecas com partidas que I d . s o h a alm acenado en su caché, sin
modificar n ad a. La opdón - v in stru y e a l d c o n f i g p ara que actualice el ca
ché de Id . so v que al mismo tiempo liste la s bibliotecas encontradas. Si -ano
C a p ítu lo C re a c ió n y u tiliz a c ió n d e b ib lio te c a s de p ro g ra m a c ió n 303
N O T A
Ccmo « o xee ve?. 3 xj^r-rts^acón ae aíofcxeeos ccmcs^iaas puede resultar compleja
y co:'. ye s generar confusión. Un prcgrarrV) utllij» una función 09finida «n bibliotecas
aomos.'icas s a « socamente d nomore de 'a tuncón. sue a greñudo se tíercciina cíiIjo
ísafc;.. E yog.'3 m 3 re saOo córrc asta dertrea a funoio o cómo acceder 3 su esWao *n
ugrroo de «?ecjc3>n. U ‘ vea de I d . se consisto on CO'KCI» «I esóo <¡\ norríire de la fun
dón ü zbz ¿ 0 cwe efect?v.srner-?e mrcter’orta la nrsme ¡que reside «n una bitwcwca conv
sarwa). £ -netoc» o-j- irelua i d . so rara l o e s t o se encuentra mucho n-45 allá de1 , a*-
arce ce esta C o ro nmttanvxct ce aoiic aciones. todo lo que 10 ccott Of«OCWW al
'ector« .-toar a v , precrame im o>oiiGítca3 que «jrnrejwndar, Pwtíe dar por asumido
-sTein (XOr^mervte <xe L-ux se hoco cargo do los Cctafiei comoie-os do la tarea.
V a ria b le s d e e n to rn o y a r c h iv o s d e c o n f ig u ra c ió n
El linker/cargador dinám ico ld.so em plea doa variables do entorno p a ra p e r
sonalizar su com portam iento. La p rim era do ellas es SLO_LIBRARY_PATH,
u n a lista de los directorios, separados e n tre ai por signos do dos puntos (:>,
donde buscará i d . s o bibliotecas co m p artid as en tiumpo de ejecución, nde-
m ás de hacerlo en los directorios p red eterm in ad o s / l i b y / u s r / Í 2.b. La se
gunda variable. $LD_PRELOAD. es una liiita sepurada por espacios en blanco
de bibliotecas com partidos adicionales, especificadas por ni usuario, que de
berán 1 e r carg ad as an tes que tocüis hut d em ás bibliotecas. E sta variable de
entorno se etaplea do m anera selectiva paro anteponerse a funciones quo
pudiesen e sta r definidas por o tras bibliotecas compartidas.
I d . se tam bién se vale de dos archivos de configuración cuyos propósitos em u
lan los de las variables de entorno que acabamos de mendunur. / e t c / i d . s o -
. c o n f contiene una lista de directorios e n los cuales el linkor/corgador deberá
buscar ios bibliotecas compartidas que requiere el programa. Ello como agrega
do a les directorios estándar, i u s r / l i b y i i b , que li s o siempre recorre.
etc.- i d . s o . p r e l o a d es una versión basada en disco da la variable de entorno
SLD_PRELQAD: contiene una lista sep arad a por espacios en blanco de las biblio
tecas com paradas que deberán ser cargadas antes de !a ejecución del programa.
Bibliotecas estáticas
Las bibliotecas estáticas (y tam bién las bibliotecas compartidas, p ara el ca
so- ;on colecciones de uno o m as archivos objeto que* contienen código pre-
compilado reunlizable. C ada uno de los archivos objetos que la in teg ran se
denom ina tam b ién m ódulo o m iembro. L as bibliotecas estan cas son alm ace
nadas en u n formato especial ju n to a u n a ta b la o rruipa que vincula los nom
bres de los símbolos a ios m iem bro- en ios cuales éstos se en cu en tran defini
dos. Dicho m apa perm ite acelerar ios procesos de compilación y linkec. Las
bibliotecas está tic a s g eneralm ente tie n e n u n nom bre que term in a en una ex
tensión . 2 .por archivo de alm acenam iento de módulos). Recordemos que
los módulos presentes en las bibliotecas e sta n c a s son ünkeados a un progra
m a cuando éste es compilado, m ien rrss que sus co n trap artes presentes en
; ) ) i ) ) )
304 P ro g ra m a c ió n e n U n u x
NOTA
O je n e s hayan leído Advancaú Pngrammtng in UNIX enviroament se Richard
Stevens •■‘conccoran M íos tíos programas. Yo '■os ho utilizado durante muchos años
porque cubren pe/fcctamartte mi necesidad de una biblioteca de yJn'nistractfn do ".To
ros sencilla y funciona!. Quedo roconocído a la generosidad dol Sf. Stovon3 al r-iooimn
permitido reproducir estos creáramos aquí.
Asimismo tío precu-o mucha tristeza el enterarme de su fallecimiento a comienzos do
sepCerrDí» de 1999. Richard Síovonn fue un oxcelonto programador y un tOtVBSBtientC
ex;ositor de lo» dotalles de in programación en UNIX y TCP/IP. Sus aportes a a claridad
do oxposción de los dotallo» de ios APfi» tonto de UNIX como do TCP/IP va.- a ser dolo-
rosamente extrañados.
E je m p lo
El prim er !¡atado que vieno a continuación, l í b e r r . h, «1 archivo de enca-
_______ bezado do una sencilla biblioteca de manejo de errores, m ientras que el se-
c k m p io inundo listado, que viene inm ediatam ente desp u ta dol prim ero, es la imple-
mentación do la interfaz definida en el archivo de encabezado. Podría resu ltar
útil em itir previamente alguno» comentarios acerca del código. El archivo de
encabezado incluyo < s t d a r y . I»> debido a que se utilizará la utilidad do
ANSI C para funciones con número variable do argum entos Ist no se encuen
tra familiarizado con las funciones con núm ero variable de argum entos, con
sulte algún texto o manual de referencia sobre C). E ste número variable de
irgum entos se indica en los funciones m ediante puntos suspensivos (. . .).
Para protegerse contra m últiples inclusiones del encabezado, el mismo viene
inserto en un macro vacío de prcprocesador, LIBERR_H_
Esca biblioteca no debería ser em pleada en la construcción de daemons por
que ia m ism a escribe a s t o e r r . Los daem ons generalm ente no cuentan con
una term inal de control, de modo que no pueden efectuar salida a s i d e r r
(ver capitulo 9, “Daemons*, p ara o btener m ás información sobre la construc
ción de estos programas).
>• son ora d« a sta a rcn iv a de cncanazaco c-n C r ía m e * : l í b e r r . t i •/
r
* &LDLiatec3jr''oros.n
• O íd a r a c i c r a s C3.-3 una s e n c i i ’ a b ib lio t e c a 58 nan ejo de a rre .-e s
i I I I ) ) ) J .1 I J . ) ) ) I ) ) )
V
* r ," r
« e fin * L IS S » .* .
•i-Tciuc-e < r : a - : '>
Msfins «AX_.0«_r=XT0 4056
/*
• in p riJ í.- jr. ríí-.j^ j» U «-p o r j J t d « r - y r t ? « m a r j cu ie.i a fa c tu o l a líaseos
•r
r a id * 9 t ? —a r _ í :_ ? * r 5 r j i j r s t ch.ar ‘ p < .n *ero _ *a B la C íH iesb ro s, . .
I'
• IflO í-ia lr «n = * r . ¡ ¿ J ; c« « r r q r a í t : « r r y s a l i r
*i
v c w i a l i r _ s ‘. _ * r r c r ( c c < v « t f u r •¡x jn u M ja o ia S flM te B O r o * , . . . I ,
/•
• A ss-ta r 3 9 - iíje ? r - o r «n a rcftivo - e c u t r a _ e r r o r 9 i y r e t o r n a r a quien
«^ *ctu c U lla * W a
*/
• O lí iS « rttír_ y _ r* to r*a p < C '* a r • A r í h í v c í . f l g i í t r e e p p o m ,
ca n sí- e r a r •p u .i:e ro - T iü i* D e « t* « & r a i. . . . ) ;
/*
• l»oriMir »n i < * s a t t *« « r r o r y - « t e r n a r a <}oi«n ifactuc la lla n ad a
v
vo:S y s o r m r t -'^ r (c c P í- criar 'puntero *a01a0««n»tarc5, v*_U st punto^ar-junim os,
era-* "•*fcnivofi«q:»:rcÉrro<‘« a j: ”
t^r/U1 t:8£CT_H_
»fr-OLf /* L:5ésS_M_ •/
F IN D E A R C H I V O D E E N C A B E Z A D O Y
C O M IE N Z O D E A R C H IV O D E P R O G R A M A
/• ítófltr» d#i ;p o í* im » r I n te r r .a t: l i 3 « r r . c •/
/•
• S i a L ia t « la j ^ .-o r * i .e - In p la m n ta e io r ce la o i b li o t e c a da .toúulos d» « n o jo do
•r-« -* s
•/
# ift c l* í« < « r r .- e . v P ara la d e fin ic ió n o# tr r n o •/
liflc lu a # < s t « r g . n > • ? a r a l a s c e c U r a c io r .e s oe fu n c io n e s ¡jue
acactxn
lis :a s v a r u e ü s « arsu a e n tca •,
<stcii3.n>
*ir.;lvc» <st3io.r>
*i.-íi.3 5 'c ’ 2.'ot?:3_3'*:'-55.n* '• >luastro propio archivo Jo encabezado '<
.-sis -5 to rr.a ."_ s¿ _ srro --'c o n s t c n a r •cu r.-3 ro _ 'at?la í)8 M iriD ro s, . .)
306 Programación en Unux
v a _ l m fMnt«r(3_3rgumsntos; /•
<
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»|;
(
v a . l i i t puflt«ro_arguBBntos;
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$;
(
10* •y-iroir_*rr3T:
ttM M M T -a to r r a •_ » !_ = .--o r
U a tit
•j fcioss
; / > ) ) ' I > > t f ' f ]
3 08 Programación en Unux
U " lush
U *aper,
U fpiits
0e?3fl08® t 9 c c 2 _ c o r o ii« : .
JW<3C3"3 T 2 s e n t.* r_ y _ 5 a la r
N a e w S ’í r 3 S 9 n ta r _ y _ re r o rr jr
U 3 p n n :f
J 3tfiflrr
U 3t<J0Ut
U s trca t
. U stre rro r
U 3 t r l« n
•J vscrintí
El segundo comando croa b i b l i o t e c a _ e r r o r e s . a a partir del archivo objeto
creado por el compilador. El tercer comando, nm b i b l í o t e c a _ e r r o r e s . a. lis
ta los miembros del archivo que aloja los módulos de la biblioteca seguido por
las tunaone3 que contiene la misma. Como se puede apreciar a p artir de la sa
lida de nm , el archivo que nloja la biblioteca contieno las funciones definida*, en
ol archivo objeto b ib L ío t e c a _ e r r o r 8 S . o. Las misma» vnn precedidas en el
liatadó por una 7.
E m p le o d e u n a b ib lio te c a e s t á t ic a
A hora quo ha nido croada la biblioteca, se necesita un program a para poder
controlarla. El progrnm a de prueba forma p a ite del próximo ejemplo In sis
timos, pora utilizar la biblioteca, incluya el archivo correspondiente archivo
de encabezado on su código fuente, utilice gee con su opción 1 p ara vincular
la biblioteca al código fuente, y luego em plee la opción • L p ara ayudar a g ee
a encontrar el archivo de biblioteca.
E je m p lo
El siguiente program a, c o m p ro b a r j n b l í o t e c a , in te n ta a b rir un archivo
inexistente cuatro veces, una vez por cada una do las funciones de procesa
ejfMPLO miento de erro res presentes en la biblioteca.
y Sonbra archivo *n Internet: e rrtest.c
r
• c c a a '- o b a r . o ib lio t íc a . o - ? r o g r .in a da c o n p r c o a c ic n d e La b i b l i o t e c a a# na r.e to
Sé «erares
•t
¿inc'.üie <stsio.n>
« L i c l j a e < 5 :d i:b .n >
«induce •Libere.n•
*C5!‘u’.fl SALTHAfl_SAi.Ifl.Sl_SRtt>R I
♦CJf^e <€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;
Itf s a if SALT5M_ASéMTAfl_Y_$ALtfl
f5utí('Co«cr3M n.:o a j« n t ir _ y _ s a lt r ...\ n ', stdoot);
lf{(0 w n «ro _a rcfllv0 • fapenCfoo', • - ) ) •* MULLI
* » « c :* r _ y _ r * :0 rr * ,-r c e fl0 M 0 ;ir jn a iiC W c a .lc g \ V #\ \ i? .o n u r _ y _ 3 a Íir ,
•no púas a e n r feo. ho m * t # oicno arcntvo o d t rt c ta r io .’ ) :
#*acif /• •J»_¡XIIT_SXI¡> V
•*i:»£x:r_$ycc<ss);
I
Luego de com pilar y correr c a m p r o b a r _ b id L i3 te c a »e obtiene la sig u ien te
salida:
i 0:c a cc«cr50jr_DifiLi3C4ca.c -o coaproesr_d:blioteca -L . -le r r
i ..'eoeprcear_oi3i¿ct«ca
t^BprizircG rato rrar_ii_erro r
'* * .o rra r_ s i_ «rrc r nc certa a e r ir i'oo. *(o « x i j t e atino irc n iv a o d i r o c w r lo .
Ccaorcoa.-VM '«:c#Tjrj_3safl:ir . . .
J cat cwcrc&ar_bibl:.=tsc3.l0C
jier.Tar_y_r5torr.ar no ccCfl io r t r roo. No exista dicto arenívo o c ira c to n a .
Bibliotecas compartidas
Las bibliotecas com partidas tienen v arias ventajas por sobre las bibliotecas
estáticas. Prim ero, utilizan m enor cantidad de recursos del sistem a. U tili
zan m enos espacio en disco porque el código de las bibliotecas com partidas
no debe ser compilado con cada archivo objeto sino que se lo lin k ea y carga
dinám icam ente en tiempo do ejecución desde u n a única ubicación. E stas bi*
biiotecas em plean m enor cantidad de m em oria de sistem a porque el kem el
distribuye la memoria que ocupa la biblioteca e n tre todos los program as que
hacen uso de ln m ism a en un momento dado.
O tra ventaja de las bibliotecas com partidas os quo son ligeram ente más rá
pidas porque deben se r cargadas o la m em oria sólo una voz Finalm ente, las
bibliotecas com partidas sim plifican el código y el m antenim iento del siste
ma. A m edida que se van corrigiendo orrorc¡> o agregando prestaciones. los
usuarios lo único que tienen que hacer es procurarse una versión actualiza
da de la bibhotoca e in stalarla en su s sistem as. Con las bibliotecas estáticas,
cada program a que huga mío de la biblioteca debí’ ier recopilado,
Como ya fuu :iu«'.aludo, ul linkor/cargador dinám ico. I d . s o , vincula los nom
bres do los símbolos en tiempo de compilación n la biblioteca com partida en
dunde lo« rainmoa e«tén definidos. Las bibliotecas com partidas tienen un
nom bre especial, sonam e, derivado de la extensión .no (shareablt object u
objgto comparCihia) do »u¡i archivo» (nam<? significa nombre), cue consiste
del nombro di; la biblioteca y ul número principal de nu versión. E! nombro
completo do la biblioteca de C en unu de mis sistem as, por ejemplo, es
liÜ C . s o . 5 .4 .4 6 El nombro de la biblioteca es libc.so; el num ero principal
de la versión es 5; el núm ero secundario os 4 ; y 46 es el nivel de su edición o
parche. De mudo que el sonam e de (v>a biblioteca de C es l i b e . s o . 5.
El sonam e de la nueva biblioteca de C, l i b c 6 , es 1 i b c . s o . 6; el cambio do
dígito principal de la versión indica una modificación de la biblioteca, ol g ra
do de quo la m ism a y la an terio r resultan (¡muy!) incom patibles. Los núm e
ros secúndanos de la versión y los núm eros del nivel de parche v an a p are
ciendo a m edida que se van corrigiendo los errores, pero el sonante
perm anece invariable, lo que significa que las nuevas versiones son esencial
m ente com patibles con las versiones anteriores.
R esulta im p o rtan te ten e r en cuenta el sonam e de u n a biblioteca porque los
aplicaciones se vinculan co ntra el soname. ¿Cómo funciona eso? La utilidad
ldconfig crea un vinculo simbólico desde la biblioteca efectiva, digamos
l i b e . s o . 5 .4 .4 6 , hacia el soname, liO C . s o . 5. y alm acena dicha inform a
ción en / e t c / I d . s o . c a c h e . Er. tiempo de ejecución. Id .S O recorre el a r
chivo de cachó, en cu en tra el sonam e requerido y, debido a la presencia del
vínculo simbólico, carga a la mem oria la biblioteca que efectivam ente corres
ponde y linkea las llam adas a funciones de la aplicación a los símbolos a d e
cuados en la biblioteca situ a d a en la memoria.
Las sucesivas versiones de una m ism a biblioteca se vuelven incom patibles
en las siguientes condiciones:
Capftu‘3 1 - : Creación y utilización de bibliotecas de programación 311
CALIDA Tal como so lo señaló anteriorm ente, la variable de entorno SLD LIBRARY -
PATH añade la<s) rutáis) do acceso quo contieno a loo directorios de bibliote
cas confiables / i i b y / u s r / l i b . ld.no buscará prim ero en la ru ta especifi
cada en dicha variable do entorno y le b rin d ará lu seguridad de encontrar su
biblioteca. U na altern ativ a a om pleur osa complicada línea de comandos os
añadir ia ru ta de nú biblioteca a / e t c / i d . s o . c o n f y actu alizar ol caché
. / e t c / id .so .c a c h e )c o rrie n d o < c o m o u au ario ro o t) l d c o n í i g
Aun otra altern ativ a consiste en m e ta la r su biblioteca como biblioteca de
sistema. P ara efectuarlo, conviértase en uauario rcot, coloque la biblioteca
on / u s r / l i b y corra ld c o n i1Lg a fin do actu a lizar ol archivo de caché. La
ventaja de esto último método es quo p a ra añ ad ir la ru ta de acceso a dicha
biblioteca uno no tiene que u tilizar la opción -L de gcc.
iccf-zaxr 0>M
Como :e puedo ap reciar en U figura L4-1, cada voz que 8e añudo otra biblio
teca a un program a, au m en tan el tam añ o y ln complejidad del mismo. El ta
maño crece enpecialmcnte rápido cuando se lo vincula con bibliotecas e s tá ti
cas, rep resen tad as en la figura por l i b e . a y 1 1 b d . a.
La interfaz d i perm ite un enfoque diferente: uno diseña una interfaz g en éri
ca, de formato neutro, p ara lectu ra. escritu ra y m anipulación de archivos p 1
ficos de cualquier formato. P a ra a ñ a d ir a su aplicación un form ato gráfico
nuevo o modificado, uno sim plem ente redacta un nuevo módulo quo ad m in is
tre el nuevo formato y ad vierta de su e x isten d a a la aplicación, tal vez modi
ficando un archivo de configurarión colocando el nuevo módulo en un directo-
no predefinido (los añadidos (p/u£-i/j.s| que increm entan las prestaciones del
navegador de Web N etscape em plean una v arian te de este enfoque).
P ara extender laa prestaciones de su aplicación, los usuarios deben procu
rarse u n nuevo módulo editando u n archivo de configuración o copiando el
módulo a u n directorio preestablecido. La recom püación se hace innecesaria
El código existente en su aplicación carga los nuevos módulos y, oh sorpresa,
uno puede com enzar a im portar y ex p o rtar un nuevo formato gráfico. E 3 te
enfoque se m u estra en la figura 14-2.
C ada vez que se necesite o btener código de una biblioteca diferente, sim p le
m ente em pleará la interfaz di a fin de carg ar la función que se requiero, lo
que se ilu stra en la figura por las ¿lechas que a p u n ta n desde ia aplicación
hacia 1zs diversas bibliotecas. Los requerim ientos globales de recursos por
! ) ) ) ) ) ) > ) ) ) ) ) > ) ) ) ) ) ) ) )
*/
*;1Cll;d3 <SWi0.h>
=irclude <$:diic.n>
nrclu d e <dlfci i>
iot cain(void)
C
void -nar.cíls;
vot<3 ( 'r u t i n a j 'o a u a r i d a ) ( I ; r Pun tero a U r u tin a cardada a 38 " i ; t i l i i 3 0 3 •/
c o n st e r a r * n ifi5 a je _ 3 r r c r ;
F I l £ •p u n t« ro _ arc í:lv o ;
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
1 6 . M e m o r ia c o m p a r t id a
1 7 . S e m á f o ro s y c o la s d e m e n s a je s
1 8 . P r o g r a m a c ió n d e T C P / I P y s o c k e t s
) ) ) ) ) i ) ) ) ) ) ) ). ) ) J ) ) )
15
Pipes y FIFOs
Este es ei prim ero de cuatro capítulos que cu b rirán los diversos m étodos em
picados por Linux p ara p erm itir la comunicación e n tre procesos, tam bién
denom inada IPC InUrprocess C om m unicatiqn). IPC es una sigla genérica
que se reñ ere a los métodos que u tilizan los proceso3 p ara comunicnrso on-
rre sí Sin una IPC. loa procesos podrían intercam biar, sólu intercam biar, d a
tos u o tra información e n tre ellos ú n icam en te por medio del íilesystem o -e n
ei caso de procesos que tu v ieran un ancestro común (tal como ocurre con la
relación padre/hijo después de un f o rk :— por medio de cualquier posible
deacr.ptor de archivo heredado E$t*? capítulo tr a ta sobre pipes y FIFO s, la?
formas md3 a n tig u as de tPC con la quo cu en tan UNIX y los sistem as o p era
tivo® derivados del mismo.
E ste capitulo cubre lo» siguientes tam as
• Pipes sin nombre
• A pertura y cierre de pipes sin nombro
• L ectura y escritura en pipos s in nombro
• U tilización de p e p e n y p e l ó s e
• Q ué son los FIFOs
• C reador., ap e rtu ra y cierre do FIFOs
• Lectura y e se n tu ra de FIFOs
Tbcoa los program as de este capitulo pueden ser encontrados en el sitio Web
h t t p : i A W .a c p . e o s ¿ n f o bajo e l núm ero de ISBN 0789722151.
P ro g ra m a c ió n en L in u x
Pipes
Los pipes (conductos) sim plem ente conectan la salid a de u n proceso con la
en trad a de otro. Lo mismo que su contraparte fisica, un pipe de Linux es
(habitualm ente} unidireccional o semi dúplex; los datos fluyen sólo en una
dirección E ste capitulo analiza des clases de pipes, los pipes sin nom bre y
con nombre, respectivam ente. Los pipen con nom bre se denom inan habitual-
m ente FIFOs (F irst In First Out, ;o que e n tra primero sale primero), con el
mismo significado que en la práctica comercial. Los pipes yin nombre care
cen del mismo porque nunca necesitan una ru ta de acceso, y por lo tan to
nunca existen en el filesystem. Hablando con precinirin, todo lo que son con
siste en dos descriptores de archivo asociados con un inodo en mem oria El
últim o proceso que cierra uno de estos descriptores de archivo hace que el
inode, y por lo tonto ni pipe, desaparezcan, Los pipes con nombro, por el con
trario, cuentan con u n a ru ta de acceso y existen en ol filesystem. Son deno
m inados porque loa datos se leen de los mism os en el mismo orden en
que han sido escritos, do modo que ol prim er dato que e n tra a un FIFO e3
tam bién el prim er dato que sale del mismo. La figura 15-1 ilu stra las dife
rencias y sim ilitudes entre pipes :iin nom bre y FIFOs.
P&OCESS i ; PIP6’F:FO
♦ :
NOTA
lo s R F O » *• am ar, so r m ctfo <u¡' « fundó** rck? t f o
La m ayoría de los usuario» de Linux se h allan fam iliarizados con los pipes
sin nombre, aunque ta l v « no ae lloguen a d a r cuenta. Cada comando cuya
sintaxis sea sim ilar a 1a siguiente em plea pipes sin nombre:
* C tt Í * tc /p « $ w r3 ; cut f t -3 : ¡ i O r :
En este ejemplo, la jalid a del comando c a t so convierte en la e n tra d a del co
mando Cut. cuya salid a a .su vez se convierte cu e n tra d a para s o r t . Tal co
mo es sabido, el carácter ¡ es el símbolo de! pipe. Lo que tal vez el iector no
se haya dado cuenta es quo su interfaz probablem ente im plem ento | u tili
zando la función p ip e que conocerá enseguida. De todos modos, resu lta cla
ro que nunca hay un archivo real en disco asociado con | .
P R E C A U C IÓ N
bn consejo ai aaso soora lemuncfog^: A mer-os Que se ceou dejar üien en «aro ia aire-
• re s . ?¡oe e* es:¿ cae¿t¡Jo se refiere só-o a to-s o-ce* ü n nonxxe, y F1FO se aplica únl-
cam era a os p oes cc'i '•ornare. ranto ¡es aioes como los FIFOs. sin amoargo. son se-
m duoír*: ■: sea. •es ístes fíuyen silo en una arecaón. :o mismo que el agua en una
co^-r'.j aesagúe. ranto es aces ccmc fes ^lFOs son non_3eekaüle, es decir, no
i©r sescepticies ce sa' marimrfadcs internamente: es tieci/, uno no pueae ur.iaar ‘un-
cc^-es laies cohxj .<<ek para 'iC<ar carca o sesee un puntara ce archivo.
Los pipes sin nombre tienen dos lim itaciones Prim ero, tai como se observó,
son sólo sem : dúplex, por !o que ios d ato s pueden recorrerlos en u n a sula d i
rección a !a vez. Segundo, y m ás im p o rtan te, los pipes pueden ser utilizados
únicam ente en tra procesos relacionados e n tre sí, aquellos que tienen un a n
cestro común. Tal como el lector reco rd ará del capítulo 4. “Procc-sos", los pro
cesos hijo creados m ediante un f o r k o u n e x e c h ered an los descriptores de
archivos p resen tes en su proceso padre.
La figura 15-2 m u e stra cómo ¿luyen ios datos por u n pipe.
) ,
d24
} > ) 2
hfogramactón en Unux
j . y . ) j ) ) ) ) ) ) y ) ) > } *
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.
\ «/ E je m p lo -■*
1/ E l siguiente ejemplo abre y cierra u n pipe:
• v^ac-j c ro g ru a =- Interna? ptíopn.c V
E JE M P LO
r
* tó fir_ o ic a .c y =i€r,-3 ^ o¿g<
•/
tircluOe <oristd.rs>
íincluce <st2 ic.ft>
ím c iirie < s ttl¿ 0 .&*
int M in | « i¡}>
(
in t «rr# gIa_4*scrlptor*a{2l:
¿?((p£p*Urr*flio_<S«»C'‘iO?orM)) < 3) {
parfor(*plpa*)¡
íil*(EX:r_FA¡L!Jft£);
>
C ’.o» « a ic n e to ra a jon va, « p r a g lo ^ a íc ríp to r a a l» ! ,
arr«gIo_e«ac'> ptore)( 1 1 );
c io jt( * r r e g io _ a a * c r io tc r « i[ t|) ;
:io j« (» rfa g lo _ d a * c p ip to ra « n ||;
W«(OtlT_SUCCeSS>;
>
La salid a de este program a m u e stra que Ir» llam ad a a p ip e tuvo éxito íios
valorea de los descriptores pueden s er d iferentes en su sistem a) El p rogra
m a ilam a a la fu n d ó n pipe, tran sfirién d o le el arreglo de descriptores do a r
chivo a r r e g i o j S e s c n p t o r s s Si la llam ad a a p ip e tiene éxito, el p rogra
m a im prim e los valores en teres de loa descriptores de archivo, cierra amboa
y term ina.
S .li tr ir j u s e
-3* ««C flflto m mí» J, 8
L e c tu ra y e s c r itu r a d e p ip e s
S A C IO *
P ara leer y escribir pipes, sim plem ente utilice las llam adas re a d y w r i t e .
R ecuerde, read lee desde e! extrem o del pipe cuyo descriptor es a r r e g l o -
_ a e s c r i p t o r e s [ 0 ] y « r i t e escribe al extrem o cuyo descriptor es
a r r e g i o _ a e s c r i p t o r e s { 1]
✓ Para «te n e r un r.Spido recoccatoóc ce ¡as la/nacas a sistema read y «v rite , reférase a
ta 3 * Lectura y escritura ce a rü v .cs \ ofig^a l-i2 .
326 Programación en Unux
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.
que el proceso padre será ei que escriba y su hijo el que lea La m itad inferior
de la figura ilu stra el estado de los descriptores de archivo después que el
p rx e s o p ad re cierra el descriptor que conespor.de al extremo de lectura del
p;pe y su hijo cierra el correspondiente descriptor del extremo de escritura.
P R E C A U C IÓ N
Despees oua naya id o o**rado el e»tre^o ae escritura ae un piM. cuatouier intento de
-ce' Ce ese ooe retomara 3 tara :-d¿car •? fin del ar;hr<o. Sin enoergo. s¡ es el exVe-
- c 3» « o x a e m "a s*5o serpeo. cuaicver intento <3o esenoir al oipe £<?norard la
se^aí so/a d proceso que :o ¡nters# nacer, y la oropta Harraca a w r i t e retor
nara - 1 y estaofecerft a .afla&a í^50a> armo a E Pí PE. & el proceso que asta escri-
o-w-do no ntiKcatKa o írc*a a SXG*»!f»c. el onsceso de escritura terminar.1».
✓ *>V3 soasar soore <a maneja da .marcaotar o pasar por alto las láñalas, ver •IntnrcooctAn
de sertas*, pig ^a 102.
E je m p lo
El siguiente program a. a b r :r p x p e _ n « . m u estra el procedimiento correcto
de ap e rtu ra de un pipe entre procesos relacionados.
/• waec.-t 04i ofoorwrj en Internet: pspen» •/
/*
• i*ur_pip« c - ¡.a tañer» correcta de « D r ir un pspe
• y »% * rd ra r Pra<«»o lu jo . S tn ta m : u » a r jn e « ionore de arcnivo
*/
• i v i j í i «wuita.n*
llo c lu M *aroio.n»
•mciude «s te lio .n »
•laclóse cfcnt’.h»
•ir-cU-íe <Uattí.n>
•ce^vne TAjuÑQ_ayf
C
ipz irr«g:o _d*«cri3tcresl<|, /• Arreglo oe descriptores de
arenivo asrs ei- 3ipe •/
ín t dascriptOfArcAlvcOsras; • Descriptor oel archiva que sw iinistra los
catcs c.-e 253ea •/
/• t'a r.s a irir por e i pise ei
5-ocsío 553.-e i »u m jo |el ••
• arcriva cue va cono argumento
ee l* lift*a ce ejaarvsosi *
dar
i n r 3 1 3 , syres_ieicos;
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 );
NOTA
S vino* proceso» « t a n eac'.e.erYjo al mismo o-pe. cada llanada o vnte doho oscfibtr
menos d« ?IPS_6UF bytes, que es un macro «fin id o en <1 On tío osoKurar
5 9 * f ic w « 3e «sc/ir-í* (jo* sear atómtaw; o* deor. q^«a os datos «ocntos pee un
proceso r%o M entremedien con 0 1 ««to s oe otro proceso Para hacer do esto una re-
¿ia. esenrurw Y.&rncn. limite .a cerccod de datos asentas en cada llamada
• Arr.e a meros ¡jue ?!P£_BUF oytea.
U n a m a n e ra m á 9 s im p le
El program a u s a r _ p ip e tuvo que realizar mucho trabajo tan solo para lograr
replicar ia acción del comando C at sobro un archivo: debió crear un pipe, efec
tu a r u n f o r k , c errar descriptores innecesarios canto en el proceso padre como
en su hijo, abrir un archivo de datoa, escribir y leer dei pipe, c errar loa arch i
vos y descriptores abiertos y luego o btener la condición de salida del proceso
hijo E sta secuencia de acciones es ta n común que el ANSI/ISO C las incluyó
en dos funciones de biblioteca estándar, popen y pe lo s e , cuyo prototipo en
< s t d i o . n> es el siguiente:
flL£ •5C0*rf:«njt cnar *caw>nd, corst era r ‘nacen
L-n pelóse(FXl€ * $ trt» );
popen crea un pipe y luego u tiliza u n f o r k p ara g en erar un proceso hijo, se
guido por un e x e c que llama a O in / s n • c p ara que el mismo ejecute la ca-
330 Programación en Linux
d en a presente en la linea de comandos tran sfe rid a al argum ento comm and.
El argum ento mace puede 3«r r o w, que tienen la m ism a sem ántica que la
que poseen en la biblioteca e stán d ar de E/S. E s decir, 3i mode es r. se proce
de a ab rir p ara lectura la secuencia de caracteres {scream) señ alad a por el
puntero de tipo FILE que reto rn a popen (o sea, ei pipe: no olvidemos que la
función fopenO de C reto m a ur. puntero de tipo FILE y no un descriptor de
archivo, tal como lo hace su respectiva co n trap arte, la llam ada a sistem a
o pen ( ) de Linux). !o que significa que dicha secutmcia queda agregada a la
salida e stán d a r de command, tal como si se redirigiera la m ism a desdo la li
nea de comandos; leer do dicha secuencia es lo mismo que leer la salida e s
tá n d a r de coinmand. De m anera sim ilar, si modo ea w, la correspondiente se
cuencia de caracteres queda agregada a la e n tra d a e stán d ar de command, de
modo quo escribir a esa secuencia de caracteres (nuevam ente el pipe) equi
vale a escribir a la e n tra d a e stá n d a r do command. Si ln Llamada a popen
fracasa, la mism a reto m a NULL. I-a condición de error quo ocasionó lu fallo
de la llam ada es entonces a sen tad a en la variable de erro r e r r n o .
P a ra cerrar la secuencia do caracteres ae dobc utilizar p e ló s e en lugar de
la función e stán d a r de C f c ió s e . La (unción p e lo s o cierra la secuencia de
caracteres de E/S. ag u ard a a que se completo command y reto m a su corres
pondiente condición de salid a al proceso que la llamó. Si la llam ada a pelóse
fracasa, la mism a retorna • 1,
>i / E je m p lo
] ,'B f El siguiente program a es una versión a ltern ativ a fie u s a r _ p ip e que utiliza
popen >• p e ló s e :
ei l Mf LO . NOKOrt aei prograna <tn Internet: nw r#.C •/
/•
• nuevojJ3ar_pipo.c l.a nanera corrttCta ae a b rir un pipe y engendrar
• Ln prccoic l i j o Sintaxis: nuevo_uaar_pipo r.Mitre ce arcnivo
’l
« n e l u d e < o < u a ta.n >
* in c lu a e < s td io .f i>
f in c l u d e < 5 ta ;iB .n >
<inclusa <fcatl.it>
*uicluo« n m t s . r »
¿ « a fin e r w w s o j ü F p i p e _guf
m t sain(void)
(
PILE *p u n te rs _ 5 rc n iv c ; s tr e a » se t ip o F l i £ p a n
cooer •/
ccar *caaen=_Li,iea_coí;inaos - "cat at>rirj>ipa.c*¡
char oufíTAMA.ÍO.S'jF); /* 9uffer para *entrao«* oe patos \
/* Creación e sl oip« V
i ñ (puntero_arcr.lvc = j»cín (cad en3 _l¿iw a_c«iand os. •.— ) ) = W U)
íaiir_si_errorj*30ceíi*);
Caoitulo 15: Pipes y FIFOs 331
* iilt{ (f g « ts f f e if t puntaro_.arcni.vc j) := v a lí
srwtfí*H$:, ocfj;
• y 5 C t e - í - - i c v a z i c n oe s a i l f l a • /
0Cl0»*(Dvr:«rc_aixMYo);
e*lt{El¡-.5WX€SS:;
#o:C S*lir_*t_«rrcr(cftar
(
ptrr«r<*c>'ui«>;
•slt{G ttT _ftU U *£);
)
Como se puede observar en el listado. p o p e n y p e ló s e logran que irubajur
con pipe? req u iera mucho menos código La contrapartida e i tenor que r»1-
nu n ciar a cierta capacidad de control. P o r ejemplo, el lector so ve loriado a
utilizar la biblioteca de secuencias de caracteres de C en reemplazo de las
llam adas de E/S de bajo nivel r e a d y w r i t e de Linux. Además, popen obliga
si program a a realizar un e x e c , que ta l vez ur.o no doaoe o no necesite. Fi
nalm ente. la función que utiliza p e l ó s e p ara obtener el estado de salida del
proceso hijo puede no acom odarle a los requerim ientos de au programa. De
jando de lado e sta pérdida de flexibilidad, pop en perm ite ahorrar entro 10 y
15 lineas de código, y el código em pleado p ara ad m in istrar la lectura y la es
critu ra de ios datos es asimismo mucho m ás sencillo que el empleado ante
riorm ente en a b r i r _ p i p e La salida, p a rte de la cual se m uestra a conti
nuación, perm anece invariable. La sem ántica em pleada con mode puede
parecer algo ex trañ a, asi que conviene recordar que r significa quo uno lee
de SC dout y «r significa que uno es e n be a 3 t d i n
S /ftu*vc_u**r_pix
/*
• s ip o o r .: Oe»”' w e le r* a a is*
SALIDA */
»incioM «unisra.r»
*VVIvOt <StC10.,*l>
u n c i d a < s ? c l i3 .n >
FIFOs
Tdl como -*i ¿ementé anteriorm ente. los FIFO s se denom inan rambiéu pipes
con nom bre porque equivalen a archivos, es decir, tienen presencia «¡n el ü-
lesystem . L o; FIFOs son especialm ente útiles, porque perm iten el intercam
bio de dato s enere procesos no relacionados e n tra sí.
332 Programación en Unux
Q u é e s un F1FO
Un sencillo ejemplo que em plea comandos de interfaz podrá ayudarlo a com
prender loa FIFOs. E l comando mkf i f 0 (1 ) tiene por función crc3r FIFOs:
skí-fc [oocionl raabra^fifo ( . . . |
Esto comando crea un FIFO denom inado n o m b re_ f i f o. £1 parám etro op •
Cion es generalm ente -m .Tiodo, donde modo indica el modo (ec dígitos ocía
les) del FIFO que se procede a crear, sujeto a modificaciones por p arte de la
umask. Después de h ab er sido creado el FIFO , uno puede utilizarlo como si
fuera parte de una pipeline (secuencia de pipes) norm al.
>• i E je m p lo
ís ) El ejenpio que viene a continuación envía la salida de n u e v o _ u s a r _ p ip e o
través de un FIFO im ag inativam ente denom inado f i f o l quo, a su vez. en
EJEMPLO vía su salida hacia el comando c u t.
Primero se croa el FIFO utilizando el siguiente comando:
S ixfifo •<* 3M ftfol
Luego 3o ejecutan loa do.s comandos siguientes:
i cat < fiffll cut .01-5 <J
S ./ftu«vo_uiarj)ipo > fífol
A continuación se sum inistra la sai id n do estos comandos de interfaz:
<•
• 01
•I
SALIDA •»mcl
•Une!
« in c l
un n
l
üit
9er
Ej í u
\
'p r i
clos
) ) )
)
Capítulo 15: Pipes y Fli-Os á3ó
clos
* * It
}
Ei comando c a t . ccrr.er.do en secundo piaao, lee s u enerada desde el FLFO
f i~ o * . La e n tra d a de c a t es la salid a del comando c u t , que recorta todo
excepto los p rim e r» cinco c aracteres de cada línea de su en trad a. La enera
da de cu*. Analm ente, es la salid a del program a n u e v o _ u s a r _ p ip e .
La salid a ñ n a i de estes comandos d e interfaz es el código truncado y de a s
pecto extraño que com pleta el listado. Si f i f o l hubiese sido un archivo n o r
m al. el resultado h ab ría sido que el mismo fuera rellenado con la salid a de
n u e v o _ u s a r _ p ip e .
C O N S E JO
.3 « 39' c o ira rú o 13 cor.flrr.arfa < n e u k f i f c :re<J a ' FI?0 solicitado. Este «jaro-
c«rfa con u n a p ’ocf an el cam oo corrisaporMiente a (loo de dispositivo &¡> -ncOo
de a re n co y t a a M n . oebxjo a la a e c ó n del sw tcn -P . acareccrfa con un carácter i
SgTtgSCO a» r e n e n
C r e a c ió n d e u n F IF O
La función requerida para crear u n FIFO se denom ina fflkf i f o . Su sintaxis
«s sim ilar a la de Cpen:
i r t «* fifo (c o n tt c.nar *no*w*_ía_*ifo, occ«_: aocoi;
P ara utilizar e sta función se d eb en incluir en el crxligo fuente del program a
loa archivos de encabezado < s y s / ty p e s .h > y < s y s / s t a t . h>. m k f ífo
crea un FIFO denominado n o m b r e _ d e _ fi? o , donde éste debe incluir su ru
ta completa de acceso, con los correspondientes perm isos especificados, en
notación octal, en c o tíe . Como do costum bre, el valor asignado a modo será
luego modificado por la u a a s k d o l proceso.
NOTA
L* uoask jfecta a i« mayorfa óo ¡as funcione» que crean arenaos o dircctonos :o r per.
rr:»os e*c«cr,coa- Para octerminar ->cr adelantado cuAlas jaran loa permisos ic un ,v
cn*o o ¿írtcrxso iesou*i de nacer aido modificado* por la urnas K cal oroceso. simple-
rrantt efectúo una operación i » Y w a M entre el modo que se desea cstoDlccer con
* corroiemento a uno ce; votar de a u.uask £*cresaoo en ’^rminoa de programación,
esto tenaria el s i e n t e aspecto:
mooe.l mcOe - 0666;
t o o í i -umaak;
Por «terrotó. cada una umask de 022. rroae 4 -urnas* retomará 0644.
i %i / E je m p lo
j 3 [il'y El siguiente program a crea un FIFO en ei directorio corriente:
• vonor» orogr.ir .1 or Interna?: n í« f lf o .c
EJEMPLO
i*LttEXlT_$UCCESS>
A p e r t u r a y c ie rr e d e F iF O s
Los procesas de a p ertu ra , cierre, elim inación, lectura y escritura de PIFOs
utilizan ¡as m ism as llam adas a sistem a opan. c i ó s e . u n lin k . re a d y w r i -
t e . respectivam ente, que uno ya ha visto, lo cual constituye una de las ven
tajas dei enfoque de Linux según el cual ‘todo es un archivo" Como la aper
tu ra y e; a e rr e de FIFO s es idéntico a la ap e rtu ra y el cierre de pipea, cal vez
le sea provechoso rep asar el program a que abre y cierra un pipe, tintado a n
teriorm ente en este capítulo con el títu lo ‘A pertura y cierro de pipen''.
Se debe ten e r en m ente algunas sutilezas, sin embargo, cuando se lee o es
cribe FIFOs prim ero, ambos extrem os cié un FIFO deben de encontrarse
abiertos an tes de que puedan ser utilizados. Segundo, y más im portante, tís
el com portam iento de un FIFO ñ éste h a 3Ído abiorto utilizando ol indicador
0_'<0N8lC3CK. Recuérdese que los indicadores 0_WR0NIY y 0_RD0NLY pue
den ser sometidos a u n a operación de 0 lógico con 0_NON8lÓCK. Si un FIFO
se abre con O_NON0lOCK y 0_RD0NLY, la llam ada retorna inm ediatam ente,
pero si es abierto con 0_N0NBIGCK y OjAflONLY pero no tam bién con 0_fl -
90NIY. o p en reto m a un error y asigna u e r n o el valor ENXIO
Si. por e! contrario, no se especifica 0_NONBlOCK e n tre los indicadores de
Open, 0_RDONLY har-A que op«?n se bloquee íno retorne) h asta que algún otro
proceso abra el FIFO p ara escribir. A nálogam ente, 0_WR0NLY se bloqueara
h asta que el FIFO sea abierto p ara lectura.
Igual que en el caso de los pipes, c sc n b ir a un FIFO que no esté abierto pura
lectura envía la sedal SIGPIPE al proceso quo está intentando escribir y
«signa a e r r n o el valor EPIPE. Después, que el últim o proceso que haya es
crito al FIFO proceda a c errar el mismo, cualquior proceso que uitent* leer
del mismo d etectará en su lectura un ca rá c ter de term inación de archivo
(EOF). Como fue mencionado con relación a los pipes, p ara asegurarse que
las operaciones de escritu ra sean atóm icas cuando hay varios procesos escri
biendo a un mismo FIFO. ia cantidad de bytes escrita en cada operación de
e sen tu ra no debe su p e ra r en tam año e! v alo r PIPE_3UF
L e c tu ra y e s c r itu r a d e F iF O s
Siem pre y cuando se respeten las p a u ta s com entadas al final de la últünu
parte, la lectura y e se n tu ra de FIFOs es sim ilar a la lectura de pipes y de
archivos convencionales.
E je m p lo
Este ejempio es u n tanto complicado Un programa. i e e r _ f í f o, crea y abre
un FEFO p a ra lectura, y exhibe la salida del FIFO en s t d o u t. El otro progra-
eje m pio e S C r i o i r _ f i f o , abre el FEFO p ara escritura. R esulta particularmente
interesante el proceso de correr en diversas ventanas varias instancias del
proceso que ¿ e r e a cargo !a escritura y observar la salida de cada una de ellas
en la v entana donde corre el program a que realiza la lectura.
■ c e i :* : c * i3 = =i I r i s —- : - c 'i r s : •
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 p e r t u r a y c ie rre d e F iF O s
Ltfs procesos de ap ertu ra, cierre, elim inación, lectura y e sen tu ra de FTFOx
u tilizan las m ism as llam adas a sistem a o p en , c i ó s e , u n li n k , re a d y .vri -
t e , respectivam ente, que uno ya h a visto, lo cual constituyo una de las ven
tajas del enfoque de Lmux según ei cual 'to d o es un archivo" Como la a p e r
tu ra y ei cierre de FIFO s es idéntico a la ap ertu ra y el cierre de pipes, ta i vez
ie sea provechoso rep a sa r el program a q u e abre y cierra un pipe, listado an
teriorm ente en este capitulo con el titulo ‘A pertura y cierro de pipes".
Se debe te n e r sn m ente alg u n as sutilezas, sin embargo, cuando se lee o es-
cnbe FIFOs. pnm ero, ambos extrem os d e un FIFO deben de encontrarse
abiertos a n te s de que puedan ser utilizados. Segundo, y más im portante, es
el com portam iento de un FIFO r. éste h a sido abierto utilizando el indicador
0_NCNB10CK. Recuérdese que loe indicadores 0_WR0NLY y 0_RD0NLY puo-
d*n ser sometidos a u n a operación de 0 lógico con 0_NONBLOCK. Si un FIFO
>e abre con (MIONBIOCK y 0_RDONLY, la llam ada reto rn a inm ediatam ente,
pero a «• abierto con 0_NONBLOCK y 0_WR0NLY pero no tam bién con 0_R •
DONLY, oper. reto m a un erro r y asigna a o r r n o el valor ENXIO.
Si, por e! contrano, no »e especifica 0_NON8LOCK e n tre los indicadores de
o p e r, 0_RDCNIY h a rá que op*n «• bloquee ino retorne) h a sta que algún otro
proceso ab ra ei FIFO p a ra escribir. An!ilngamfnr.«, 0_>VR0NLV se bloqueará
h asta que el FIFO sea abiorto p ara lectura
Igual que en ol caso do los pipes, escribir a un FIFO que no esté abierto pura
lectura envía la serial SIQPIPE al proceso que está intentando escribir y
asigna a e r r n o ei valor EPIPE D espues que el último proceso que haya os
e n to al FIFO proceda a cerrar el mismo, cualquier proceso que intente leor
del mismo d etectara en su lectura un c a rá c te r de term inación de archivo
(EOF). Como fue mencionado con relación a los pipes, p ora asegúram e que
las operaciones de e se n tu ra sean atóm icas cuando hay varios procesos escri
biendo 3 un mismo FIFO . Ia cantidad d e bytes escrita en cada operación de
escritu ra no debe su p e rar en tam año e! v alo r PIPE_BUF
L e c tu ra y e s c r itu r a d e F iF O s
Siem pre y cuando se respeten las p a u ta s com entadas al ñnal de !a ultim a
p¿rte id lectura y e se n tu ra de FIFOs es sim ilar a la lectura de pipes y de
archivos convencionales.
E je m p lo
E ste ejemplo es un canto complicado. Un programa, l e e r _ f i f o , crea v abre
u n FIFO p a ra lectura, v exhibe ia salida dei FIFO en s t d o u t. El otra progra
ma. e s c r i c i r ^ - i * c . abre el FIFO para escritura. Resulta particularmente
interesante ei proceso de correr en diversas ventanas varias instancias del
proceso que nene 2 cargo la escritura y observar la salida de cada una de ellas
er. la v en tan a donde corre el program a q u e realiza la lectura.
• vwors cei progrsas Internet: '¡ r i f o .: •/
I r • sieí.*_f‘ Te.e Zrt j : í a ira rsaa rrea í :
91
íir.cluse <sysi'sia*.h>
ílrcluda <«rriw.ft>
íificl'jae <stdio.h>
«incl'jd® <sMllD.it>
<irclvfle <fcnU.l»>
flnelcrf* <llnit3.ft>
int aain(volfl)
<
i r : <J«scrlptor_archivo /• Descriptor del FIFO »/
inc ma byras; /• Nunero de oytes leíaos desde e l
■:fti •/
char büf{PI?€_0M FJ;
acdt^! mío • *666;
>
r ^ferir « i fifo aara jola lo c iu n •/
t#«iM serio;or.archiva - aptnf’ f i r p i * , OJCONiV)) < ei f
p*rror<'oo*n*);
ítiq£XIT_FAILUBtJ;
y
al FIFO y «xhíotr *u salida do o.iios rm ta onco.itrar EOF •/
*ml«<l«>uB.pym • '•«ao{dís<n,otor_4rcfnvo1 nuf, ¡>IPE_8UF •.)! • 0>
p r in :f i* líír _ f tro líy o : %s\ buf|;
cio«(<l«scriptcr_arciiivo) ;
ttlt{CXir_SUOC£SS);
¡¡ r fin ce iw r .f tf o •/
,'COMIENZO GE ejcrlblP_fLfO
• So*trs csl prograna «n Internet, « r f i í o . c •/
/•
• escrib ir^ifO -C - E ic rio ir 4 un FIFO ‘ bien conocítfo*
•I
íL-wiud# <sys/ty«s.n>
iirtcloa# <sys/stat.h>
íirclwJe <ermo. n>
) ) ) ) ) • ) ) > ) ) ) ) ) ) ) 1 J >
J ) >
Capítulo 1 5 : P ip e s y F IF O s 337;
#ir*clufls <5tdio.r?>
#¿ttCluos < E t : i i c . n >
C o ÍT (V C iC )
{
in t ;«sc.-:D t3<-_irc.5’.i v c ; / • D e sc rip to r d e l * :F 0 y
is t Itn ; / • ütuj^ro ae b y te s -*» c ritc 3 « 1 F [? o *,•
c s * r b u f{P iP E _ 3 u F ]; ’ • S a r a m u a r « e n t u r a s a tó n ic a s *í
• o e » , : *so o - #€46;
p u rte ro ^ o ^ ftic ); r Para la liw ada * tiñe V
>
• 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 » ;
•I
i f f(■ rit9 (tíe 9 C t“Í D to r _ ir « n iv a , a u f, iu a _ 3 y t e s - ' I I < (
s e rro rC w ritr* ):
c i c s e ’ < íe s c r i 3 t o r _ .i r c r i v o );
♦ jt it t lxrr_.=A lL'ifiE j ;
>
333 Programación en Linux
Vale la pena observar que estos programas constituyen una forma primitiva,
aunque relativam ente inútil, de aplicación cliente!servidor. El servidor es
i e e r _ f ¡.f o; el mismo procesa m ensajes enviados al mismo a través dei FIFO
Los clientes son cada una de las instancias de e s c r i b i r _ f i f o, cuyo único
propósito es enviar m en s^es ai servidor.
U na aplicación cliente/servidor m ás sofisticada llevaría a cabo algún tipo de
procesam iento de loa datos que reciba y en v iaría algún tipo de datos o notifi
cación de v u elta a sus clientes. La co b ertu ra a fondo de las aplicaciones
cliente/servidor se encuentra m uy fuera flel alcance de este libro.
Capítulo 15: Pipas y FIFOs 339
Lo que viene
Este capitulo ha cubierto ía forma más sim ple de la comunicación entre pro
cesos: los pipes y FIFOs El próximo capítulo continúa con la discusión do los
métodos IPC. concentrándose en la m em oria compartida. Aunque su mecá
nica es m ás complicada que ' 3 de los pipes y Los FIFOs, la EPC por memoria
com partida es mucho m ás potente y flexible y se ia utiliza comúnmente er.
aplicaciw es m ás ex ten sas y sofisticadas, tales como los 3i3íemas de adm i
nistración de bases de datos relaciónales RD BM S o Relational Datn Base
Ms-’ia g a n tn í S y ittm s ) que ofrecen em presas como Informix y Oracle.
ij ) ) j ) ) ) )> ) .) ). ) ) ) ) ) ? ) ) ) y ) ) y
) ) ) ) > :• > M )
• a
Memoria compartida
La m em oria com partida es la p rim e ra de eres clases de IPC. o Comunicación
Interproceso>s. que se ap ren d erán en este libro. Les otroa dos tipos de ¡PC
son los sem áforos y las colas de m ensajes, que serú n el tem a del próximo ca
pitulo. E! conjunto que form an esta3 tres d a s e s de IPC 30 denom ina h a b i
tualm en te IPC System V. porque tos mism os se originaron con el UNIX Sys
tem V, lanzado originalm ente por AT&T. Las im plem cntadones do UNIX
derivadas por BSD y otros sistem as operativos del tipo de ITNDC. incluido
Linux, tam bién las incluyen.
✓ Er ti osp-tuo 17 vjrrsr. jtra una ¡ata «motota d« 'som.'íforos y colas <1<i m a n a e s'
E ste capitulo cubre los siguientes temos:
• Descripción general del IPC System V
• Problem as que p resenta el IP C System V
• Utilización de mem oria com partida
Todos los program as de este capitulo pueden ser encontradas en *»! sitio Web
h ttp :/ u c p .c o m /m f o bajo el núm ero de ISBN 0789722151.
Programación en Unux
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
NOTA
tos ■oert-'-caúc^w ¡ « est''.ctv*s d» IPC "o ser» valores pecuertos. «mores y posiUKW.
qwe se o n e c e n gol> a t yreuV'tar * ‘a manera en que se lo hace con 10$descriptoras cto
archwos. 0 » necro. 3 ¡r«e !as estructuras Van siendo creadas y elimi'- u
<¡»r: cferoMOo fo.-malrr*jnfe deoc<nir.3Co núnwo secuenciai ítt
u M <Je va alimentando "•asta ciat ur valor máximo. en «i cual vuu-'vo a 0 y
reccn-. erra ia secuencia ~orr*oca. Q valor máximo depefld* dol na tw a operativo y dol
ntrs+ w Ola se *s:4n uv .rando En Lnu» os icontlflcadoros je declaran como ente-
•o» vn i*gPO de tipo » n t . de rodo o».c el máximo vator cosiáíc paro «'tos en 65. 535.
Cada estructura IPC es creada por modio de una Junción que termina en {jet:
s e n g e t p ara ¡o a semáforos. n s g g e t para las colusdu mensaje» y sh íig et para
la m em ona compartida. Cada ves que *.*• croa un objeto por rnedio de las funcio
nes *QQt. el procedo que efectúa la Ilumutla debe especificar una clave de tipo
k e y _ t (declarada en < s y s / t y p e s . h>>, q u e el korael utiliza para generar el
identificador. El ¡cemel de Linux 2.2.jc define k e y _ t como un valor de tipo in t.
Después que una e stru c tu ra IPC haya ¿ido creada, loa llamada* «uhuiguien-
tes a una función * g e t que utilicen la m ism a clave no crean una niiev« es
tru ctu ra sino que m eram ente reto rn an e l identificador asociadu con una es
tru ctu ra ex istente Por lo tanto, dos o m ás procesos que deseen establecer
un canal IPC pueden llam ar a una función * g e t con la misma clavo.
La cuestión es. por lo tanto, cómo g aran U ¿ a r que todos ¡os prucesos que de
seen em plear una instancia d istin ta de la m ism a estructura IPC putídan uti
l i z a r la m ism a clave E n uno de los métodos, el proceso que inicialmente de
se a cre a r u n a nueva instancia de esa e stru c tu ra le transfiere a la fundón
' g e t u n a clave IPC_PRIVATE, la cual g a ra n tiz a se creará una nueva ins
tancia de la m ism a. El proceso creador d e esa instancia de la estructura IPC
alm acena entonces ei identiñcador reto rn ad o por la fundón *get en el ü-
lesystem . donde otros procesos puedan accedería. Cuando un proceso efectúa
u n * o rk p ara g en erar un proceso hijo o un exec p ara cargar determinado
procesa, el proceso padre le transfiere a 311 proceso hijo el idenc^cador retor
nado por ’ g e t como uno de ios argum entos de la función exec que carga el
nuevo proceso en m em ona. E n el caso d ei uso de f o rk . dicha transferencia
de atrib u tes desde el proceso p ad re a s u hijo es automática.
Otro método alm acena una clave e stá n d a r en un archivo ce encabezado co
m ún a todos .os program as, de modo que iodos los programas que incluyen di-
'h o archivo de encabezado tendrán acceso a ia misma clave. Un problema que
se presenta ccr. ~~j =enfoque es que n in g ú n proceso puede saber si está crean
do nueva estru ctu ra o sim plem ente accediendo una que ya ha sido creada
I I ) ) ) / - ) ) ) ) } ) J ) ) ) ) ) . J } )
344 Programación en Linux
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 ¡o b primeros 16 bits dol númoro tío inode do la ruta do accoso coinc-tíen.
Cada i debodad d<» la implomontaclóo por parte do Linux do la ftjndón ftok, -»e reco-
r enc^cciOansefite t :q$ «ro re s considerarla inútil c ignorarla.
✓ Para un 'ápido recordatorio sobra modos de archives, ver *0 mooo de un archivo*. sagi
na 134.
Capculc 16: Memoria compartida 345
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.
C O N S E JO
0 m®xer* para los «jámeles oe este cepfttKJ lpresen» «n ci litio Web do esta libro)
>ocü.-ye jn r-scrode crecxccesasar. 0 _XO?£N_SOUHCc. Este m/scro *e ■•¿•quiere oor-
cuo tocos os c m ^stra -eci'jycn < ioc.~n>, auf~noi¿ere cue „X0P£M_S0L‘RCE es:*
ocf’ -do. Ctrósamante. cuarto /O cpripii* estos programas en -jra rwtoiooón pretíe-
le'rrv'nacsa oe ü^uc de Sed Hat 5.0 presenta en m sistema, no mío (sita definir el ma
s o . oero Si C.VS que d«*-n vr el mac*o cua-oo « comoi<¿ can OftBflLrui 2.3.
1PC_CREAT indica que s: aun no existe nin g ú n segmento asociado con Key
íclave deberá ¿ercroado uno nuevo, c l a v e puede ser ya sea IPC_PRIVATE o
una ciave reto m ad a por la función f t o k . El argum ento StZ9 (fomaño) especi
fica ri tam año del segmento, redondeado h a d a arriba al valor de PAG£_SI2E,
que es el tam añn n atu ra! de una página p ara un procesador determinado í4k
para ios procesadores de Intel actuales, á k p ara el Alpha: Si Shmget cieñe
éxito retorna ei ¡dentiñeador del segm ento y si fracasa retorna -1
E je m p lo
El próximo ejemplo, c re a r_ s g to a e í3 c a m p , crea un segm ento de memoria
com partida y exhibe ei identiñcador que re to rn a S híig et.
• *i0Ecr5 :.-;«g.-sflá ir . : -.te'*=*-*r n* »-•>«.« *
348 P ro g ra m a c ió n e n U nux
s i- c lu C s « s y s 'i s c . r »
¿ ir c lu d e <sys/$lm.n>
#in ctude < s :d io .n >
íi.'icluaa <5tflliB.h>
\
: 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
)
n o tsc s i e n t o u a sa c« ilac < i\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
Sagwnta desacoplado
Como se puede apreciar en '.a salida, luego de desacoplar el segm ento de me
n o ría com partida el valor de n a t t c h pasó de 1 a 0.
Capítulo 15: Memoria compartida 351
r«ww_3C? <W6
• « o s» -* é l « s ie n to •/
í 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
Todos los program as de este capitulo p ued en ser encontrados en el sitio Web
h t t p : / y www.flcp.com ín f a b a jo el nú m ero de ISBN 0789722151.
i j f ) ) j • y ) y ) } ) . ) ) ) ) ) }
356 Programación en Linux
Colas de mensajes
U na cola de m ensajes es u n a lista vinculada de m ensajes alm acenada den
tro dei kernel e identificada a los procesos de u suario por un idcnsificador de
cota de mensajes, un identiñeador del tipo analizado en el capitulo anterior.
i ) ) ) \ a ) ) > ) j) » > ) > / f ? ) ) y
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
Como el lector ya sab*. deudo un FIFO loa datos son luidos en ol mismo o r
den en que fueron escritos al mismo Esto e stá ilustrado en la m itad :iupt*-
ñ o r de la figura 17-1. Sin em bargo, si uno conoce el tipo de un m ensaje, pue
de extraerlo de la cola m era de secuencia. Como lo indican las Hechas que
salen y se alejan do ¡a cola d« m ensajes, loa elem entos in teg ran tes do las
m ism as son en general leídos on orden FIFO, o se a el primero que se escribe
es ei prim ero que « lee. Los dos rec tángulos dibujados con líneas de puntos
con Lechas apuntando hacia arnera de la cola de m ensajes m u estran cómo
pueden 3 e r leídos los m ensajes en orden arbitrario.
Ib d as las funciones de m anipulación de colas de m ensajes se en cu en tran de
clarad as en < s y s / rcsg. h>, pero se debe tam bién incluir en el código fuente
del program a < sy s,; :y p e s .n > y < s y s / i p c .n > p a ra acceder al tipo do va
riables y constantes que contienen su s declaraciones. P a ra crear u n a n ueva
cola o p a ra a b n r u n a cola ex isten te se deberá em plear la función m s g g e t.
P ara aña¿Lr u n nuevo m ensaje al fin al de u n a cola, utilíce m sgsnd. P a ra ob
ten er u n m ensaje do ia cola, em plee flJSflrcv. La llam ad a a m s g c tl le perm i
te a uno tan to m an ip u lar las prestaciones de !a cola como elim ina r la m is
m a. siem pre y cuando el proceso q u e efectúe la Llamada sea el creador de la
cola o cuente con permisos Je ¿uperasuario.
3 5 8 P ro g ra m a c ió n e n U n u x
C r e a c ió n y a p e r tu ra d e u n a c o la
La función m s g g st crea una cola nueva o ab re u n a ya existente. S u prototi
po es el siguiente;
int nsgg*ti**y_r '<«•/, int flags);
Si la llam ad a re su lta exitosa, recom a el identiF.cador de la cola nueva o exis
tente que corresponda al valor contenido en key [clave), de acuerdo con lo s i
guiente:
• Si key es IPC_PRIVATc, ge crea u n a nueva cola em pleando un vaior de
clave que genera la im plem entación del sistem a operativo de que se
trate. U tilizando IPC_PRIVATE se g a ran tiza que so cree u n a nueva co
la -irm pre y a jan d o no sean excedidos con la m ism a el núm ero total de
colatí o el núm ero total de bytes disponibles p ara la totalidad di- ias co
las que p erm ita el sistem a operativo.
• Si Key no es IPC_PR IVATE, pero key no corresponde u una cola exis
ten te que tenga idéntica clave, o si so oncuontra activado unimiiimo el
bit IPC_CR6AT en ol argum ento Daga, la cola será igualm ente creada.
• Sn ol caso resta n te -o sea. ai key no ea IPC_PR IVATE y el bit de
IPC_CREAT de flags no so encuentra activado- m sg g et reto m a el iden-
tificador de la cola existente asociada con key
St m sg g et fracasa, reto m a - l y unigna a la variable de erro r e r r n o el valor
adecuado.
E je m p lo
El program a de dem ostración quo sigue, c r e a r _ c o l a , crea una nueva cola
de m easajes Si se lo vuelve a ejecutar una segunda vez, on lu g ar de cre a r la
ejeM Pto coid especificada sim plem ente abre la cola existente.
I ' Sonor» <1«1 p r e g ra u #n In tu rn et: al<q.c */
/•
• c r e ir .c o ii.: ■ Crea uns c c ln d* rr«nsaios úo IPC S y sten v
V
¡riiiclL-ce < s y s / t y p e a .io
í w c iL o e < s y jn o c .n >
* in c '.u 2« < s y s/n $ g .h >
í in c l w ia < s t a io .r >
í i n c l w e < s t a lib .n >
in t r c a in d n : a r g c , ch a r * a r g v [ [)
{
i n t ie e flt ífic a < Jo r _ c o i* ¡
< éy_t c la v # = 1 2 3 ; / * C lave aa i a c o la • /
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 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
PRECAUCION
AOsférereace a ccc.'re cor a- owrsMftamier.» ce la f-rcicn open. cuardo se
:-B2 ut3 e^rructjra *=C S>-=fen v. a usask -r-í> ornease io mociñcs los pampos
Oe acceso o a estrjct--3 5- -oo r.o astaoiece permisos <íe acceso, el tccu pfcdeier
minado es 0 . ,io <?j« s gnrifca ?--e « creacc/ o-¿ .3 «strucrurj usnflfá pirn-fsea oe ac
ceso c* «t-ra/e& cr^'a a ta ciis.xa!
E s c r itu r a d e un m e n s a je a u n a c o la
Tai como fue expucado anteriorm ente, p a ra a ñ a d ir un nuevo mensaje al fi-
mil de u n a coia ¿e deberá utilizar la función m sgsnd. cuyo prototipo es el s i
guiente:
is ~ « í í i s r c i i R M i c « ■ '« -0 12 *ctr, siz¡_z n a / z i s . in t ? í a g s ; ;
• EACCES
i ) ) ) ) ) ) ) ) ) ) } ) y ) ) ) ' }
Programación en Linux
• EFAU LT
• E IO S M
• E IN TR
• E IN V A L
• ENO M EM
CONSEJO
U plantilla ce la estructura msgbuf puede ser expandida de modo de satisfacer las rse-
ceaidaces de !as disertas apiicacor.es. Por «¡emeio, si uno desea transfenr un mensa-
o que consista ■?.*. un valor entero y un arrezo de ipo carácter compuesto por 1 0 Oytes
4ó*o nace fa¡t3 ceciarar msgCuf como sigue:
H ) ) ] ) ) ) ) .1 > ) > > > 1 '
r . - 'j r
IC-^ tLCCJíersají;
in t i;
c fc a r : í * t o _ w n 5 3 i « n í |;
>;
■5S-9C.’* e * s u n va cr lo ng se^vdc ;<y ios -3aío$ del mensaje, que cvcden
«Star fe— a n sie s cor--" jnc lo constce--* adecuado. B ‘.amarte Ce ¡a estructura decio-
^aca este ejecxeío es s iz e o f (» s g t »u -f) • s i z e o f (l o n g ).
E je m p lo
E3te program a. e n v ia r _ 3 _ c c ia . añ a d e u n m ensaje al final de u n a cola que
ya existe. E l .der.t-.ítcador de la cola le debe ser transferido ai program a co
n o único argum ento de su línea de comandos
r * $ * tr* 5»: ;rjg rtx a « i In te rn e t. « n d .c V
/•
• *wriar_a_eata.c - £ rv ta r on a una cola ya ao ie rta con a n te ric rid o s
• 5 in t» « u « rn a r_ a _ c a ta íd a n tific a c c r da c o la
•I
ainclw Ja «tya/typas.n»
•in d u c e <||t/idc.rv>
• V K h tto < i y $ ln g .ñ >
u rc l^c t <jtaw.->
«tncluo» <*:Clie.ft>
•incl-ide <»t<*trg.n»
•tftciaí# «uniste. n>
ir t * a ir .( in t a r;c . c r ir * a rijv J ¡|
{
in t ia « n tific a tío rje o U ;
/ 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 : • ) ;
I * A s o c ia r «1 n e n a a je in g ro « a d o c o n « m g ro c o a o •/
(Mffttr • * n i. i) * . t ia o _ e a n s a | a • g e t p id O ;
r A ñ a d ir «1 n » n sa )« a l U n a ! d« l a c o l a •/
: aiui*a_:exto * strUn<buff«r_*ar,«a|*.tiixto_nonM)#};
i'(( tig jn d < ld « r:if:.c * d e r.c o la , 4bjff«r_aenaa¡«, tn*aAú_t«*to, 0}| < a) i
a a rra rC B jg s n a 'l!
•iitl£ xtr_ F A a ií> e > ¡
)
p u ts C U im a ja p u D lic a W ) ;
rtxH(£XIT_SUC6SS);
>
Un.i corrida de prueba de osle projjrama prodigo la siguiente salidu O bsér
vese que el program a utiliza el identificador de cola retornado por la llama*
da a c r e a r j j o l a mm ediaLamente anterior.
S . crear_cola
Creada co la de id a n tifica c-a r * a<o
A c ie rta c o la oe ldenti*;cador * 648
s a l id a 5
s . /e<iviar_a_cola $43
Ingrese un nenaaie para su b lica r:
cS*3 as a l oersa;5 3e prueca niñero uno
aensaie coDiicado
Si tiene éxito, a s g r c v elim ina de la cola e l m ensaje que haya extraído. Los
argum entos son los mismos que los que acep ta ra s g sn d , excepto que
m sg rev rellen a la estru c tu ra señalada p o r D tr con el tipo de m ensaje y h as
ta n o y te s de datos. El argum ento adicional, ty p e , correspondo al miembro
ti.p o _ r.e n sa j e do la estru c tu ra m e n sa je com entada anteriorm ente. El vu-
lor de ty p e determ ina que m ensaje os retornado, tal como so indica en la si
guiente lista:
• S« ty p e es 3 se reto rn a el prim er m en saje («1 «uperior) de la cola
• Si ty o e es > 3 se re to m a el p n m e r m en saje cuyo t í p o j n e n s a j e sea
igual a ty p e .
• Si ty p e ea < O »e re to m a o! prim er m ensaje cuyo tip o _ m e n s a je sea el
valor m is bajo m enor o igual al valor absoluto de ty p e .
El valor de f l a g s controla adem ás el com portam iento de m sgrev. Si el
m ensaje reto m ad o tiene una extensión m ayor a n b y te s y en f l a g s se e n
cu en tra activado el bit correspondiente a MSG_NOEÁROR. ol mismo resu lta
truncado a n b y te s pero no se genera notificación al respecto). Si el bit res
pectivo no ie en cu en tra activado, v.s g r c v re to m a -1 a fin de indicar un
erro r y asigna a e r r n o el valor E23IG {ERROR: D EM ASIADO GRANDE).
El m ensaje seguirá perm aneciendo eu lu co la
S: en f l a g s se en co n trara activado el bit IPC_NCWAIT (IP C JfO E S P E R A R )
y no se encontrase disponible un m ensaje del tipo especificado, m sgrev re
to m a inm ediatam ente y asigna a e r r r .o el valor ENOUSG. De lo contrano.
a s g r c v se bloquea no reto m a h a sta quo te n g a lu g ar p a ra u s g s n d u n a de
las m ism as condiciones descriptas anterio rm en te.
NOTA
Se steoa ampte» jy .,v:f -*¿aác osra a «gúmena 'ico oara crear un acó ce cois denom>-
-* » LifO 2 ¿ano «?tra orrr^rz ¡xe i&é ■iaaí ir • flrst ouO i mencoo oanoninaao olla
s 'jo _¿s r=r¿'=-*<-cis corre '.ce oe ur .3 c<oegatrvo permite o uio rocuzcrar rrenssea zc
jr '.ys z&x, e ai w : r . 3a-acénseos en cois.
E je m p lo
El siguiente program a iñ e r _ ! ;o i a . lee un m ensaje da u n a cola previam ente
.-reaca que disponga de mensajes. El :cencificador de la cola de la cual se
leerá se !e tran sfiere al program a como un argum ento s n la linea de com an
dos del mismo.
/ ) ) ) ) ) } ) ) ) ) ) ) > ) > > } * *
364 Programación en Linux
r Ver,í¡rz d a : p r c q r a n a e r i n t e r n e t : q r d . c • /
r
• l 5 e r _ c o i a . c - Read a l l n a s s a g e 'r o n a íie s sa g e queue
• S i n t a x i s : l « r _ c o l a i d e r t i f t e a d o r de c o la
*/
íí n c l u d * < 5 y s/t'/0 9 3 .ti>
♦ i r e l u d e < s y s /i o c .n >
*L*.<luce < sy 3 / irsg .t»
« in c íu c e < $ td io .h >
• ln c iu « « < s td llb .t» >
J t r u c t r o n s a )» < r E s tr u c tu r a p ara o l « r . s a j e • /
Ic n q t t p o j i e n s a j » ;
c h a r t« x to _ n « n 5 3 - e ( r,w ,;¡o 3U F ;;
/ • O o te n o r o l i d o n t t f í e a d o r do c o l a t r a n s f o r m o o n l a i t n o a ao c o n a n d o a • /
lia rs e i *2 | ( / • A m o e r - n o rü ro c o l p r e g r a n » y « r j u c t n t a do íj li n c a
0« c o n a n íc a ' /
S u t i l -MCOO 2 c cUPLEO; l o o r _ c o l a < i d o n t l ': c ü d o r ao c o l a » * ) ;
oxit<£x:r_FA:LURE);
*
ld o r .tif ic a a o r_ c o la * a ro l¡4 rQ v (l | ) ;
r R « c u p « ra r un n e n s a ja d a l a c o l a y e x h i b i r l e • /
tit.irto_taxta - osare-/( identiflcador_cola, .1 buffor_«enaaje, TMWlOBUF, o, 0}¡
i f ( tacaño je x t o > O! {
p n n t? C '- * y e n d o i d e n t i f i c a d a ." d e : o l a . % 05tí\n*. : 3 o / i t i ? l c a c c r _ c o l a ) ;
o r m t f C '. t T l p o do t a n s a j e : W d X r T , ( S S u r r e r j i e r . s a j e ) •i t i p s j i e r . s a ] * )
o r i n t f ( * \ t T e ) c t o c a l n e n s í j » ; S - s n *, |A o u ffa r_ r,e n a a } e ) > te x -o _ .tie n sa ;o } ;
> « Isa {
p e r r o r ( * w g r e v '| ;
' .1 ) ) I ) I .1 ) .» I i > ) i f 7 ) ! ) i
Capítulo 17 Semáforos y colas de m ensajes 365
» t i t ¡£ X I - _ = A lL Ü f t = i;
>
**it(Exrr_sycc€SSj;
j
A continuación se m aestra la. saiid a de este program a. En este caso, el m is
mo u tiliza ei identificador de cola creado por c r e a r _ c o i a y lee ei m ensaje
publicado por en v íaf* _ a _COla.
5 . / cr«i^_coI*
C r t JC i c o la : e n w n t i? iz i-lo r -
A b i t r t a c o H C « iUtrtttficacor * s u
S A L IO A S
S ./to*Ur_4_coii wa
Ir» g s* ur w -saj« c-sra pusliC^r:
S ttt •* t i M-i*!* C« ;rij*í:4 r w o une
« ■ íflw jf b« S Ii :« 2 c
S
t / I w _ C 3 l a 544
lib re o i3e.“*Lfic*íor 3* ccU: «4*0
Tiro <n *r.*ai«: i«3*3
T « íto c « l o í r n ¡ t : 6 jt 9 «? «I i « r « | í c e pruooa nunora uno
E je m p lo
El siguiente program a utiliza ia llam ada a m s g c tl p ara elim inar una col3
cuyo identificador se le transfiere on la lín ea do comandos.
cjsm p io r Nonort del p r ^ r a n a qn [ n t e r r a t : f i c t i . c */
e
• ? lt 3 iin a r _ c o la .c • E lía in a una c o la oc ttan sajo s
• S ln ta m «iutLna r Tür.ja|9 uianuficacor Oo cola
•/
#inciuo« <sy$/typ»».n>
«ircluaa <iysapc.n>
*:n c lu o « < iy « /« 8 g.ft>
»tnclu<3« <s:dio.h>
«incluí»
«yiciud* < «rin g .ti>
íirclud* <unw:<l..l>
<
in t iCantificaaor,cola;
struct ajoia_JS colajJBjionsajea;
íf(arge := 2) {
puts(*M000 0£ EMPLEO: a iir ,in a r _ c o ia <identífiC3!Sür_C0Ía>' >;
>
K JflflC iflC 3d o r_ « ola 3 a t o i ( 3 r g v [ i ¡ ) ;
i í ( ( « g c t i í i < i a n t i í i c a c o í _ c o l a . IP C JW 10 . < 3) {
e a r r o r i 'n s g c t l 'J ¡
ex:t(SXIT_FAIUJR.£);
)
p rin tff* C o la %d sliA inttaln’ , ic e n t ific a C o r .c c ia ) ;
9X¿ I ( SXI T_S_'CCS3S i ;
Capítulo 1~: Semáforos y colas de mensajes 367
S , / ; 'í í r . « a
C r * W l C 3 Í5 Ce l« .* t¿ f ic 4 4 c r = ’2zi
cela u :a«<i?;';c*3o- * ’ 230
S
SAtlD*
s ipcj •n
----- UíSJlc» Srf.ü -------
ir p * « ;5 smr*r 5«i-rs
;« n js a í-S y tf» « m sa g « 9
Í1ÍMHJ?: k u n jM il í«S a 0
s
S ..'#!¿siaar.c9U 'Z«í
Con ' í S I
s
S lK t 3
-----MtU(« X k i i --------
«*7 «Kid ownir w nu uieO-úytes mihq«i
La « ¡ id a de este program a m u estra que In coto especificada ha sido elimina
d a Ei proceso c r e a r _ c o l a crea on efecto la cola. El comando ip e s confir
m a que la cola fue creada. Em pleando 1liego el identificador de cola reto m a
do por c r e a r * _ c o la , a l r u n a r j r o l a llam a a m s g c tl, especificando el
indicador IPC_R.UID que es requúndo por esa ru tin a para elim inar la cola.
U na segunda corrida de tp e s confirm a que e li m t n a r _ c o l a efectivamente
eliminó la cola de menaajes.
El comando i p c s ( 1) estructuras de IP O , utilizado en vario* de lo* progra
mas de dem ostración, m uestra el núm ero y el estado de todas las estructu
ras de IPC System V que se encuentran presentes en el sistema cuando en
esa instancia de su ejecución.
El comando ip c r o ( 1) elim inará la e stru ctu ra IPC cuyo tipo o tdcntificador
sea especificado en la línea de comandos. Ver las página* dei manual para ob
tener m ayor información. La figura 17-2 m uestra la salida del comandu tp e s .
F ig u ra 17.2. Ei comando ipes m uestra :odo$ los objetos dei [PC System V
que se encuentran presentes er, el m om ento de correr el mismo.
La figura 17-2 m u e stra que por lo menos uno de cada tipo de objeto IPC
excíte. Se encuentran corrientem ente en uso rres segmentos de memoria
com parad a, una cola de m ensajes y dos semáforos líos semáforos se an ali
zan er. ei próximo título). P ara cada objeto ?e listan claramente ¿u clave.
.1 ) ) i J >
368 Programación en Linux
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
NO T A
j h amadas a semáforos Ce* 'PC System V en roalidsd operan sofcre un arreglo, o con
junto. Ce «má*oros. en lugat ce hacerlo soo'e solo do d'os. El doc-eo do esta ex-
pUcactfn, no oostsnte. es ¿molificar try.am ten» y presentar el rrítsriol -31 JoCtOr en
tvear ce cubrir 'c-3 semáforos ®n toda su co^ple^dad. '*fc sea que se trabaje con un úni
co soentforo o cor. mochos af mismo tiempo, el errfoaue bás-cc e3 el mismo, cero resus
la « r s o rta r» oue » factor comcronda ¡os semáforos dai !PC System V vienen en
corpxtics. Perw-aimerrte. considera cue la Interfax es ínnecesariamonto compleja. y el
\>Z =>OSW estandart» una ir?eff3r más simple pero igualmente coteote.
a tratamiento que se efectúa ce os ser^fiyos en este capitulo omite también su orr
pi*o er. otras situaciones en ¡as cuates un proceso Üene muchos hilos de ejecución,
los orocetcs mu.t)T.!ct y ol empleo de semáforos en tlicho contexto se encuentra mfis
and oci atanco tic o sa foro.
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.
w t ta in (v o ld )
{
inc idantiricaflo^jOTafors;
in t ío ta l.S M iu r o r o i * t i Guanina a en a fo ro s c r e a r •<
in t in d ica d o re s * *686; I • üern ch as do le c tu r a y e o d iílc a c io n para
todos io s u s u ir ic s ‘ I
s t r u c t saBDu- Ouf;
•xittéXIT/AlUBE);
>
La siguiente es la salida de una corridu d e c re a r _ s e m a f o ro. Los valores do
loa ¿denüñcadores que se vea pasiblem ente resulten diferentes on s u sistem a.
5*w*ws creído: S12
--------- S— pftort v r j y j ---------------
K«y icaid e*r*r pems man* status
SALIDA (IMNNM 5*2 *urt_ « li SM t
El ejemplo utiliza IPC_PRIVAT£ p ara aseg u rarse do que ol semáforo sea
crvado ta l como se lo requiere, y luego exhibe el valor retom ado por sem
g e t , o se a el identificador de ese sem áforo. La llam ada a semop inicializa
adecuadam ente el semáforo: Como sólo so croa un semáforo, sem jvjm e»
igual a cero Como el recurso im aginario no se eneunntra en u«o (en verdad,
cate sem áforo no ha «ido vinculado por *1 projproma con ningún recurso e s
pecifico), c r e a r _ s e tr .a f o ro inicializa su valor u I , el equivalente a desblo
queado. Al no ser requerida u n a conducta do bloqueo, el indicador S0m_f lg
del sem áforo se establece a IPC_NOWAIf. para que lo llam ada retom e de
forma inm ediata. Finalm ente, el program a utiliza la llam ada a sy s ta m para
invocar la utilidad de linea de com andos i p e s a fin do confirm ar una segun
da vex que la estru ctu ra IPC requerida, de hecho exiate.
C o n tr o l y r e m o c ió n d e s e m á fo ro s
El lector ya ha visto funcionar a s s g c r l y s h m c tl. las ru tin a s que m anipu
lan las colas de m ensajes y los segm entos de mem oria com partida. Tal como
era dable de esperar, la función equivalente p ara el caso de los sem áforos es
s e a c t l . cuyo prototipo e* el siguiente
rm SMC?l(utt ie«i2, int seas*, m : . uflion swur. arg);
S e r id identifica el conjunto de sem áforos que 3e desea m anipular.
s e o n to especifica el semáforo especifico en que uno se encuentra in teresa
do. E ste libro no tom a en cuenta las situaciones en las que hay varios sem á
foros integrando u n conjunto, de modo que semnum (en realidad un índice de
un arreglo de semáforos) se rá siem pre coro.
E l argum ento C"K3 acción »puede ser uno de los valores de la lista siguiente:
• GETVAL: R etorna ei ¿atado c o m e n te del semáforo (bloqueado o des
bloqueado).
• SETVAL: E stablece el estado co rriente deí sem áforo a a r g . v a l (el a r
gum ento sem un se an alizará enseguida;.
• GE” ID: R etorna el PLD del último proceso q u s llamó a semop -
> > i ; y
372 Programación en Linux
• GETNCNT: Hace que ei valor retom ado por s s r . c t l sea el núm ero de
procesos aguardando quo el sem áforo se increm ente; es de
cir. ei núm ero de procesos a la espera de luz verde.
• GE7ZCNT: Hace que el valor reto rn ad o por s e m c ti sen el num ero de
procesos que están aguardando p a ra que ei valor del sem á
foro sea cero.
• GETALL: R etorna los valores corrientes de codos ios sem áforos p re
sencié en el conjunto asociado con se ffid .
• SETALL: Asigna a todos los sem áforos del conjunto asociado con s e -
mid los respectivos valores alm acenados en a r g . a r r a y
• IPC_fiMtD: Elimina el sem áforo cuyo identificador es sem id.
• [PC_SET; Establece es modo (bits de perm iso.'en ol semáforo.
• I?C_STAT: Cada sem áforo tiene u n a e stru c tu ra de dntos, se m íd _ d s,
que d escrita e n teram en te su configuración y com porta
miento. IPC_STAT copia e sta información de configuración
al miembro a rg .b u f do la estru c tu ra semun.
S: 18 ru tin a s e m c tl fracasa, reto m a -1 y asigna el valor adecuado a la va-
riablu e r r n o . Si on cambio tiene (¿sito, reto m a u n valor entero que puede
se r GETNCNT. GETPIO. GETVAL p QETZCNT, ae^ n cuál haya «ido el valor de
cmd que le haya aido transferido.
Tal como ol lector debo do h ab er inferido, el argum ento semun desem peña
un uíipei vital en ln ru tin a so m e tí. Uno debo definirlo en su código fuente
do acuerdo con loa lincam ientos do la siguiente plantilla;
unton *tmin (
tr.: vaL; /* Valor pura SETYAL ‘ I
»‘.ruct ion:tl_38 *auf; /• Bufor c« !PC_srA’ •/
•inncnod tftor? ln: ‘ nr-ay; r Buffer do íETall y SGtALL •/
);
\ 11
Ü |) E je m p lo
¿fgl A >.-.tta a ltu ra el lector debería estar en condiciones do com prender la razón
mj>uo de mis qutijas respecto de quo la in terfaz de sem áforos del IPC System V es
dem asiado complicada p ara los sim ples m ortales. A p esar de esa dificultad el
próximo ejemplo, e li ( n i n a r _ s e n a f o ro , utiliza la ru tin a s e m e ti p a ra eli
m inar un sem áforo del sistem a. A ntes de hacerlo se requerirá ei empleo de
crear_ _ sem af o r o p ara crear precisam ente ese semáforo y luejjo em plear el
ídeatiñcador del mismo como argum ento para la línea de comandos de
a iijn in a r _ s e m a f o r o .
r V30bre ddi orografía en :n:ern«i: scU .c V
r
• aiirunar_j4.raforo.c - Vanipuiar y s iu in * .- un ser.ai’oro
• S ín u x is : ei:nirar_3ar.áfíra iaantif lc.Wor ae 36iraforo
V
CaDitU’O 17: Semáforos y colas de mensajes 373
t?{a^c ?• 2) {
OutS(*W00 Oí iVP’.íO : * liB ín »r <ie«r:ifíca<ícr d« 93nafaro>*>;
>
i3»eufüador_ncafaro « *toi<ar?v(1])¡
r ü lB ir.ir «1 ií34íoro */
¿♦((«••ctKJOtntlftcatfor.Mnífor*, «. IPCJWIDII < 0) {
w r-3 P {-* ««c ti ik _*«io *);
) #i*t (
0g!«(*$«MMro «U fU M d O '):
ty»t«c{*iocs
>
**i:t6í!T_$ucc£SSi;
>
La salid a que produjo e L ic u n a r _ s e m a f o r o en mi sistem a fue la siguiente:
S (cr«sr^i*»af=ro
^ U a itzro cr«» 00 -
--------- im s r ^ r e A r n y » ----------------
y i« ic «mer Mriw n9ejs status
3 i*K*ee*i 5¿« kurt_*ali i
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
)
)
)
)
)
)
)
.)
)
)
)
)
)
)
)
)
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
NO TA
íi'o s pa/rares acedas son s ^ i «nrM para describir as coerocio'MíS de lai
reces as iQ.Tixl3c.«y E> s¡s m nana cortiíflérAOlci'V-nte *ooresimplirlcado psique
'a cea es pro.ee» a¡ 'ector a sutoenie información con» para colocar la programación
pa-'S reces en un zemeao ler-ga sigrrficaco, sin acrunaro ¡tí m ivo tiempo 050
os satiies. Se r_ega zc' lo tan» tener esto en c-enta a rreo:ca que se avaras con la
•ecn¿ra ce tos rrórno».
De manera sírm'ar, un z¿&vj<¡ ;w>de rozsr o superice ce la programación oa-
ra reces. £4 :3 constituye •jr- tena avnoJe^j que recuero demos ce aáginas para poder
desarrollarlo 00 marera mcegf#.
errores si es capaz de detectar las corrupciones de daros, d e sca rta r los m en
sajes corruptos y disponer la retran sm isió n de los datos corregidos.
Las redes transm iten datos de u n a de das m aneras: utilizando bytes individua
les de datos y utilizando paquetes. Los protocolos d* secuencia de caracteres
realizar, sólo transm isiones basadas en bytes, porque únicamente- pueden a d
m inistrar secuencias de bytes. de m anera m uy sim ilar a los dispositivos de ca
racteres de Linux y otros sistem as operativos. Los protocolos de secuencia de
datos pueden dividir largas secuencias de bytes a los efectos de su transm isión
más eficiente, pero los mismos están secuenciatlns, ¡o que significa que arrib a
rán en el mismo orden en que son enviados. Los protocolos de secuencias de da
tos son conocidos tam bién como protocolos confiables porque adoptan significa
tivos recaudos’ para garantizar que los mensajes transm itidos por la red sean
entregados intactos o se notifique al rem itente que durante el trayecto ocurrie
ron uno o m ás errores y que el mensaje debe de s e r reenviado.
Los protocolos basados cu pcqtutlea, a su vez, crean envoltorios (paquetes) de da
tos de tamarto fijo y arbitrario. Estos protocolos desglosan el contenido de sus pa
quetes cuando proceden a enviarlos, y únicamente entregan paquetes completos.
Con estos términos en mente, resu lta relativam ente simpte clasificar !u mayo
ría do los protocolos de red. incluyendo TCP/IP, el protocolo básico do Internet,
y el IPC local 'conocido anteriorm ente como sockets de UNIX), en una de do3
categorías. Los prutocolw de dataginm a, tales como el U D P (L W Datagram
Protocd), e3t<in basado» en paquetus, que son sm conexjón, r.o sccuenciados. y
no ofrecen control de errores. Los protocolos de secuencia de ccmrtcrvr,. por ol
con truno, están orientados a bytes y ofrecen tanto secucnciamiento de datos
corno control do errores. TCP {Transmissiort Control Ptvtocol). constituyo un
ojemplo clásico de protocolo do a n u e n c ia do caracteres:
NOTA
La .i5*.3 corrofeta protocolo» y do direcciones atírtiUdos m r»aHa en < 3 y o •
. '5 0 C k e t . h > .
C o n e x ió n a un s o c k e t
Aun cuando un socket ya haya sido creado, resulta inútil sin a b n r conexio
nes h a c a el mismo. Además, el proceso de conexión ea diferente para ios
procesos de servidor y p a ra los procesos de cliente Los proceso» de servidor
son procesos que reciben u n pedido de información, da toe. u otorgan a quien
lo b a pedido algún tipo de acceso h a d a algún recurso o facilidad. De m anera
correspondiente, los procesos de servidor, generalmente, crean un ¡wckot y
luego ag u ard an la llegada de pedidos de conexión por parte de Ion clientes o
solicitantes. Los procesos diente», análogamente, requieren del servidor que
les provea información o datos vía el socket. o envían un pedido, de nuevo a
trav és del socket. de acceso a algún servicio que provee ol servidor.
U n servidor, entonces, tiene máa trabajo que realizar que un diento. Pnme*
ro. habiendo creado un socket, debe ligarse al mismo, lo cual crea una aso
ciación e n tre el socket y una dirección. En el caso de los sockets do entorno
UNIX, e sta direcdón consiste sim plem ente de una ruta de acceso y un a r
chivo (tal como se detalla en la próxima sección) En el caso de un socket
norm al TCP/IP, la direcdón es una dirección estándar de Internet (comenta
d a en el título "Programación de TCP/IP". más adelante en este capítulo).
D espués de h ab er ligado la condición, un servidor debe permanecer a la es*
cucha de una conexión, lo que significa que debe aguardar hasta que un
d ie n te solicite una conexión a ese socket. Despuea de redbir el pedido de co
nexión. el servidor habitualm entc acepta la misma; es decir, abro formal
m ente la conexión p ara el d ie n te que lo ha solicitado y comienza a intercam
b iar información con el m ^ m n a través del socket. Las fundones para
realiz a r una de las tareas necesarias del servidor se denominan in tu iti
vam ente b in d (ligar), l i s t e n escuchar) y a c c e p t (aceptar).
Ei cliente, a su vez. sim plem ente necesita requerir una conexión al socket
que h a sido abierto por el serv id o r De m anera igualmente intuitiva, el clien
te utiliza la llam ada i sistem a connect p aja requerir su conexión ol socket
en el cual se encuentra interesado. La ¿g u ra 15*2 ilustra el proceso de crea-
d o n y conexión a on socket tanto para un cliente como para un servidor.
Como se puede observar en la figura 1S-2, el servidor controla el acceso del
cliente al socket por medio de ¡a llamada 3 a c c so t. No existe ningún re
querim iento de que el servidor deba aceptar el pedido de conexión de un
d ien te.
Programación en Linux
C o n e x ió n a un s o c k e t
Aun cuando un socket ya haya sido creado, resulta inútil sin abrir conexio
nes hacia el mismo. Ademas, ol proceso do ccnnxiOn es diferente pora 1m
procesos de te ñ id o r y p ara los proco ios de cliente. Los procesos do servidor
30n procesos que reciben un pedido de información, datos, u otorgan a quien
lo ha pedido algún tipo de acceso h a c a algún recurso o facilidad Do m anera
correspondiente, loa procesos de servidor, gene raímente, crean un socket y
luego ag uard an la llegada do pedido# de conexión por parte de los d ien tes o
solicitante*. Loa procesos clientes. análogamente, requieren del servidor que
les provea información o datos vía al socket, o envían un pedido, do nuevo a
través del socket, de acceso a algún servicio quo provee el servidor.
Un servidor, entonces, heno más trabajo que realizar que un cliente. Prime
ro. habiendo creado un socket. debe ligarse al mismo, ¡o cual crea una aso
ciación entre el socket y una dirección. En e! caso de loa sockets de entorno
UNIX, esta dirección consiste simplemente de una ruta de acceso y un ar
chivo (tal como se detallo en la próxima sección). En el caso de un socket
normal TCP/IP, la dirección es una dirección estándar de Internet (comenta
da en el título ‘Programación de TCP/IP*. más adelante en este capitulo).
Después de haber ligado la condición, un servidor debe permanecer a ¡a es
cucha de una conexión, lo que significa que debe aguardar hasta quo un
chente solicite una conexión a ese socket. Después de recibir el pedido de co
nexión, el servidor habitualmenie acepta la misma; es decir, abre formal
mente la conexión para el dienta que lo ha solicitado y comienza a intercam
biar información con el mismo a través del socket. Las funciones para
realizar cada una de las tareas necesarias del servidor se denominan intuiti
vamente b in ti ligar), l i s t e n (escuchar) y accept (aceptar).
El chente, a su vez, sim plem ente necesita requerir una conexión al socket
que h a sido abierto por el serv id o r De manera igualmente intuitiva, el clien
te utiliza la llam ad a a sistem a connect para requerir ¿u conexión al socket
en el cual se encuentra interesado. La figura 18-2 ilustra ei proceso de crea
ción y conexión a u n socket tan to p ara un diente como para un servidor.
Como se puede observar en ia figura 13-2, el servidor controla el acceso del
d ie n te al socket por medio de la llam ada a a c c e p t. No existe ningún re
querim iento de que el servidor deba aceptar el pedido de conexión de un
cliente.
V ,, M M ,• > v / V \l }S >\ f - >' >' > > > > } 1 ' ' '
CU=N7 $E*VEW
r— ícci« : i) -
^ correcto j woac
ttooni) j
J a-xecM
ACnve jCCKfT
NO TA
3- : a - a á?i ^ S i x sara sccfcets admita a¡Jira s testaciones de segundac (concreta-
--c-'.b. r e c e r c a o s ’ re*erWa$ a es frisaos, no se as cucre 3C-> eomue ai acoso de
-•“-i* es sdc*e*s »CS:x se eocuer-'/a astado de evolución. 1.3 Mtpfementación
x< M rto ce ü r j* de :s -C osra POSix se encuentra rcempteta. Gran parte del mate-
■.=. se i especmcac :•* =CSUC e; ect.-.3^-e''te existe pero ir. muchos -ases las l ama
ras y .e « e s ta r a nueva «¡*c»f¡caci ir- carecen se^ 3fi>o envoltorios do las a rd u a s
3.-3G3S ./roer'Jífl'ocss cor :a eseectfleaódn 'clasica* cr^PCSiX. »ero aún, as sagi
nas de -a n se encuertrar »'0 S 3 n e n t.» desaecua^adas.
-2 rsíersrca oe prcgr*naoón rf$5 s o ro -K J j í i .a esDecficaoór. IPC ce oqsix laconscn,-
ye a seré 3e ftcfwB S-*e\»ns Veíw/fr Prcffscvnr^. S el lector vatara Ce uíilirar e °C de
^ C S X OcOoré teo®*- en ros-ta --■= el rr»srro tal vez oo se comeorta como uno 'o escervwla.
Sockets de entorno UN IX
Les sockets de entorno ITNTX o p eran sólo en com putadoras aisladas, de mo
do que se asem ejan mucho m ás a pipc-5 con nom bre que a un protocolo de
red. Las direcciones a la s cuales se ligan los «.ocketa de entorno UNIX son
archivos reales presentes en ol fileaystem . Sin em bargo, los sockots uo pue
den -íer abortos; deben ser accedidos utiiizundo la interfaz p ara sockocs.
C r e a c ió n d e u n s o c k e t d e e n t o r n o U N IX
En la p arte “L a API de socket Borkoloy". pAgina 38'2. el lector aprendió que
la estru c tu ra sockaddr contieno on sus do* miembros el tipo y los d ato s do
u n a dirección de red. Eso en realid ad fue una sobregeneralización. E n reali
dad. dicha e stru c tu ra s o c k a d d r el formato general. Todas las familia* de
protocolo* cuentan con su propia voreión de sockaddr específica p ara cada
entorno. La estru c tu ra s o c k a d d r p a ra los sockets de ontorno UNLX ao e n
cu en tra definida on < s y 3 /u n .n > d e la m anera liguiente;
$t<vct *9Zkmar_i¿e¡ {
us»lSn*fl m or» ! A t lu f i.f a a iiy : /• AFJJNtX •/
cna r w.n M tn ( tC 8 1 ; /• ?atn«iau« •/
1;
P a ra c re a r un socket de entorno L'NÍX. s u n _ f a m ily debe ser p u esta al va
lor AFJJNIX. A su vez. s u n _ p a tn contiene el nom bre del archivo quo será
utilizado como socket. El socket se liga al archivo por medio de la llam ada a
b i n d , ta l como uno lo esperaría, pero el archivo es creado recién cuando se
llam a a D m d . Si el archivo ya ex istiera b in d fracasa, asigna a e r r n o el va
lor EAD0P.INUS5 dirección ¿spe rada en uso) y reto m a - * al proceso que
efectuó la llam ada. El macro SUN_LEN\ tam bién definido en < s y s /u n .h>,
re to m a el tam año de u n a e stru c tu ra de patró n SO Ckaddr_un.
Les pru^-ramas c r e a r _ s o c k e t y c c -n e c ta r _ s o c k e t que ’/ienen a contm ua-
c ó n ilu straran el método correcto conque se puede abrir un socket do servidor
y un program a d ie n te puede conectarse al mismo. Preste especial atención,
sin embargo, a cómo tanto c r e a r _ s o c k e t; como c o n e c ta r _ 3 o c k e t deben
asignar provisoriam ente (cast; i su e stru c tu ra de protocolo s o c k a a a r_ u n on
patrón de estru ctu ra sockaddr genérico p ara cada llam ada que se efectúa a !a
interfaz de la corresa>ndiente APL
Programación en Linux
E je m p lo s
Los siguientes program as de dem ostración. c re a r_ S O C k e t y c o n e c t a ^ •
_ s o c k e t . ilu stran las operaciones básicas cor sockets de entorno UNIX.
f JÍMPLO
1 c r e a r _ s o c k e t crea, liga, queda a la oscucha y acepta conexiones a un
aocke: de entorno UNIX.
/• Scrofcr* flel prograna en In ta rrat: r.Ksock.c */
/•
• ?r*ar_sock«t.c - Crear y lig a r .in jo c M t. Sintaxis; croar socket nOTfir» ae
¡ac<«t
•I
•Incita* <syj/»cck«f f>
*includ« <*ys/un.n»
• Lnclud* <stdliC.n>
•inelude <3tdio..'»>
•inelud* ‘ noipor.n*
s o c k l«n _ t t i n u i t o j j t r a c c ió n ;
/• 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
•x it< € X II.S U C C € S S );
>
c r e a r _ s o c k e t acepta u n único argum ento, el nombre dol s o c k e t u ser
creado. Ei program a prim ero llam a a socket a fin de crear un aocket do en
torno UNIX (definido por el argum ento PF JJNZX) orientado a aecuencias de
caracteres tal como lo estipu la el arg um en to SOCK_STREAM) y que empleara
el protocolo por defecto De*pué« de m icutltzar la estru ctu ra s t r u c _ s e r v i -
c o r , c r e a r _ s o c k e t establece la fam ilia de sockets a AFJJNIX y copia la
dirección dei aocket al miembro s u n ^ p a th de la estru c tu ra S tr u c _ $ e r v i
d o r. Luego, la llam ada a btr.d procede a asociar el descriptor do archivo
d e s c r i p t o r _ s o c k e t con el socket d escr.pto por s t r u c _ s e r v i d o r .
Obsérvese que s t r u c _ s 0 ''v t d o r fije d eclarad a como u n a e stru ctu ra de pa
trón so c k a d c r_ u n . ia e stru ctu ra requerida p ara loa sockets de entorno
UNIX. P ara prevenir eventuales advertencias del compilador, áe le asigna
tem porariam ente m ediante una operación d e casting un patrón de e s t r u c -
t u r a s o c x a d d r ( s o c k a d d r *) de modo de corresponderse con ol prototipo
de bind. Finalm ente, ia llam ada a listen señala que el servidor e stá aceptan
do conexiones a ese socket, y la llam ada a a c c e p t perm itirá indefinidamente
efectuar nuevas conexiones a dicho socket h asta que a c c e p t retom e una
condición de error o h a sta que el program a sea term inado de alguna manera.
El archiva de encabezado h e l p e r . h y su. im plem entadón, h e l p e r . c, incluyen
fundones de utilidad que emplean todos ios program as de este capitulo. Su ra
sen de ser t s ¿cortar los listados de código fuente- Tanto cre a r_ S O C k et como
c o n e c ta r _ s o c k e t utilizar. La función e r r _ q u i t , que llama a perror con el
mensaje espenficaco en a s g y luego term inan el programa. La definición rfe
e r r _ a u i t es la siguiente:
voií *rr_3vi:(chsr «asa)
{
w » »i I K y , ; .1 ) t ) ) . > ) * ) t i /
3S^ . ro&.omo^ion en u n u x
/«
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 »
•í r c l u d a ‘ iia lp e r.n *
{
i r t a«scrlptar_íoc<(4t;
irru c t íockad(Jr_un 5truc.cU*itto: /• Estructura co socket a» proceso cliente
!• 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 * ) ;
3t'*uc_clienta.3iin_fa.Tl’ y = A F jjM X ;
• 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);
S ra lpe-3aipie
I ./crearjccX e t lp«-3anpl«
Scchat disconible: lpesarole
La llam ada a b ln d fracasó porque ol sockot se encontraba en uso pero, iuego
de elim inarla, la llam ada a D in a tuvo éxito y el servidor dio paso a su lazo
infinito de aceptación de conexiones
L e c tu ra y e s c r itu r a d e u n s o c k e t d e e n to rn o U N IX
Tal como fue enmontado al comienzo del capítulo, p ara leer y escribir en soc-
kets uno puede u tilizar llam adas a sistem a e stán d a r d<* E/S El procedim ien
to es directo. El proceao que llam a a nccept utiliza el descriptor de archivo
que retom a a c c e p t para E/S. Lo» procesos que llam an a c o n n e c t, g en eral
m ente procesos cliente:», u tilizan p ara P7S el descriptor do archivo retom ado
por la llam ada a s o c k e t.
¡J » E je m p lo
£¡f Este ejemplo m u estra una m anera do leer y escribir sockets de entorno
UNIX. Dicho de m anera sucinta, el proceso quo escribe copia su e n tra d a es
tá n d a r a un socket. m ientras quo el proceso que leu copia los datos leídos
df-.‘xle el socket a su en tra d a estándar. e s c r i b i r _ s o c k e t es el proceso que
ascnbe, o cliente, y L e e r_ s o c k e t es el proceso lector, o servidor. P ara lograr
que el código resulte algo m ás simple y sencillo de seguir, he L p e r. c define-
una función, xf er_data (transferir datos), que* copia datos e n tre los dos
descriptores de archivo. La mism a se e n cu en tra declarada er. el archivo local
de encabezado nelper.h. La definición de xferjJata es la siguiente:
voia <fer_3ataiint srcfd, :nt tgtíd)
i
:nar sur[102*1;
int COnt, ien;
Programación de T C P / IP
T C P/IP es eí protocolo (en realidad, !a fa m ilia de protocolos) que opera ia In
tern et, la m ayor red de com putadoras interconoctadas del m undo. L a ver
sión actual de este protocolo es !a 4 ÍIPv4), pero ya h a comenzado la tra n si
ción a ia versión 6 (TPv6). Laa especificaciones existentes en las prep u estas
actuales p a ra CPv$ h a n sido in teg rad as en loa keraeJs de Linux de la versión
2.2.a. Dado que el nuevo protocolo no está aún muy extendido, sin embargo,
e sta sección cubre cu su lugar IPv4. Como 30 destacó al comienzo de este ca
pitulo, la program ación para redea os u n tom a im portante sobre el cual han
sido escritos m ultitu d de libros. Sin embargo, uno puede de hecho red actar
program as con prestaciones de red utilizando menos de 10 funciones.
N ú m e ro s d e red
Entes de sumergimos en la programación de redes en sí misma, resulta im
portante .ieilahr quo ei protocolo TCP/fP os de tipo b ig ^n d ia n ; es decir, al
macena el bit más significativo do tos números multibyte en la dirección de
memoria más baja. Muchos computadoras aon también do tipo big-endian.
Sin embargo otras computadoras, tales como las que utilizan procesadores In
tel x86. ion de tipo little-endian, lo que quiere decir que en los núm eros mul
tibyte el quo se almacena en la dirección de memoria m ás baja es el byto me
nos significativo (el térm ino general p ara indicar la disposición do valorea en
memoria es orden íAt bytes). La implicancia de esto es que cuando so ingresan
valorea numéricos u las funciones de TCP/IP» las mismas deben se r convertidas
desde su orden do bytes del servidor :d orden de bytes im perante en la red.
A fortunadam ente, la im plem entación do este protocolo incluye cu atro fun
ciones quo realizan precisam ente esto. Las m ism as se encuentran declara
das na <netinet/in.h> de la sig u ien te m anera:
•jnatflfud lonc ü i: ntonlíunsicnod Icng in t hostlong);
unsignea shor: :nt ntonfl(ur.Bignsd short in t rum soart);
unstgnod lang in t ntofilfunuionad Lona in t ivoticngj:
u u ig n M *nor; int ntcfls(ursigniid snort u it r.etsnort);
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? */
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
Mosn wosra
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 ; */
u n u m iv o id l
(
in t 3# *crio *o < _ w c« < * f:
s tr -jc t * o e **M r_ trt i : r v c _ u r v l 3 e r ; . • E s t r y c r . r j 3» soc««t «1*1 s o r / ic a r •'
» o c k l*o _ t :»aa/io_a;r*ccio < *: * ;sa 4 i*3 a e i n;w »ero s c o a a o r ae estru ctu ra
*Trwc_$»n»i03r 'I
w t j * t ¡ (• s » r j s e is o c k o p r •/
/ • C r « ir « 1 s o « e t
i f ( (3 é S C r ip t o r _ i« * * t » »C * t t{P F _ :K £ T . SCCX_STB£MI, 0)1 < 0¡
!• 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 ;
l
) ) ) ) ) ■ ■ > . 1 ) ) ) 1 > ) > > ) ) > > >
396 Programación en Linux
r L ig a r 3 l s c c x s t a ur.a d ir e c c ió n • /
ta * a n o _ d ire c c ia n - $ i 2 e < jf( s T r jc _ s e r v id o r ) ;
: ‘ ({O i« C {c !e s :r ip :o r soc'<9t, { « t r u c : sockaddr * ¡ 5 s t r j c s s r v íd o r ,
t-jn a ñ o _d iraccío n }) < 6)
« r r _ c u i t { , bLnd, J ¡
Mit!5XIT_3UCCeSS>;
>
c r o a r _ t c p i p ea sim ilar al program a c r e a r s o c k e t visto anteriorm ente
Las única,* diferencias son ol reem plazo do las llam adas y di? las estructuro»
de datos fx>r sus co ntrapartes correspondientes a sockets TCP/IP. A dviértase
que corno c r e a r _ t c p i p especifica una dirección IP do cero, el kem el asigna
u n a dirección predeterm inada. La salid a do u n a corrida de dem ostración de
•‘Ste program a se asem eja a lo siguiente,
t / c r # a r _ tc ü lp
Sflchnt íc p / ip ouoomai®
Puerto soooe
s a l io a D ir e c c ió n tP Í . 8 . 0 . Í
• C*»»r «1 «<n«t */
i f ? i e í i c - 1 3 t : r _ j s c k * t » K C k í t ( f e_:N ET , SOCXJTREAU, 0 )1 < 9)
C o n e c ta ría a l s o e k tt ‘ i
tia a r .3 _ 3 ir e c c io -' * » t í « o f ( * t * u c _ c l W i r t í l ;
l f ¡ < c r r t * : ; t 5 « i c r i c t c r _ s c c i i « t , ( s t r * jc t sacfcatídr * )& itru c _ c li< sn ta ,
t SJU>; _ ; i r í c c • on) J
«rr^w ltC cor-féC'l;
>u t» < ‘ C l l í n t a c o a c t a d o j jo c h e r » ;
íxit'.Exrr_acc£SS):
>
Además del código requerido p a ra ad m in istra r sockeu TCP/IP,
c o n e c t a r _ t c p i p . c tam bién incluya u n a nueva función, n e r r _ q u i t , defini
da en n e l p e r . c. que llam a a u n a fímción de manejo de errores especifica de
TCP/IP, n e g r o r . £ ¿ ta se comporta exactam ente igual que la función p e r r o r .
P ara ejecu tar c c n e c t a r _ t c p i p , se debe tra n sfe rir al program a en su linea
de comandos la dirección IP, en form a decim al con puntos, del servidor al
1 ) ) ) J ) > > ) ;> I
L e c tu ra y e s c r itu r a d e s o c k e t s T C P / I P
Leer y escribir sockets TCP/IP es exactamente lo mismo que leer y escribir soc-
kets ce entorno UNIX. Una vez más, la concepción de Linux de tra ta r a todo dis
positivo como un archivo resulta se r una bendición- Un p ar de sencillas modifi
caciones a w rsock y ra s o c k «"programas presentes en el sitio Internet de este
libro), listadas en el siguiente ejemplo, m uestran lo sencillo que es realizar esto.
E je m p lo
/• Noicra sol prograna en In te n u t: rOr.Bt.c •/
r
, J CMo, 0 • la?__tcp íp.c - Crear y lija rs e a úr> socket TCP/I?. y luego leer dei «isno
*/
Capítulo 18: Programación de TC P /IP y Sockots 399
jn : ft«j.i|voxai
<
tnt í w c ' i p « f . » o r t « , :«5crt:toi*Ar<niva04:o8; /• c « c r i a t c re» a« ípp.Hivo
« lo s •/ ~
it r u c H m d o r , i* £ jtru c tu ra t»
ío c ««! <S*1 » « r v iíc r “ v
»oc*l*n..t t»M<,'o_air*cclOft; f" TjnaOo d*
*tn*c.»«rvtdor •/
;• C r t ir 3#i socm: V
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);
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 ) ) ;
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 *
<
iftt do«rlpcor_iockoc;
• t n j e t « jc k a a a r en s tr u c c l iu n t o ; r E s t r u c t u r a 00 tockot 3 « 1
V
jcoflun_t tartaftojliroscion; /• Tanate d® ítn :c _c !i«n to 'I
r 3# aguarda cano arguim.ico ao la linea Co cwmnaoj la uireccion IP •/
if(arge l« 2 ) {
p u is r u o o o DE £UPLECr « s c r i b i r j i c p i p < tíiro c cio n Í P > ') ;
w l?(E X IT _F A :'.U ftE |¡
>
/ • C re a r un s c c x e t •/
l f ! {d#scripror_joc>tot = sock«t(PF_IMEri 50CKJ1REAW, 0|| < 8)
e rrjs u iti's u c K e t* );
•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.
E m p le o d e h o s t n a m e s
H asta ahora, toda la exposidón se h a concentrado en la utilización de direc
ciones IP. E sto h a sido correcto porque la s com putadoras operan ta n eficien
tem ente con los valores num éricos como lo hacen con la información de te x
to. No ocurre lo nnsm o con los ¿eres hum anos, que prefieren las cad en as de
J t ) ) J ) >
402 P ro g ra m a c ió n e n U nux
";L"n momento!'’ , lo escucho pensar. “¿Qué m e quiere decir con esu de -todos
los nom bres y direcciones IP que un servidor pueda tener?»” Dicho de m ane
ra sim ple, el DNS no es un mapeo biunivoco e n tre nom bres de servidores y
direcciones IP. E xisten m uchas razones por las cuales un servidor puede te
ner m últiples direcciones IP o m últiples nom bres de servidor. E n el caso de-
m últiples direcciones F?. consideremos un ru tead o r o encam inador (router),
-m sistem a que incluye v arias tarjetas de red. C ada ta rje ta de red tiene una
i
Capitulo 13: Programación de TCP/IP y Sockets 403
E je m p lo
El «iguiente program a de demontrución, h o s t _ : n f O. ucopt.i un ¿orinante
como argum ento en su línea de comandos y exhibo ol contenido do lu corres
pondiente estru ctu ra de patrón n o s t e n t .
/ • n o ce?» C*1 a r o $ r * 3 i «n Xftt«TA*t: ft c it l r t f o .c •/ »
/•
* *5$t.info.c - vuestra #i centtoiao 3« .* «itructur* 4* pitron hoottnt par»
• iír v t s o - provista par *: usw rie S i r t m s : ro s tjn ro noocr* <j« servidor
*/
tm c lv u <sys;soc««:.n»
«írtcioe* <A*ti/*t/&r.n>
• in c lu í* « arp a /ln ít.n »
•i.'sclucs <n»’C8 h>
UrtCluCi <«3113.ft»
♦ incluí* <s:aio.h>
nneluoe Tií¡o e r v
)
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 »
>
e m < E X ir_ S C C C E S S );
S A L ID A A lia s : Nuiguro
; ) ' y > y ) .1 ) ) ) r ) j ) ) y j ; ; > ; ; /
Caoftulc 1 3 : P ro g ra m a c ió n d e T C P /IP y S o c k o ts 405
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
Lo que viene
Esto capitulo le brindó ol lector u a breve recorrido por la programación de soc
kets y de TCP/IP Completa asim ism o la cobertura que efectúa este libro de
las comunicaciones inu-rprocosos. L a próxima 3ección, U tilid ad e s de Progra-
mac’.'jn en Linux". le presentará v a n a s h erram ientas y utilidado» que facili
tar. algunas de las tareas de u n programador. La miatna comienza Con él capi
tulo 19. "Seguimiento de cambios en código*) fuente: el sistem a de control de
revisiones*, que !*.• ensenara cómo u tilizar RCS. el Sistom a de control de revi
siones. RCS es una h erram ienta que autom atiza la mayoría do las tareas aso
ciadas con ei seguimiento do las modificaciones realizadas a los códigos fuente
de los program as. 0Para qué '-o debe* efectuar el seguimiento do Ins modifica
ciones do los códigos fuente de los program as? ¡Continuó leyendo y lo vorál
) j ■ .i ) » ; / j f i i t >
Parte V
2 0 . U n to o lk ít d e d e p u r a c ió n
2 1 . D is trib u c ió n d e s o f tw a r e
2 2 . P r o y e c t o d e p ro g r a m a c ió n : u n a b a s e de d a t o s d e C D d e m ú s ic a
> ) ) ) ) ’/ ' > ) > . ) ■ 1 ) ) ) ) ) ) ) ) ) )
( 1 S
Seguimientos de cambios en e
código fuente: El RCS o Sisteiru
de Control de Revisiones
El control de versión es u n proceso que p erm ite m an ten er el seguim iento de
los archivos do código fúento y llevar en un registro adecuado las modifica
ciones que se les van haciendo ¿P ara quó m olestarse on hacer eso1!* Porque
algún día uno realizará esa edición fata l a un archivo de código fuente, eli
m in ará au anseceaor y o lv id ará cualas fuoron exactam onte las líneas do ¿ódi
go que pretendió modificar. Porque ten e r que efectuar m anualm ente ol ae-
guim icnto do la versión c o m e n te de u n program a, de la próxim a versión y
le los ocho errores que fueron corregidos puede llegar a convertirso on alijo
dem asiado tedioso y proclive a errores. Porque ten e r que buscar frenética
m ente la copia de seguridad e n cu ita después de quo alguno de su s cologas
sobrescribió por q u in ta voz un archivo do código fuente puede hacerlo come
te r u n disp arate. Porquo. a lg ú n día. m ien tras tom a ol café de la tnaúanu, so
en co n traré diciéndose a sí mismo: “Control do versiones, e sa es la Cosa Co
rrecta que Hay que H acer- .
E ste capítulo analiza el m étodo RCS, «jI Revisión Control System , u n a solu
ción h ab itu al al problema del control de versiones. RCS es u n a solución co
m ún porque se halla disponible en casi todos loa sistem as UNIX, no sola
m ente en Linux. RCS e stá m anten id o por el proyecto GNU. Dos alLurnativaj
a RCS la constituyen CVS. o Concurrent Versión System , tam bién m antenidi
por el proyecto GNU. y SCCS, S o urce Code Control System , quo os un pro
ducto patentado.
E ste capitulo cubre los sig u ien tes tem as:
• Terminología relativa al control de versiones
• Creación de un depósito de reposición de código fuente
• Verificación de archivos q u e e n tra n y salen de ese repositorio
• P alab ras reserv ad as de RCS y el comando ident
• Modificación de los reg istro s de RCS
• Comandos y utilidades adicionales de RCS
, Tbdos los program as de este capitulo pueden se r encontrados en el sitio Web
n t t p : ,'w*rt*«.mcp.com/info bajo ol núm ero de ISBN 0789722151.
Programación on Linux
NOTA
Los s í t o c s so n i? Z90* jc ares-ocreo que * «cay v í encuentre «npJearKJo
e¡ RCS 5.” ?ara qué .«ratón ae RCS se está ’-flitzando. 5pee re s -V.
El RCS puede ser utilizado con más archivos que ios de código fuente, sin em
bargo El mismo e* capas de efectuar seguim ientos de cambios on cuolquier ti
po de archivo de texto, como por ejemplo e n informes, capítulos do libros o có
digo de hipertexto HTML. No puede ad m inistrar, sin embargo, archivos
bin n ro e CVS. el C oncunrnte Venum Sy*fem. puede operar tambión con a r
chivos binarios, razón por la qu« mucha gente em plea CVS en lugnr do RCS.
C O N S E JO
£ c c - - :c " - 3 — preGete#-— -■>30 oe RCS es u f j . iar 'eD G S ¡* .cr.o en caca tfrectorto
se 1*30^0. ri'.c n>su*:a s._-c:e.r.3 sara proyectos sccuci’wm. Lo araarior
Í U . 2 '- 5 z~ - v - ' í : ;= RCS: no fafriHB e :niC^O con ac..setos que tienen
o ro s Srectorics in tracto. E'~- otra rezar- aor ¡a -rucha gente prefiera CVS.
D espués de que h ay a sido creado eí repositorio RCS, el paso siguiente es in
g resar al mismo todos los archivos existentes de código fuente. La p rim era
ve 2 que el lector ingresa ur. archivo determ inado, RCS solicita u n a descrip
ción del archivo, io copia a] directorio RCS y elim ina el archivo original.
"¿Elim ina el original? ¡Giup!”, d irá el lector. No se preocupe, uno puede recu
perarlo con e; comando de recuperación, c o . Pero vayamos p.-.so a paso. El
ejemplo siguiente crea un repositorio, u n archivo de código fuente p ara g u a r
dar en él, y luego em plea c í p ara inscribir dicho archivo,
E je m p lo
Prim ero, creamos u n directorio RCS, tal como se indica a continuación
_________ S akdir RCS
EJEMPLO
Después, creamos el archivo de código fuente, n i f u e n t e . C . en el m iá m o di
rectorio «n ol cual ge creó ol directorio RCS.
/•
* StdS /• ver *.»3laar3s reservadas de SCS*. en usté capitulo V
•^oifusnto.c - Arcnivc a rb itra rio do codiijo Cuento pura d « W ítr a r e l eoaleo «Jo
RCS
•t
Unclude <si(Jio.h>
int awin(void)
<
p rin tfC E ít.» « 1 unu ju iu U c io n do drcnivo de eodlgo fuente'),
r«curn €XITJU0C£SS;
>
i n i t i a i ravision: t .1
done
S co l aituente.c
RC3/nifuente.c,v -> aífi¿an?e.c
'e v m o n t.1 ( I o c Km i
done
Capituio 19: Seguimientos de cambios en el código fuente 413
Obsérvese que si r.o se utiliza La opción • 1 de co, el archivo RCS que se recupera
ea forma de archivo norm al es de sólo lectura; si se lo desea editar, se lo debe blo
q u ear P ara hacer e r x último, utilice con CO la opeen • 1 (co - I m if a s ó t e . c),
-1 significa bloquear ilock). El concepto de bloqueo de archivo se halla definido
en la tabla 19.1. Finalmente, ¡as dos líneas de La salida precedidas de » son lí
neas que uno debe tipear
R e a liz a c ió n d e c a m b io s a a r c h iv o s d e re p o s ic ió n
P a ra v er el control de versiones en acción, efectúe u n a modificación al a rc h i
vo funcional. Si aú n no lo h a hecho, ex traiga el archivo RCS del repositorio y
bloquéelo (CO -1 ^ i ^ j e n t 9 . C). Modifique todo lo que desee, aunque yo re
comiendo p ara ello agregar \n al final do la cad en a que constituye el a rg u
m ento de príntf, porque tan to L inux como UNIX, a diferencia de DOS y
Windows, no añaden autom áticam ente u n carácter de nueva línea al final de
la salid a de consola.
Luego, vuelva a in g resar ei archivo modificado al repositorio. C uando lo h a
ga. RCS llevará a cabo las siguientes acciones:
1 In crem en tar el núm ero de la revisión. Uov&ndolo a 1.2
2. P edir u n a descripción de los cam bios que se h an efectuado
3 Incorporar loa cambio* que se h an efectuado al archivo RCS
4 (De m anera m olesta) e lim in ar el original
P ara «vitar la eliminación de sus archivos funcionales d u ran te las odoracio
nes de ingreso al repositorio, utilice ju n ta m en te con c i las opciomis - l o -u.
E je m p lo
E ste ejemplo Ueva a cabo la modificación sugerida en el párrafo a n terio r y
luego actualiza el archivo de repositorio,
s : i - 1 a ifu ta tt.c
ttS la if tunta. e,v < - a tfu w tt.c
r.tm ' M i i o a . 1 .2 ; p r e v lO u * r a v lS iC O : 1 1
O p c io n e s a d ic io n a le s d e lín e a d e c o m a n d o s
Adem ás de -1 y u. c i y co aceptan o tras dos opciones m uy útiles: - f (por
amisión) y • f (por fnrce [obligar]). La opción - r ge u tiliza p ara indicarle a
RCS cuál es la revisión del archivo que se desea m anipular. RCS presupone
quo uno desea tra b a ja r con la revisión m ás reciente: - r deja s:n efecto esa
opción predeterm inada. La opcion • f obliga a RCS a sobrescribir el archivo
norm a: corriente. De m anera predeterm inada. RCS aborta una operación de
ingreso de archivo a su directorio si ya existe un archivo norm al del mismo
nombre en el correspondiente directorio de trabajo. Do modo que, r,i real
m ente desea liquidar 3U archivo norm al, utilico con Co la opción • f p a ra po
der com enzar de nuevo desdo el principio.
Las opciones de línea do comandos do RCS son acum ulativas, tal como era
dnblc de esperar, y el program a se comporta muy eficientem ente en desh ab i
tu a r ias opciones quo soan incompatibles. P a ra e x traer y bloquear u n a revi
sión determ inado de m if u e n te .C , se u tilizaría un comando sim ilar a
co L - r 2 ." r a i f u e n t e . c . A nálogam ente, c i -u -r3 m i f u e n t e . c in
gresa m if u e n te • C. lo asigna ol número da revisión 3 .1 y deposita er. el di
rectorio corriente de trabajo una rovistón 3.1 do sólo lectura del archivo p re
viam ente ingresado al repositorio RCS.
»i< E je m p lo s
Sj 3iS y l Ente ejemplo crea la revisión 2.1 de m i f u d n t a . c Afwgúreao, a n te s de eje
c a ta r este comando, de h ab er extraído previam ente m if u e n t e . c del reposi-
e k m ih o torio y de haberlo modificado de alguna m anera
i ci -r2 nif-jenttt.e
<- rtífuanta.e
(¿g v i ' r*" •'avuio.'i 2.1; prevloi¡9 revlJiOfl: t.2
^ eoter iog m sag#, t«tntirac#a vrith single or ena of rile:
sau d a y> 59 aootfico algo
» •
dora
S.’ SMP'.O
Caoítüíc 19: Seguimientos de cambios on el código fuente 415
: :o -f nt't^ííte.c
RCSíaifaeBíe.c,* —> utfaente.c
rev isió n 2.1 ( lcck*31
iO A
<¿9*2
C u aca o lo em plea j un tam en te con c i . - f obliga a RCS a ingresar un a r
chivo al repositorio au n cuando é ste no h ubiese sido modificado.
S ld S
E sa peculiar cadena ubicada al comienzo del listado de s iic a d e n a . c . $ íd $ ,
es una palabra clave de RCS. La p rim era vez que uno extraiga m ic a d e n a . c
del repositono. RCS la expandirá a algo sim ilar a lo siguiente.
Sis: a :c * s « u .:,v i9OT.'«r/2í |«;56.W h u r t jm ll G*p <urt_«all $
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
•/
íin c lu o e < $ :d :o .ti>
ú 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*>¡
}
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.
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
El c o m a n d o i d e n t
E'. comando i d e n t localiza p a lab ras clave de RCS ?n archivos de todo tipo y
las exhibe S t d o u t . en. E sta prestación de RCS le perm ite a uno dotormi-
nar qué revisiones de cuáles m ódulos e stá n .hiendo u sad as e n u n a versión
determ inada del program a- i d e n t opera extrayendo cadenas de la forma
SPALA8RA_RESERVADA: VALOR S d esde archivos fuente, objeto y binarios.
Funciona aun con archivos de d a to s binarios sin procesar y volcados de m e
m oria. De hecho, y dado que i d e n t busca en un archivo cada in stancia que
responda al patró n $PALA8RA_RESERVA0A:VALOR $, se pueden em plear
tam bién p alab ras que no sean p alab ras reservadas do RCS.
Esto lo perm ite al loctor incluir en su s program as información adicional tal co
mo, por ejemplo, el nombre do una em presa Esta información nsí incluida pue
de resu ltar una herram ienta valiosa para circunscribir problemas a un módulo
«•pacífico do código. £1 aspecto atractivo do e sta prest RCS actuali
za lus cadenas de identificación autom áticam ente, lo cual constituye un real
beneñeo tanto para programadores como para gerentes de proyecto.
,3 E je m p lo
V* ‘-r'F P ara ilu stra r el empleo de i d e n t d-eoeremos cre ar prim ero el siguiente ar-
Z ^l chivo de código fuente, ingresarlo a l repositorio (utilizando p ara ello la op-
cjc m piq ción -u). compilarlo y hnkeario. h ac e r caso omiso de la advertencia que se
puede llegar a recibir por p a rte del com pilador aobre que el arreglo rcs_i<3
se e n cu en tra definido pero no utilizado, y luego correr el comando i d e n t so
bre el archivo resultante.
/ • * e a o '« « I t r c a i v o in t e r n e t : p m c flv .e • /
/•
• SI3S
• x a p r i a i r _ a o T x n o . c - S x h i& ir io s « a lo r e s 3a l a s v a r i a s l a s da a n ta-n o .
•
« ta e ltid * < s :e to .n >
« tn c lu flí < s t a lio .n >
iv.chjct «yfuta.h*
a t s t i c e r a r r c s _ i a ( l * ’ SX cStn*;
in t m a in (» 3 i3 1
<
c rta m z t ir ••« n o m o ;
'I 1
418 P ro g ra m a c ió n e n Linux
Empleo de resdiff
S» el lector necesita ver las diferoncius entro au archivo modificado y su contra
parte virginul ubicada en el repositorio RCS. deberíí em plear el comando r e s •
( J i f f . Esto comando compara diversas revisiones de u n mismo archivo. En su
forma m ás simple, r c s d l f f n o m b re _ d e _ a rc m v o , r c s d l f f compara la ú l
tim a revisión de n o m o re_ d 8 _ arch iv o presente en el repositorio con lu copia
en uso de dicho archivo. Utilizando adem as la opción - r tino puede comparar
versiones específicas. El formato general p ara la comparación entre «i de revi
siones específicas de un archivo por medio do r c s d l f f es el siguiente:
rc s d lff | ra rc h iv o i[ - r a r c n i v o í ] | n o * firB _de_arctu v o
CONSEJO
£1 cojanco d i ' f ( J ) as mueno més potente y gcnoraliz^do que r c s a if r . Esto últirro
está concebido aoo oara ser utilizado con RCS. SI el lector necesita corparar oes o
tra s arcflluoa ce texto entre si. utilice ¿i comanoo d i f f .
E je m p lo s
1. P ara analizar el empleo básico de r c s d l f f , considérenlo» el program a de
_______ dem ostración recién comentado im p r i m i r _ e n to r n o . c. E xtraiga del reposi-
c u m p l o torio RCS u n a versión bloqueada del m ism o y elim ine del listado el buffer
estático r c s _ i a . E l resultado debería ser m uy sim ilar al siguiente listado:
!•
' S Io : ix fl< -M Ír_ e n to rn o .c ,v 1 . 1 i9 9 $ /0 ? /2 2 95 :22 :'-2 K u r t j M l i Exa k a r t j w a l l S
' i o o r i íir _ 6 " t o r r .o .c - E x m a ir lo s v a lo r e s do i a s v a n a o l e s co antorn c.
•I
Caoítuto 19: Seguimientos do cambios on el código fu e n te 419
*:.->c 1üSí
#irtclud« «sMlib.a»
♦inciuO» <v«í$td.ft>
mt *am voidi
<
t * í * r - «fia r • • « n ío m o ;
cn r "Bi_»ctorno •
c rm tffs n p * ,
r t a r r e x jr .s m s s :
>
* ‘CtCi** uc-uu»-_*ntorro.c
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 \
5d3
< 3T3*IC C ía - "C 3 ; i [ | ■=■ 'S I C : i n p n s i í r a n t c r - .o .c .v 1 . 1 l9 5 5 .'« 7 / 2 2 0 5 : 5 7 : 5 3 k u “ -
_<*3il £xp S ’.n ’ ;
:7air
<
> 3 l9 s p ( 5 l ;
> »U*p(51¡
E m p le o d e r e s e l e a n
El comando reselean hace exactam ente lo que sugiere su nom bre: prolija
loa archivos adm inistrado» por RCS. S u .sintaxis básica es r e s c i e a n
( o p c io n e s ! [archivo . . . ]. U n comando reselean al que no le siga
ningún argum ento elim inará todos los archivos de uso corriente que no h a
yan sido modificados desde que fueron extraídos. La opción -u le indica a
reselean que desbloquee todos los archivos que se encuentren bloqueados
y elim ine todos ios archivos de uso c o m e n te que no h ayan sido modificados.
Uno puede disponer la elim inación de u n a revisión especifica em pleando el
formato - rM.N, dor.de M es el núm ero m ayor y N el número m enor de la
revisión. Por ejemplo, ei siguiente comando elim ina !a revisión 2.3 de
foobar. c:
3 r c s c is a .T ro.3 f o o & a r .c
C a s':- O 19: Seguimientos do cambios en el código fuente 421
3 \: / E je m p lo
I.ItÍÜ l) El com ande sig u ien te elim ina u n a revisión no bloqueada y no m odificada de
;-=l i E p r i B i r _ e n t o r n o . c:
5 CO -u - r l . t ^ = r r i3 i- _ ír : o " c .c
SCS iafria:r_*ftt«rt*c.c ¿fl0 "¿ a ir_ e r:c m 0 .c
■i'isiC!* ’ : _~.:c<ec)
OSOS
S A L IO *
S rcseican - r r . t icpí-t*tr_entorno.C
rs •? l* C ítilf_ W tO M O .C
E m p le o d e r l o g
r i c g im prim e los m ensajes registrados y o tra can tid ad de información sobre
los archivos alm acenados en el repositorio RCS La opción • R le indica a
r l o g quo exhiba solam ente nom bres ¿e archivos P a ra v er una lista do to
dos les archivos presentes en el repositorio. por ejemplo, el comando ad ecu a
do será r l o g -R RCS/* (por aupue3to, uno puedo tam bién tip e a r 13 -1
RCS'. Si el lector desea v er u n a lista que contenga únicam ente los archivos
que se en cu en tran bloqueados, d eb erá u tiiira r ia opción -L. P ara ver la in
formación de registro de todos los archivos bloqueados por el usuario deno
m inado Pedro, utilice la o p aó n • 1.
E je m p lo
1' ± J Este ejem plo exhibe toda la inform ación registrada para toda* las revisiones
de im D r u ii r _ e n to r n o .c :
c u m p lo s r lo g j j 0.- L s L r_ # n t c r n o .e
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
E je m p lo
E ste ejemplo utiliza res par3 modificar el m ensaje colocado en im p rim í •
r _ e n t o r n o . C cuando se ingresó al repositorio RCS su revisión 1.2:
■ i£ M P ío 5 res - n . 2 :*£iini^ado ouf^er astático 'rc $ _ W H '* ¿ricriair^entorno.-:
ne«s: 1-3
brancn:
¿ocks: W ic t
acíssi L i s t :
syaboüe
fcfyvor* íwcjtitutlan: o
total revisión». 3. stltc ttd '••rlSions. i
Mtcriflttoo;
r*»Uion t.2
cata: 1999/IT/2# W :H :fat- autAor: k u rtjra ll; ita ta: €xp; Unas: »i 2
ELiairaco fru tar tita tico
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
PRECAUCIÓN
V> f8T W v3 Ge s u s 3rr>.vos ¡a ;rr‘0 '~ 3 5 ú r Ce ceouracific a r ta s d e d i s t r i t
o s ** forma t*r.y:3- 3e trata d« cuestión de c ó m ala con k.-s usuarios y hasta lo
O ,-*» 3>ví-y = u sted Si rec&e un r tv -m ; $obr» ia pres-inde oe ur. arror on p| programo
X f s o n é c e u r u sv a ro c w re c íro s**> ef artíwvo ejecutarte final, c.’cno usufirio ns esta-
r3 e n cc^í-co-'C S a e oto * q < '« irftym^dflo C ü s> u s » : «fim'nó <Jc y j programa : « 0 3 '05
¿ - Í 3CM35 r>*cesar.cs a IV a e hao w s¿ cc*responc«r'.e arcWva b inara rrtás C0ir<aca>.
E je m p lo
E ste capítulo u tilira en varioa de su s ejemplos el siguiente programa:
/ • «íoter* : f l ¡rro jrjiu «n Í n t í m i t : sa rj_á8p«rar.c V
/•
• p j r i j a ts - jr tr .c • * r^ g rjsj TJ. «frertto ¡a ra u t l i i u r cono «j*tolo U díDurucior
•f
•InclwM <*:aia.íi»
•inclact < itc l;5 .r>
» C « » m o % U U £A O j0U N Q € 5 0 W
>
«013 lu ft*_y_aisteri8(m t «yr{ j )
{
int i;
fo r(t * •; i < Wj»íL90_3ftAAC£; —1|
s * r(x l • i;
i
Yo compilé este program a y craté de correrlo, tal como se m uestra a conti
nuación:
S gee -5 ^ 4r i _ 3e s u r jr .c -o para_d«p«rar
S J s¿r=_5ic^*ir
Segoeitarirc *».!: ,ccr* ij«eM
L a salid a puede v ariar ligeram ente en el sistem a del lector.
C o m a n d o s b á s ic o s
L a m ayoría lo que se desea obtener con gdb puede ser efectuado cor. un
conjunto de comandos sorprandentem ence pequeño.
) ) ) ) ) ) ) ) >
) ) ) ) } } ) ) ) y
) ) -2 8 f-.ogrdmacion en Linux
in ic i o d e gdb
P ara iniciar u n a sesión de depuración, sim plem ente *ipee gdb r,o¡nbre_de-
_prcgra,i?a ( a r c h iv o _ d e _ v u e ic o _ d e _ ¡? e n o r¿ a l, reem plazando n c í b r e -
_ d e _ p ro g ra ffa por el nombre dei program a que desea depurar. La utilización
de u n archivo de vuelco de m em oria es opcional pero reforzará la capacidad de
depuración de gdb. El prim er paso entonces es iniciar g d b , em pleando como
argum entos p a r a j j e p u r a r y el archivo de memoria, vuelcom en. P ara te r
m inar gdb, doee q u i t en su linea de comandos, que es (gdb).
3 -o saraj}#purar vuelcos**
La p a n talla deberá parecerse, u n a vez iniciado g d b , a la de la figura 20-1
:\r — -^ 1
***** rr^m «1sV¡iW f«.1...9WM,
'•T'OX —»*,-• - v * uV f,„» i
CONSEJO
S se "■?. o-visco céreo 3= sscr.K sfgúi remarco Ce y<3Ü o -o s e srcuentra s e g u ro ae
3j 3 - x i : ; colecta. acócuenta cctf una axcsif.ts ayude- Un sim escomandohelp *j-
ocíos t? 3 “neo ce comarcca da gdb 5 brindara una brevo sta Ce as cistíneas cáte
l a s as comandos crsoecíbies. mientras Que n e ip (tema) imprimirá ayuda •jíii sobre
ese :c~a. ce cost-.-ofe. gac c-enta con un comc-'eto sistema -ce ayuda, a dccu-
-<í*.ío5í- TeXirfo. y etcs erte manual. Detnjgging mlh >08. aue so encuentra dispo-
nóte en .'rea y x r co-rco sotícitSroola a r3P.
E je m p lo
C uando uno tr a ta de currer este p ro g ram a on el depurador, el miamo se de-
tiene tra s recibir la señal SIGSEGV:
E iC M P tO
(J«3I njn
S ta rtln g p r e g r » . •jsr/lcc*l.,(W CroJ*ets/Í3«/2»/«rc/para_iJeoi;rBr
igcoi
INSPECTINQ CODE
La cuestión, pues, es qué ha estad o ocurriendo con la fundón L una_y_m is •
t e r j . 0 . Uno puede ejecutar el com ando b a c k t r a c c (rastrear hacia atrás) a
fin de g en e ra r el Arbol de la función que condujo u la falla do segm entación.
Tam bién re su lta práctico ten er a lg u n a idea del contexto en el cual existen
las iineas de código que causaron -ol problema. A esto propósito utilice el co
m ando l i S t . que cieñe la forma general l i s t [in, n J . Los valorea B>y n re
presen tan los núm eros de linea inicial y final que se desea aean exhibidos.
Un comando l i s t sin ningún a d itam en to exhibirá las 10 lín eas de código
circundante.
E je m p lo
La sucesxva de los comandos to a c k tra c e y l i s t dene el .siguiente aspecto;
(ffw > s i ' t ' . r a *
ejemplo iic n n z a n i . - j _ / _ o : 5 t « r i o (su.-*-#xo?fff8c$) n cara_d«purar.i;:24
i ’ ó im a r ifl w t n () a r p a r a j * t p « i r » r . c M 6
n **° **" 77 {l
JgcKil t u :
JAUOA T9
24 vdC tunajr_ B is :»rL a i m i sur[JI
2t {
22 ¿nt í;
ti f s r.i - í ; i <Jt*£flO_GflA.HO€; — i )
.) ) ) ) ) >
4 30 Programación on Linux
2* jy r f il * l;
23
C O N S E JO
Cuarto se tmctoa el gdt> .•*>resulta necesario lioea*’ los nombres complotos ce :os co
mandos Ci-alq\j-«r afcroviatJjra quo r#su¡te inequívoco bastara. Por ojomplo. Back <?s
suficiente *n lugar de OacVc tra c e ,
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
La notación e n tre corchetes indica que uno quiere com enzar a im prim ir des
de ese elem ento específico y no desde el comienzo del arreglo.
S i s e u t i l i z a e l comando .v h a tis (qué es), gGO puede tam bién indi
car los tipos de variables presentes. U na de la s -imitaciones del comando
c h a t i s es que sólo brinda el ripo de una variable o función. Si uno desea en
cambio la definición de u n a e stru ctu ra, debe u tilizar el comando o ty p e .
E je m p lo
E l ejemplo siguiente m uestra una serie de comandos p r i n t consecutivos y
sus resultados:
= J £ V (>V0
CaOfluíO 20: Un todWt d© depuración 431
:? » ) ei-int i
J!
igtf&l ;rirt «jrriJ
£v.f>s: K t t u « « o -/ i t n :í» N ?N
¡ 500; p r i n t t^ * [¿ 5|
12 • *S¿
C f l» ) P ' i n t S ' -1
53 • *53
Í S « Í o r if lt in r i'. 9
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 •>
CONSEJO
HaoituaJnerte es ccmotladq ser compatfbilidad cc.- ’a biblioteca res-meé ce GNU
le que significa que acepta la edición desde línea ce comandos y las prestaciones ce
.•listona! ce a interfaz Dash. ^or c;emolc. para invocar un nuevo comarco, utilice la te
da cursor arrifca cara acorrer todo el histc.,;al de comandos de 'a sesión. Oe manera si-
rrillar a ;o que ftace el comarco cos>.sy ce DOS.
• Ctrt+A deso'a» c> cursor hasta el comienzo de a linea comente.
• Ctrt+D elimina el carácter situado sotiro ei cursor
• Ctn+t desc<a:a el cursor hasta el final de la Jnea cómeme.
• -Ctrl-*-K elimina todo lo que se encuentre aove la uní-sación corriente ae: cursor >
el flnaí Ce ’a linea.
Para obtener más detalles sobre la ecicíón desoe la linea do comandos, ver ‘a página
reaüíine del manya/.
S e t t in g B r e a k p o in t s
C uando se d epura un program a que p resen ta problemas, a menudo resu lta
útil d e te n e r la ejecución del mismo en algún momento, gdb le perm ite i uno
establecer p a ra d a s o puntos de detención (breakpointx) en diversos tipos de
construcciones de código, incluyendo núm eros de línea y nom bres de funcio
ne.-}. Uno puede tam bién establecer p arados condicionales, donde el progra
ma se dettune sóio cuando 8e cumplo d eterm in ad a condición.
P ara lijar ur; punto dn detención fin un núm ero de línea, utilice la siguiente
sintaxis:
Igdbl oreak nunoro_Uno«
P ara estnblocer u n a parada en u n u función, em plee esto otra:
(gdb) orjak íic<iibro_a#J,ur.cton
gdb d eten d rá la ejecución del program a de forma inm ediata an tes de ejecu
ta r la línea especificada o in g resar a la función requerida. Uno puede e n to n
ces u tilizar print para exhibir, por ejemplo, lo» valores de las variables, o
em plear L is t para exam inar ol código que está por aer ejecutado. Si el lee
to r tiene entro manos un proyecto m ultiarchivo y desea detener la ejecución
en una línea determ inada del program a o en una función que no se encuen
tra en e! código fuente que se e n cu en tra corrientem ente abierto, utilice una
de las siguientes formas:
($36) break rcnnrejo ^rcnv/o rnu nu ro jleJinea
|gdb| or»ak 'iooDro_de_.irchtvo:i’.onbro_«le_fiiiicion
Las p arad as condicionales son a m enudo m ás útiles. Le perm iten a uno de
ten e r tem porariam ente la ejecución dei program a cuando se encuentra
determ inada condición. La síntesis correcta p ara el establecim iento de p u n
tes de interrupción condicionales es la siguiente:
(gíüj brtak nu<ie."0_je_linea ar nc<iüro_Ja_funcion i f «p re sió n
e x p r e s ió n puede ser cualquier expresión que evalúe a VERDADERO co cero)
P ara proseguir la ejecución después de a rrib a r a u n punco de detención, ü-
pee c o n tin u é .
Si h a establecido varios puntos de detención y ha perdido la pista de lo que
fue establecido y cuáles puntos de detención ya fueron alcanzados, puede re
frescar su m em oria utilizando el comando i n f o b r e a k p o i n ts .
) ) ) J i ) ) ) ) ) ) )
E je m p lo
La saiid a de u n a sesión de depuración que se m u estra a continuación ilu stra
el empleo de ios puntos de detención;
E.'EM PLO ! 3C5) ;r93y 2* L . . -.5
1 i'. t a 3 * * $ 4 H : s « r i _ 1 « p u r a r .c t i i M 24.
I**»
’ .S C r x. 7n* cre a ra n o íis v j d«tt«ss#<í i-.¿s 3een s t a r t a - J a lr e a d y .
S ta rt i t f ro€ t M M g inn ln g ? (y o r nj y
s a lió * s t a r t c r c . ; r a a - / u s r fic c a i'n t» p r a fe c ts / lp « / 2*/src/parajJeD<jrar
5 r* » k o a ln t 1 . i u r a _ y ¡ i u r ^ J x O f f f f a W ) a : p a ra_ d 9 p u r3.-.c:2S
24 s w r [ i| * t ;
ÍCCO) sa'in: i
$7 » 15
:&C5 » m<© o rtw p o ir.ti
•fea Typ* O lí : Effc Accr?»» ítnat
i Dr»*kpoint *M p y 3«834 8 a i # m lun4_y_n*.3torio »t
o a ra _ (5 tp u ra r.c :2 4
StOC «n ly i* 1 ** *s
9 r# a * p o w t ii-*a < sy n t« i# r iñ e s
'QCO) cci«:* t
ífl<ÍCI
E je m p lo
Elim ine todos ios p uní 03 de detención y puntos de superv-.sión que pudiera
haber establecido y luego establezca el punto de detención b r e a k 25 i f l
== 1 5. Luego, ejecute el program a. E ste d etendrá tem porariam ente su eje
cución cuando la variable i se a igual a 15. D espués de que el program a se
detenga, em ita ol comando s e t v a r i a b l e i = 10 para volver i a !0. Eje
cuto u n comando p r i n t i a fui do confirm ar que ol valor de v a r i a b l e ha
sido restablecido, y luego om ita el comando s t e p (algo así como ir de a uno
pnr vez), que ejecuta una solo sen ten cia por voz. por tros voces, seguido por
otro p r i n t i Se v erá que el valor do i increm entado en uno luego do cada
iteración del lazo f o r
C O N S E JO
\o reauHa nao»Mfi<> iludir atop ir"', voces, gdb recuerdo «I üi:iro con'a-nlo <?)<»cuti»-
do, do -ricdo quo so cuo<¡o sancillnnwnto oprimir ln tecla Iniro y v o iw i «¡ccui-vlo. uno
gran contribucid" j la comcfídud. 6slo funciono nem ia nvayorto ile loo comando'; do
gdb Para obuinor mftrt douillon vor lo documoninctón rospociiva
E je m p lo
El siguiente ejemplo es u n program a plagado de errores de m em oria, inclu
yendo los siguientes:
EJEMPLO
• Tiene u n a filtración de m em oria.
• Se p a sa del final de u n a región de m em oria asignada dinám icam ente
desde el heap.
• Se q u ed a corto con un bufier de memoria.
• L ibera el mismo buffer dos veces.
• Accede m em oria ya liberada.
• Sobrescribe una pilu (stack) asignada estáticam ente y tam bién sobres
cribe m em oria global.
/• N o n b ra d el íro g ra n a en In te rn e :; b a tf ¡ ti9 ir .c
/•
• M l_ j5 0 _ íj« n o r ia .o O e n u e a tra ol o n p ia o d» h e rra » lo n ta a p ira d e p u ra r n e n o rla
•/
íln c lu tí* < 5 fi3 li!j.h >
* ln c lu d « < s * .d ío .h >
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 | ;
Q uf = n illo c (3 );
) ) ) ) ) ) ) ) ) ) ) • ) ) * ) " ) ) ) ) ) ) ■ ) ) )
: . 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);
}
n z n o t i a g e l o puede o no correr e n el sistom a del lector y, on caso do correr,
puede te rm in a r en un momento diferente. La salid a de m e m o fla g e lo en mi
sistem a fue ia siguiente:
i ;ail_ jso _ w « ria
PPJCGO : »&:«
>OS.1*JOC : io c : t : jn
S€_0u€W_CCa7O- aíccars-»
S*yi¿ci'iXL3n fa u L t ( « r t Ju tc M )
M e m o r ia D e b u g g e rs
Dado que los errores de m em oria a o n ta c comunes, los program adores h a n
desarrollado diversas h e rra m ien ta s que íes perm itan encontrarlos. Em pleu-
z ¿snjuncion con un d ep u rad o r del tipo de g d b , estas h erram ien tas
h a n salvado, sm ¿u d a, • rr--ichcs program adores que les saliesen can as
verde? Las des h erram ien tas que se com entan aq u í san E lectric Fence y
o en e e* .
Programación en Linux
E je m p lo
V /jS y Este ejemplo m uestra cómo u tilizar Electric Fence.
fÉ X J gíc ■•} «uljjjcjien cn a.c -o >-il_uso_renúfia lvfence
ejem plo s .1 itai_uao_*ei«oria
.• -* » « g * e r r t a t io n r a u i 1: t e c r e cu iip e a i
--------- S gflb -q n a l u so a M s r i a c a r e
A LI0A (gac) ryn
Starzing crograc /usr/lacaij le w p ro jo c is /l p e /1 <w » r c ,•nal_usoj n e n o r i s
(?35J
El comando de compilación utilizó la opción - g para generar jimboloe de depu
ración adicionales La pentllfcma lista del listado anterior (ígdbj es sólo el uxn-
bolo de p etiaó n d e comandos/ deja muy e n claro que «date un problema en !u
línea 27 do la fundón m am del código fuenUt dol programa o a ijjs o jr a m o r i a.
Después do que haya corregido eno problema, recompile y vuelva a correr el
programa, linkeando nuevam ente ol m ism o la biblioteca lib e fe n c e y, si ol
programa volviese a abortar, repita nuevam ente la sccuencu» depu ración/co-
rrecciótv'recompilado U na vez que el program a esté totalmente depurado, rc-
compilelo esta vez sin hnkearie la biblioteca de Electric Fence. y el mismo esta
rá listo p ara ser utilizado.
P E R S O N A L IZ A C IO N O E E L E C T R I C F E N C E
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
C O N S E JO
Ourante la e:saa «Je desarrollo oe un programa, resulta ana buena práctica nortear siem
pre al código cbje:o del -i¡smo ¡a biblioteca 1 loofonce para así poder detectar ios e--o
••es as rraiíoria que de ocra rr<cCOtal vez no ouo.'esen ser d&iectaoos. OebíOO ÓTOcisamen-
te 3 tas cuastior.es referentes a la alineación de memora oue se^oamos ce comen:
) ) ) ! ) ) ) / ) ) ) }
EMPLEO DE mpr
P a ra u tiliza r ~ or. sim plem ente descárguclo y compílelo. E ste p aq u ete de
softw are incluye varios p ro g ram as u tilitario s y u n a biblioteca estática,
I ¿ b ~ D r. a. que debe 3er v in cu lad a al código objeto de su program a. A segúre
se de u tilizar el «ufcA -g con el ñ n de g enerar símbolos de depuración, por
que algunos de los program as q u e in teg ran m pr así lo requieren.
Recuerde del capitulo 1. que • In ip r lin k ea al código objeto de m aI_uso_m e -
l o r i a la biblioteca li b f n p r . a . y que -LSHOME/ L ib adona al comienzo do In
ru ta do búsqueda de bibliotecas la expresión $H 0M E/iib. Luego de que el
program a íe a compilado y linkeado. asigna a la variable do entorno 3MPRPC
el v a l o r ’ -r e rp e -7 a l_ u s o _ a e m o ria y a S.MPRFI el valor " c a t > m a l_ u -
S 0 _ ¡i:e n o ria . icg * Cuando a» e s tá ejecutando, mor utilizn SMPRPC pura re
correr y exhibir la cadena do ü am ad as pora cada pedido de asignación y de
liberación, m ien tras que SMPRFI define u n pipolme (secuencia de pipes) do
comandos pora re g istrar y, opcionaim ente. filtrar la saiida de mpr
Term inados estes pasos prelim inares, proceda a ejecutar el program a. Si to
do funciona de acuerdo con lo planeado, se debería term in ar con uu archivo
denom inado m a i_ u s O ja e n o r i.a - la q ubicado en el directorio co m en to . El
mismo p resen ta rá un aspecto sim ilar al siguiente:
t : U < í 2 2 í 4 e : i 3 4 5 t « W : 1 3 4 5 U 8 U : 1 0 : «3*S6t792
n : I U S 2 7 5 4 6 9729: 1 3451 < 8 2 6 :5 : 1 3436S8B8
' : ‘ 3 *5226 t * : 13 4 5 2 M 6 3 : ' 3 * 5 1 * S « « : ! 34 565383
i : : > 4 5 2 2 5 0 5 :13 4 5 í 6 2 2 5 .• 345• : 5 : T34565568
t : 1 3 4 5 2 2 6 1 4 :i 3 4 5 2 Í 5 6 J : ‘ 3 4 5 1* 9 7 5 :1 34 565833
f : J 3 4 5 2 2 6 14 : • 3452A 36S:13 4 5 1 4 9 8 7 :1 34.565338
E sta información de registro no es de mucha utilidad tai cual está (In docu
mentación de! program a m pr explica el formato, si es que llegase a e sta r inte-
re sa d : ei» «i mismo'r. la mism a sim plem ente provee la m ateria prim a p a ra que
i os program as de utilidad de mpr. que procesan el registro obtenido con el fin
ce crear información que resulte m as inteligible. P a n visualizar las ftigús de
- - ’ *al como se ilustra en ei siguiente ejemplo.
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
La opción • f inform a el nombro dul urchivo y ol núm ero de linea donde mpr
detectó la fuga de memoria, La salida iudica que la linea 18 de la función
m am do m al_ u so _ m em o rla .c requiero do m al lo e 10 bytes m em ona que
n unca vuelve a liberar con una llam ada a f r e e (mpr y su s utilidadea em-
pluon núm eros decimales largos para m an to n er el registro de cada pedido de
asignación y liberación de memoria). Observando ol listado de código fuentu,
uno puede verificar que efectivanw nte os así.
Usando m ch eck
Tal como se mencionó recién, m pr, por sí solo, no puede detectar lon error»**
de corrupción de m em nnn, Si bien t>sto os así, mpr incluye la función
íticneck de la biblioteca m a llo c do GNU, que lo perm ite a uno detectar re
bosam ientos de bufier, rebmmmientos negativos (escrituran n to n as do m e
m o r a anteriores a la ubicución del comienzo del buffer) y liberaciones repe
titivas del mismo bioquo lievudas a cabo por llam adas superíluaa a f r e e .
De- ru?cho, mpr compila mcheck on l i b m p r . a como opción predeterm inada.
Las buenas noticias son. entonces, que loa raba»am iantos de buffer, tan to po*
sitivos como negativos, hacen que el program a aborte a menos que uno ins*
iruya específicam ente a mpr de no u tilizar m ch eck . Las m alas noticias, a su
voz, la constituyen que n c h e c k no es un program a dem asiado informativo:
se Limita a se ñ a lar un prohlem a y deja que sea el program ador el que d ete r
mine dónde h a ocurrido el mismo. Compilado ju n to con m ciieck , el progra
m a de dem ostración aborta cada vez que uno castiga dem asiado la m em ona.
E je m p lo
E ste ejemplo m u e stra varias corridas de m a l_ u so _ m e n o ria . compilado con
m check. con cada corrida habiéndose corregido el erro r encontrado en la co
EJE M P LO rrid a previa:
s ./nai_u80_«inoria
POS.POCO : accde
n<y»cx: «so>‘y cloccersC ssst and i f allocated biOCK
S . 3ai_i¡so_n8(T<ria
pos POCO : accda
Caoftulo 2 0 : Un toolkit de depuración 443
?W_WJCH3 : aíCC«?3*
8gjausau»RT 0 : í:c « * :-
c*scry clsetfí'K t ir f s r g lliOC 3 t«<l OliKSt
l— l
S .lu tíjiv ¡_ » t v }r i3
PO«_POCO : » > :íí
PMJWCHS • «cdíftf-
S£_0üB2A.CORTO:
•cft*cX: biocx ’reri t » ;c «
La corrección del resto áe los errores se d ¿ja eomo ejercicio p ara oí lector.
Lo que viene
El lector comenzó en este capitulo a a d q u irir experiencia con ln depuración
de progr.imaa Er. .*1 capitulo sim ie n te, "D istribución do softw are', aprendo-
r á un p ar de método» p ara d istrib u ir su softw are ya libro de errores. En el
últim o capítulo, re u n irá todo lo aprendido a fin de en co rar el proyecto do
program ación ya anticipado, u n a base do datos de CD do música.
) ) ? ) ) ) ) J ) ) ) )
21
Distribución de software
H asta oS mejor y m ás rápido program a del mundo se volverá inutilizablo si
resu lta e x tra o rd in a ra m e n te difícil in stalarlo o hace que el sistem a no pueda
volver a *er utilizado una vez que se lo instala. E ste tem a, h ab itu al m ente
omitido en los textos sobre program ación, cubre el espinoso procero de la
distribución de software.
E ste capitulo cubre los siguientes tem as:
• Empleo del comando t a r
• Utilización del comando g z ip
• Uso del comando i n s t a 11
• Empleo dol adm inistrador de siste m a RPM do Etod H at
La distribución de ioftivarr consista *m la creación, dintribución, instalación
y actualización de softw are ta n to d«l código fuente como de toa archivo» bt-
n an o s. Este capitulo exam ina el proyecto t3 r de GNU, ias utilidades g zl.p •)
: n s * a l l y el A dm inistrador de S iste m a de Red H at, RPM.
Todos los p ro g ra m a s d e e ste c a p ítu lo p u e d e n s e r e n c o n tra d o s en el •jitio Web
f i tT p ://* w * .B C p .C G f f l/in f o bajo ol n ú m e ro de ISBN 0789722151.
j , j , > > > > > ' t > > ' ’ ■’ ’
448 P ro g ram ació n en Linux
5:c.T3SoLv.conf
etc/snc.conf
sM.'sysics.cor.r
Obsérvese que t a r no elim ina ninguno de los archivos originales, sino que
sim plem ente crea ur. nuevo archivo t a r .
w / 3. P ara croar un archivo comprimido, sim plem ente a ñ ad a 2 a ia lista de op-
ciones. Tradicionalm ente los archivos t a r comprimidos, o zipzados, se desig
nan añadiéndoles . gz al finai de 3u nombre. Tam bién se les da a m enudo la
extensión . tg z . C ualquiera do las dos opciones es aceptable. Por razones de
ÍJEVPI.0
coherencia este capítulo añ ad irá .g z al final de! nom bre del archivo.
S ta r C i v f P i_ t a r .t a r .g z .‘ o t c r . c o n f
.. f atc/dosanu.conf
itc/gprt'root-Conf
^1 « t c / n o s t .c D / if
ü 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.
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 .
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.
f
! Í-U 1 Este ejemplo e stá tomado del makoíile de gdbm, ia biblioteca de base de
r |[7]l H^too do G:TU. Luego de expandir algunas de las variables de m ake, el ta r-
^ r¡E \ got i n s t a l l es:
¡T e m p lo in s ta ll. libscád.a 3 dt1n.i 1 gcfcn.inro
install -c * 3-í -í licgdfo.i S(1¿m íi ' í / I íocooí.a
in stsli c b e-i-t saan.n 5(inclueedíri/gdl>i.n
in stall -s -n 54* S{9rcair}/gdbn.info 5(infodir}>'g0Dn.inro
Las vanab les de make l i b t í i r , i n c l u d e d i r , s r c c i r y i n f o d i r son, res
pectivam ente, / u s r / l i b , / u s r / i n c l u d e , / u s r / s r c / b u i l d / i n f o y / u s -
r / i n f o . De modo que lib g d b m .a y gdbm .h se rá n de lectura/escritura p a ra
el usuario root y de sólo lectura p a ra todos los dem ás usuarios. Ei archivo
lib g d b rn . a es copiado a / u s r / l i o ; a su vez g d b n . h, el srchivo de encabe
zado, term ina en / u s r / in c lu d e . El archivo áeTexinío, gdbm. in f o , es co
piado desde / u s r / s r c / b u i l d / i n f o to / u s r / i n f o / g d b n i . i n f o . El conar.-
rio i n s t a l l sobrescribe los archivos existentes del mismo nombre que
Cáptete 21: Distribución de softW3ro 451
S*C»./»rc
lor oís in ü :e 3a
do
siw su u -e -o -o sus» «.«/«o»
s : « r c a tu o s e s w i s K r . z $ ih e / * : b
lf l S V S & • ro o t | ; t fit f
? o r OP? ifl StC-í - f l o: /«tC/jroi*)
00
SWSTAU. -C -2 O 5US£ft 5 SGft? JL3£ S 2 V
JIM T A U . •£ -a ¿M 3 VSIP * .p í ÍU'É.-SGv’
Wl
«■:ho ‘ i£ s t i s c m ío a no funcionara s i quien i* «■rrc « « la v a rlo riMt!*
-x - i _x ; f c r t «rail u se rs • : i 2 : J u l 20 0 4 :! * c b o » n .c '
) ) ) > >
y v > ) ) )
nación en ünux
S 3U -
?3S5»crd;
* :<3 y i ia n e / lK ir t w a U / p r o je s is / I w / 2 1 / s r c
* ./ ic « - in s t a ll.s .l
* 1$ -t /iTO/lpe-install
Empleo de RPM
El software administrador de Red Hat, RPM, en un sistema do empaque do
software abierto, general y potenuj. utilizado por muchas distribuciones do
Linux, incluyendo (entre otras) al OpenLinux de Caldera, el S.u.S.E. y, por
supuesto, la distribución de Linux de Red Hat. Se lo emplea con mayor tro-
cuenaa para Lir.ux. Pero existen versiones disponibles dol sistema para va
rios siatemaa operativos añnea a tTNXX, incluyendo a Solaris, SunOS, HP-
UX. SCO. AIX y el Digital UNIX.
El tratamiento que se brinda del RPM en este capítulo se concentra en la crea
ción do paquetes de código fuente. Si el lector so encuentra interesado en cuestio
nes más triviales tales «orno por ejemplo instalar, actualizar y eliminar paquetes
de RPM. lea el excelente libro de Ed Bailey Máximum RPM. Puede también din-
gir nu navegador hacia ol aitio Web h t t p : / / www. rpm. o rg /, desde dondo podrá
descargar la última vención de RPM. obtener documentación completa, FAQs y
KOWTOs. y hasta descargar una versión digital de dicho libro.
NOTA
Se recorroertta «fifAtcamenTe aocuirir Máunuffl RPM y reoxnpensar de esa manera
tarto ai autor como »■ «citor por nacerlo disoomtüe o*n cargo El lector encontrara asi-
Ktvno J'./« í-iCoc<y oe '-ni cocía ^ o rin a a<s< .Oto * j ma|or que tener que -eferirsc J
una veruon e e cri»'--.»
R e q u e r im ie n to s m ín im o s
Para crear una RPM el lector necesitará disponer antes que nada del propio
RPM, luego del código fuente que desea preparar para ser distribuido, un archi
vo rpm r e en el cual establecer algunas opciones predeterminadas de RPM que
controlan su comportamiento, y un archivo de especificaciones para controlar el
proceso de constricción del paquete de software. Deberá también contar ya con
un entorno de desarrollo plenamente funcional (compiladores, herramientas, edi
terv- bocaditos y gaseosas, café y tedo lo demás que necesita para sentirse cómo
do). y además su oüiga fuente debe haber podido ser compilado sin problemas.
Antes de continuar, sin embargo, resu lta .->^;.dal poder transm itir la filoso-
fia a la que responde RPM Éste siempre debe comenzar con ruentes p rísti
nas. Pristinc, en este contexto, significa código original, sin ningún parche,
tal como provino ¿e quien lo desarrolló. RPM se halla diseñado para permi-
P r o g r a m a c i ó n e n L in u x
o p tflsg 3 : -92
- 1 4 : & u e o r f ig u r « ( l C :)
S(_au:a*aV»}
M_tvtown?}
M C:_jyxS!r«- p * J ' X * u o M C*J;} cd V -C*> ¡)
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
C o n s t r u c c ió n e f e c tiv a del p a q u e te R P M
C uando queda creado el archivo de especificaciones, uno está en condiciones
do construir ei paquete. Si el lector confia en que el contenido del archivo de
especificaciones es correcto, sim plem ente cam bia al directorio que contenga
el archivo de especificaciones y em ita yl com ando rpm -b a . algo así como
'co n stru y a todo lo que haya".
LL i E je m p lo
!¿=^ El siguiente comando construye tan to el RPM binario como el RPM de códi-
go fuente de x e a r t n
C J IM P I O
*FL9 J 03 fu » r /* r í/r * n tf $ ? tC S
S *90 -M « » » r t n -l.© -! 2 IS K
;i*cu:isq:
sIlT oa lu i « 4U»t!»»Ull«d •IÍU*r'*MW/liO/X!WCWftO
■JCC -02 •
- - O lln » 0 _ l3 « e _ _ •C .?C JIX _ C _ S 0 U * C £ * 1993 *9 1
- 0 .9 0 S IX .3 0 U » C € O J Ü P € S _ S O j S C £ '4 M !. 0.3SO_SOUfiC6
• c 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 «
í x s &j Z w ; : S c le 3 r
Lo que viene
En este capitulo el lector aprendió dos m an eras diferentes do d istrib u ir soft
ware: empleando t a r . g z ip e i n s t a l l , y utilizando el ad m in istrad o r de pa
quetes de Red H a t Esto lo conduce h asta el capitulo final del libro. En el
mismo el lector h a aprendido cómo com pilar program as, ha cubierto diversos
temas referentes a programación, conocido num erosas interfaces de p rogra
mación de aplicaciones y cubierto brevem ente la inm ensa cuestión de la pro
gramación p a ra redea. Le han sido tam bién presentadas algunas utilidades
de programación esenciales, tales como RCS y gdb. Con el fin de re u n ir todo
este m aterial en u n a sola aplicación, el próximo capítulo lo conducirá a tr a
vés de la construcción de u n a base de datos p ara CD de música
) -)
) . )
Proyecto de programación: una
base de datos de CD de música
El capitulo 3. 'A cerca del proyecto’ , le b n n d ó al lector un somero recorrido
del proyecto do program ación que so com pletaría al final de cato libro. Bue
nos. ya hemos arribado al mismo. D u ra n te el transcurso de los veintiún ca
pítulos an terio res e l lector ha ¡do ap ren d ien d o mucho «obro la programación
en Linux, de modo que ya en tiem po de poner todo cae conocimiento a funcio
n a r E ste capitulo lo conducirú a trav és d e u n pequeño programa, una baso
de autor, de CD musicales, que h a rá tan g ib le (o por lo menos tan tangible co
mo lo pueda ser algo representado ú n icam en te por unos y ceros) mucho do lo
que se haya aprendido.
E ste capítulo cubre los siguientes tem as
* £1 código fuente completo do los p ro g ram as que sntegran ¡a base de d a
tos de CD musicales.
■ L'na explicación d etallad a de dichos program as, modulo por módulo.
• S ug eren cias sobre cómo se p u e d e n m ejo rar y ex ten d e r estos
pro g ram as.
Tudas ios program as de te capiculo pueden ser encontrados en ol attio Web
n t t p : / / vw* . r e p . c c n / i n f o bajo el n úm ero de ISBN 0789722151.
y j ) J J J- ) i ) i ) > > f J J > J
• sacor.-jr iterati#ai6n;e La zi-s :s S itos. ouscanco jna clavo cuyo valor $«3
igual 3 i i=
• clav*. S i t«*e=o$ e tito . .-tta m a r 3 y alraacanar ios datos corresaoncismas
í » i f Jiia ve
• i.* valor. S: ■'-«c.saaaos, ra to n a r 08,«>T?0UN0 or errno.
•I
ir t 5uRcsr_rag(cfc9r •bir*_clav5. DST "va lo r);
/•
• a tc u ja n - ;e ix z a t d« íatos *1 r t g u t r © cuya clav» $<a igual a la 49
txrfjrLave.
• : ato**ar ® s i t d i m t t u w / almacenar « l corríspandisnt* valar or la
varU&it valor,
• r « ; o - n r : •? ¡J clave Ocscsca no se ercuer.tra, y arrno en todos la* d M U
C8SC5
•/
i r : r*cup«r*r_r#g(char •6«f_clav*> O0 t «v a lo r);
r
• Cor.'sr el moceo de r*g i* troi o# La Oaso de ditos rucorrtendo la oisna
• co* un cursar Satorrar « 1 nuaaro do registros Si tononcs axitos o « 5 1
• la oas* 2 * datos «sta vacia o tu n e lugar gn error.
•/
int contar_rt^s|void|;
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’
í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 , :
ir.*, o ir r a .- _ 3 3 f .- c i3 )
{
• 3í -> c í o h 5*39r;s crcducir u « C i« n unj 3inc.-or.izacion, pero por las dudas
. . . •)
2 3 - > s y r.c í0 3 , a ’. ;
í6-»Cl5M(<33f 0 ).
r e f -m #;
>
i
Z8T cla v » . .« ic r;
tnt »«Ior_r*tC M íC 3;
{
iflt v3lor_r«torn3do;
C6T Cliva;
aeas9t(ScUVB, O, slzeof |C8TJ | ;
clavo.data * ouf_cIavfi;
clav e.aizt 1 strleri(buf_clavfl);
)
da->syn<:(Sb, 5); / • Sincronizar la baso de datoo •/
r*turn f?;
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;
>
L
Capitulo 22: Proyecto de programación 469
f
• Este t i íeiicaáo. 25 no alnaesna ;3£?-33 teramatfas en n u il 0 9 o cero
o rnaría),
• c a ooco m i l l o s s t m c c s o s r a I m i t a r ;o s O ytes a con p a r a r con la
loncitofl
• :■= la cacen» jjscsca =3"! asegurarse que la coincicencia sea la g itlfl*.
• ccopar* la ior^irad es la cacaría 0uscad3 coo clava.sise. 3 i son
• ic u a iw , considere que la coincidencia as correcta.
•I
;■*(ís c - n c a o [ c la v e c a t a , b u f _ c la r » , s t r l 9 n { B u í _ c la v e i ) ) {
iíf c U v t.s ite = str;*nie<jf_cla/9)| { /* Coincidencia encentrada */
crea*;
)
)
>
return •: /• LO lo grj*oi •/
}
tat rfc a o va rjffltc fc a r • ^r_cla ve. 08T «valor)
{
int »alor_retorrj«5o;
0*T «U v e ;
/• I n i c ia lu a ' la c ljv e 03T: considerar que valor ya V
• f a n o o m U U U e M O s o r q u ie n e fe c tu ó la i.a a a a a V
e e « » e t ( 4 c la v e , I , tu e o f( O S T ) ) ,
clave.data • o<jf.:la»e-
clave ; : : e • »trlen(6uf_cU ve>;
• i*r ai podeacs seterer e l "► jistro 'I
<aior_‘ etor«ad3 » e6->recup«rarj*0fl(a&. N uil, 4clave, valer, d );
j« it e a ( valer j ,etc,,'tsfi3i {
case » : I ' Ojala •/
retum •;
c a s a ajuOTrOW O; / • C la v e r s en contrada •/
■*eturn 1 ;
csfault: /* E r ro r no «re vis to •/
rrtu m »ilor_retcrr.ado;
) l m trj¡ riltc ft •/
Programación en Linux
Ln: con:3r_i-*Q3fvoid) {
in t valor_retoma0o, canrasor = 3;
06T clave, valor;
CSC ’ c trs c rjjo • SUtl;
/ • C raar » i c u rs o r • /
(• I n t C U llío r l a s 08Ta •/
raturn cantador;
<
in t vaior_n*tornado, contador • «¡
08r c la v a , v a la r ;
•* 30-* la t a t J5 aat:s •/
db->s recuperar re g ic u rs a r 3G, Sclava, iv a lo r , ZB ScXT)) :*
o b jio t p ü u w i {
3a-»*»Cu»ii-jr_i-«-j{;s, vuu.. tólave Avalar, C8 06TJMU0C); •
w a cp y(cU ves(co «ru 0o r] , clave.d a ta, c L a v e .u z a );
e e s c c y iv jlc ^ s ic e n ta a c rl. v a lo r Ja ts , v a lo r .» u e l;
•*c0*t*ccr;
>
rtttfffl 50«ta«0r;
i
E ste código define la interfaz de base de datos declarada en g e s -
to r _ d b _ c d » .h E n genera], todas la3 fundones retornan 0 si tienen éxito,
un valor entero positivo sí tuvo lu g ar alg ú n tipo de error, o u>i valor entero
negativo fhabitualm ente •> n o cu m ó algün otro tipo do error ajeno ni sia-
tem a. Las excepciones a esta regla s e r i a informadas.
a b r i r _ a b abre U base do datos especificada -*n ru ta _ a c c e so _ d b . Si ru -
? a _ a c c e s o _ d b es NULL. se abre uno baao de datos predeterm inada denom i
nada C d_nu3iC a .d b »n «?1directorio c o m e n te do trabajo. El indicador
0B_CR£ATE hace que s« cree la buso do dato s st te ta ya no existiera. Ade
más. la base de datos no se configura p a ra adm inistrar claves duplicadas.
c a r r a r _ d b d e r r a la base de datos. Como lo informa el correspondiente co
m entario. la función db -> C lo se debería obligar t la base de dato* a d escar
g a r cualquier dato que m antuviese en mem oria h a c a el archivo de disco, pe
ro para que esteraoe seguros de ello c o r r a r _ d b llama explícitamente a
db -> sy n c por La¿ dudas. De hecho, como medida de precaución, las doo fun
d o n es que verdaderam ente modifican los datos de la base de datos, a ñ a d í -
r _ r e g y e l i s i n a r ^ r e g , tam bién llam an a db->sync.
La función a ñ a d ir _ r e g emplea el indicador DB_NOOVEflWRITE para prevenir
que se sobrescriba un p ar clave/valor existente. Comu resultado de ello, para
modificar u n registro existente de la base de datos, uno tendría primero que
elim inar dicha registro, y luego volverlo a agregar después de efectuarle las
mcdificadones que fuesen necesarias U n a fundón que actualizara un registro
existente sería una excelente adición a e sta interfaz de base de datos.
A pesar de su ap aren te sim ilitud. bU S C ar_ reg y r e c u p e r a r ^ e g son s u
m am ente diferentes. recuperar_reg busca un registro que tenga una clave
especifica D u s c a r_ re g , a su vez, es u n a fu n aó n de interrogación. Recorre
toda la base de datos p ara constatar que una clave determ inada exista. Es
decir, m ientras que r e c u p e r a r _ r e g da p o r sentado que la clave existe y
sim plem ente recupera el valor correspondiente, o u s c a r ^ e g averigua si
e:c5:e la clave y re to m a eí correspondiente valor o u s c a r ^ re g debe realizar
trabajo adicional luego de que se encuentre un3 posible coincidencia.
La fondor, s t r c a p opera solam ente sobre caá en 83 term inadas en un cero
binario • .8 , pero les valores alm acenados en la base de datos no e stá n ter-
m inados ¿n un cero binarlo. Debido a ello, b u s c a r _ re g utiliza s trn c m p a
fin de lim ita r ios caracteres que se com paran. Después de que se encuentra
una posible coincidencia. e! paso siguience consiste en comparar la longitud
áe la cadena de búsqueda ron ia longitud; de los datos presentes en la base
) ) ^ ) ) ) ) ) ) ) j ') y ) y ? ) J )
4 72 Programación en Linux
/*
• 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 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )
Jir-clud?
*If!Cl'JÍ« <St'í¿C.^>
#irtcU*Je < j?ai;3.r»
firalufie *at;i:3i2e3_:;_caa.ft’
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.
voia noco_a*_mr5:eo(vaío);
<
int v a lo rj^to m a d o , opcion, contatfcir, í.;
t * ? » - n c íia r - c o ta r Q ; / • oe < g m o o t.h > ’ /
axtcm tnt optlnd; /• Oo <gotfrpT.n> •/
CST valor;
Char ••clavos, "v a lo r# »;
3»iccfi{opclon) (
ca$e a‘ : /• Artauir un regiatro •/
/* ?ero no artadir jn registro vacio u ana clave ce longiruc cera •/
if(argc = * 44
loptarg MJLL) 44
(strlen{opta."g> »= l| si
<argv(opund| 1= MjtL)| {
valor_retonado * aradirj-egfcptarg, argv(opt¿nfl|);
if(valor_ratornado == t| {
p rifltf('C la ve’sá' ex iste\r‘, optargj ¡
5XIt(EXIT_rAIl.UR£J;
> eisa íf (vaicr_.-e:ornatlo < i ) {
perror( ‘ c lie n te jjc n .c : añadirj - e g ') ;
**it(EXIT_FAIUJfiE|;
>
» f I i
orí»x:
* (
>
c*m 9": f un r«gtscrg •/
if[ * r $ c — 3» (
M « (e x t T .F A :u « j;
>
OTMfc;
>
I;
J
C íi* 3 -! /• 3u*car un r e g is t r o *¡
if ( t r g e •• 31 <
if(o p ta rg l - h w . i t
* # a je t ( lv iio r . J . 1 U«OM 0 8 T M ;
v a ’ 5 r _ r íE 3 fn a c o • 0 u ic a r_ * a 5 ( s o t » r g , i v a l c r ) ;
if ( v a i a .- j* e s o « t t d o » * * 1 {
p r l / í t f H 3 M eocofltraoa\fl*. aotargi;
« u t t o i n j ’A nuK ¡
t eisa :f{v a l0 r_ -«c r* * 3 c < 8| {
terror (*c iia n t * _ c d i: c us c a *_•*«a' 1;
exit{£xr_FA :LUR £);
)
a ri/ »t? ;* % .* s ;v s \ — . (L'tt.’ S T r lc M a c t a r g ) , o p ta rg . l i r » t j v * i a r .s i z e .
c--.iT *!* a lo ^ .o a ta);
^ íw ;
t
. . / / y
Programación en Linux
) a la s {
n o C c jJ e jjn p le o {);
}
case ’ r ' : /• Recuperar un rg g is t.-o '¡
t f ia r g c *« 31 {
: f( o p ta rg i - NULO {
*
p r ln t/ ( * V * » ¡ % .* * \ n ', ( in t } 5 t r lo n ( o p t a r g ) , o p ta rg , < in t) v a lo r s i í e ,
(Cftar A v a la r . c o t a ) ;
braak;
\
} «Is a {
*oiío_dajmpl«a|);
»
caso I : /• Listar todos lo» ragistros •/
tf(* rg c — 2 ) {
if((co«taoor • contar/agsO > « 0 ) (
putsCMo «u s té n rogistros on esta Oase tía datos*);
*xit{£Xir_FA!luflE>;
>
r I n i c t a l i i a r lo a punteros d e l c u rs o r •/
• ? 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 ) {
}
i' I v a lo r e a r* » • n « tIo e < T A M « tajU F )| « • NUU.) (
p u t s C c l ie n t a _ c d s .e e n a l l c c v a l o r a s ! i l ' ) ;
♦ x í:íe x :t _ fa :lü r s ) ;
>
i
<al«r_r*t3rrt3i}3 = IiJtar_r45S(CUv«5. v íla rfS );
;f(r*lor_r«WP«aao »■» 9 ) {
C«-.“o r ( , c l i 8 P : ? _ c c a . c : l i s t a r j " e g a *);
« * it ( S Ü T / A lL U A £ ) ;
\
» o r (t • <1; L < ccotador; » - i ) (
p rtn t< { * s.« s:> .M \n ’ , ( : m ) s t r l « n ( c l a v « [ i n , c la v a * ( i] ,
( in t) * t r l* o ( v a lo r a » ( t | ) , v*icr«*£ i 2 );
>
&r«ik;
» #1M {
o c o a _ c « .í* o U o ( j;
i
3 « f* u it: / • Opción v a li d a , r a s t r a r * 1 « n u ’ l
nodcjJ*_«ic!« { '.;
tru k ;
> /• m te n •/
c e r r a r _ a O ( ) ; / • Ca r n r l a ca se de s a c o s •/
{
PutífUCOO OS at?'-£0: cliar.t«_c«3n \
\ m t ( - a tc la v e » « v a lo r» (AAaal<r r s s i s t r o ] f r \
n \ z ( - t « c la v e » } lE H n ü t a r r e g i s c r o f H
Programación en Linux
/•
• tn lc ia lU a r al suaaiitana co curses. Retamar a si
• se tione éxito o - I U so prM ucí un urror.
•I
in : i n l c ü l íi a r j} a n u l ln { v o u í);
/*
• Cerrar el subsistema de surse3. No se '■eterna nuigun valor.
•I
void cerrar_ncurse8{vold)r
r
• (ft«Jtrazar la pantalla prin cip a l. No se retorna ningún valor.
•/
vaio :ra 2 =r_pantalla(void¡;
i ) ¡ ) ' ' ) ) » > í / ; i J L & J ' )
-t;V
Caci'.ulo 2 2 : P royecto d e program ación
r
• £xr¡:&ir ¿n ososaj» ac La linea í s esTaío.
*/
roid 15e.-sa39_j_u 5ua.-1 : (cr.ar -aensaja):
/•
• ?rea*rar una ventara sa^a la «r.trjc a y la salida 33 oatcs.
•(
ro¿c pr#p*rir_vefl»ana{wwOQw *vtmasia)r
/*
• ?refiarsr ur-a ventara oara ser vuelta a exhibir.
•/
v e is ae»trar_v*ntana(WINOOW *790: 303):
r
• 00 tener un oar cUve/valcr oara «fla<ur a la sato de cato*.
•/
O l í aA*dir_r*s{cftar •cuf_elave. c.lar • B uí.valor);
/•
• » : « r « r la c U « o# vin registre ¡jara a«r tlu in a tte .
V
fO-.C •Ufliííar_r»g{cr'ar 'Dcif_cl4v«)¡
r
• OCterer la clave ee un reg-srro ; » r a buscar.
•/
vota c«scar_reg(c,;ar *cuf_clave};
/•
• E xn i& ir un par c la v e /v a le r
•/
, 0 1 ; costra.» j*eg(efur •aof_alave, cnar • Soí.vatar).
/•
• Secuoerir un p*r clave/valar tssecm caao per usuario
*/
432 Programación en Unux
•/
'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
mt L aicializarjiafttallíím d j
<
m t * a x y , iraxx;
i f ( i . i 3 l n « i n - t n i t s í r { ) > == v j lL | <
o e r r o r ( * c d n _ o a n t a iia .c : l a ir w i n * } ;
rc f jr n - I ;
V
g e t n a x y x js t a s c r , x a x y , n?.xx);
• SuCvantana i e s r s l a c u a l e s c r i b i r ur 'iran u ' •/
-r';H 5 .iu « m - a s r w in t s t c s c r , 1 , n axx, Z, \5)) == {
C a co ío 22: Proyecto de programación 483
• : e a _ j * í 't i i . j . c : o a n w rin ’ ) ;
rsturr
}
!• SuSventara en acné# M c r i e i r w s í j í j o* •/
if f f lt t t u x w i, ? » t e r * ln ( s t t s c r . J , i m , e**y • i , »>> ** V JL L ) (
)
/* Sc5-«er,tarj 3or^3* ti*n« laca.' «t lig r u s y ia aalM» a« 0a:o9 •/
ií((»»-ta*a_í«_tratajo • 3er»Li(»?ajsr, «axy • 2, nxx, !, I)) »- NULL.* /
a t r s r r : c a jiir . illi. t ; rt* ? » M _ ftjr « a ¡c M ;
r it y r * •»;
>
/ • C c ^ ig y - a r « i t e c la d o •/
if{c& r* u< ) •• ifW j /• ?rocejar*roi l i entraca c» d ito s noiotros V
r» ttm •»;
: f ( k « r P M ( » íjf c r . nu£¡ .« e m j /• H a t n iit a r « i u n clo o o* c ia v o a - F •/
r* tu m - t{
i f i n o f o s l ) — £1W) /• Controlar la ja ltd a a* dacoi nosotros •/
r* tu rs - t;
r * t u r r «;
>
O IO c « r r » r _ a c u r i * s ( '* a i d |
v o ic tr a f jr _ p 4 r i'5 iia iv u ia )
4 8 4 P r o g r a m a c i ó n e n L in u x Capítulo 22: P r o y e c t o d e p ro g r a m a c ió n
m .
wrefrashtJtatuawln);
ve id <J<tf«ar_res(Cftar *Buf_ciava)
r« fra s h ();
{
> :rt54!-a.-_.«*íí4.--.a(v«ri:ar;s_i9_:rj6aj'j);
«'r»p<-UiT»(y#fltana- de_trat>«jO, 1, O, *IMTeRPRSTE: •);
v c id 0 re a « ra r_ v « r.t3 n a fW Ifi0 !M 'v e n t a n a l w .5 a ;s _a _u ty a rio riftc r«t< clava*);
( ■ gatatrfvtftí«na_í*_tna«:o, 5 « f_ c la v e ;;
* en m (v«ntana); sk5Jtr»r_nntar4( »ar.:ana_3a./f abalo);
o ch o ();
>
veis *c*:r*.-_r*$«nar •D ufjcU va, cn ar •Duf_valor)
3reoarir_vantara(veo:anaje_traD aJo};
aw o i‘ Uttw(vM:ana_de.>traoa]o, t,« , 'INTaflPRETE: •>; ¡e » iiV « y»ntana_5 « _ tric a io , i u i y , aaxx);
if(c o rta c o r — • ) «;
nansa]a_a_ust:aria( 'Ingrese c la v e * |;
«eras»; * *ntira j s a . t r a c a j a i ;
*fl«ts:r(van?ana_3e_tranaío, su f_ cia v a ) ;
BvW‘ Iü»(v»nta fl«_3a_trifia io . ccntacar, 0. ACS_HLINE, xaxxj;
avwoPlntvr(ven:ana_de,trabaio, 2, vj, ‘ TiTiiLO: *);
rrtpriflT»(ventana_de_trao»io. ccntaacr t |, e, •¡NTeflPRETs*);
nenaaje,ajjsuarxo(*Ingrese valor *I ;
lywírxnT» 1 ventar,aj » _ : r asa) a, ccncsccr • 1, eaxx / 2. ‘ TÍTULO*)¡
*'gnstr<v9nuna_a9_tr3Da¡a, ouf_vaIor|;
s w “,lire (ve r:a n a _:e _:ric a jo . contaccr - 2, a, ACS.HLI.'tE, uaxx);
w«par_ventana(vantana_de_cracajo);
i
) siguia ite j = :c-r.*=:•:: - 3:
Program ación en Linux
K ttlM -t2*
v o id pcoo_ d * _ e « p l * o ¡ ' . « : c ) ;
{
i r t v a lo r j-* tc r n « d o . o p cio n , fx e y . c c n x a w r , l ;
e a te ro cr-ar * o o ta rg ; (• Os < g » rc o t.n > • /
c* i r S u f_ c 1 »< * [ Iw S C J U F i , Ou*_valdfITAHWÍ0_9UF|;
zr.ir ••✓ a lc r * » ;
06* v a lo r ;
i f i c o r a n ; — * X .l ) {
•Odo_de_««pÍM(J;
> aisa t
/ ,»
« i i \ / J * J J J * -l
, J , ./ > .> ) > > > J > J J • J '
4&8 Programación en Linux Capcíuio 2 2 : P ro y e c to d e p ro g ram ac ió n 489
íf { a b r ir jjb (o p t a r } )) ( 3las
f p r ir .;f( s M « < T , ' E r r o r a l a b r i r l a C 3S? 3 5 tía to a % s \ n \ o p t a r a ) 3 8 T.S3 i« _ £ _ U S ¡,1 - 1 0 ! ■c 1 ' r o i s t r a n a S id o a r s d id o * l;
9 X Ít(S X IT .P A IL U flE > ; ir r íí ;
} C1Í9 <£v _":3 i : ~Z: E lia in a r un registro •{
} 9 l i * ‘ r a r _ r s g ,'b u í'_ c lz v í) ;
> r ? i ; f l i - a r _ - í 5 i a 'j t ,_ c l3 v o ) :
bn jafr; i? ( vale r_re tomado > 9)
a s o <: / • U t i l i z a r l a o ase d« tíatos D redeterninatfa */ r-3CM :*_3_jS'.arior'::379 ra ^reentrada*);
I f fa b r ir _ d b ( V U L L | ) { ?1í « ií|v3 lo r_re tcm a íc < a>
c u t í [ 'E r r o r a l a c r i r la b ase do d a to s p r e o n t e n ir a d a * :- ; o*r.*aj «_a _jJuario (* Tuve lu^a-* error no a riv is to ’ J;
exlt(EX IT_rA lLU R 6>; 9 l«
} B tr.s4T«_a _jS 'j»rio Cil *?gis;ro ha J i t í o eliBÍnado*);
Onjak; br«a<f
d a f a u lt : /* l in e a tlB conandos nul r * c a c t a 5 a •/ ras* *SY_F(«j : ;• =<: Buscar un r*gu t r o */
H CdO .Í8_ffl0l«o(i ¡ íys c a r_r«^(O g '_c la v «);
á re a * :;
3 ? flIlt(4 v ilO f. 8, U Z »5Í|C 8 T!J¡
\ r fw m an bioqut do m u cu -i valcr_r*tcrnado • ouJca.-_rea-'bv* _clav«, ¿va lo r);
if(vaior_re*.om*do > oí
¡ ' coron.’ a r n cu rse s V B«r.i4j*_i_gsuapiorClav« na <nccnt*»üa*|;
l f ( l n t c l a l i z a r j > a n t a l l a i ) < ») ( / • Las n cu rao s no arran ca ro n */ ♦lia i t (valor_r«tc.*nadc < a)
B u t i ( ’ € r r o r »1 i n l c u l k a r n eu rita s*); nflnj4ji_i_u»uar:3(*'wvo lugar « r re r no p r m s to * ):
c # r r a r j» < ) ; •Isa (
axitíEXir.FAILURE); a*n*a l *_a_jx/ar :c (* E l ra g u tra na sido ubicado*);
) i5 rm tri5 u f_va lo r, 's.*-.*, ( tn t; v a i o r . n » , fenar •V/.üor.OUtAj.-
y F r a M r l a p a n t a l l a i n i c i a l */ a o s t r a ^ r e g p u ^ c l a v í . b a f jf u L o f ) ;
tra z a rjja n t a lla O ;
>
sreai;
/• t i laio principal do ccfl-andoa •( :aja KTr_F(5) : * F 5 :- «ecup«rar un registro •/
wnila( ( Tk«y - fl«tch{)> I* KEY_F(1©}| { .-*cue*rir_r*g(buf_c¿ave);
jw lt c h jf k a y J { M*set(*Valoc. « , s:«<sf ( 0 8 T ) ) ;
C158 ¡<EY_F(2} : C F 2: A ñ adir un r e g i s t r o */ /llar^rítornaas = recuparar_.~«$|büf_clav«, ¿valo r);
a ñ a d lr _ r e g | 5 u f_ c la v e , b u f _ v 3 l o r ¡; i f t v i i a r ratom ado > ai
v a lc r_ ,-a to rra d a ♦ aña 2 i r _ r e g f 6'j f_ c la v o . C y f_ v a lo r | , aer.ss33_4_J8uarioí ‘Clava no e rc o n tra c a " );
i* (v a lo r _ r s to r n a d o > 0 } í l i o i ' {valcr_rato m aco < 0:
3 B n s a ¡9 _ a _ u 3 u a n o r C la v e ya a g i s t e * ) ; n*ftsaja_a^VJario(*Tuvo lugar error no arsvisto*!;
a is e if( v a lo r _ r a to r n a d o < « líe
n6n33!«_a_usijarL3(*TüVü lu g a r e r r o r no p r e v is t o * 1 : o M M ] e _ 3 _ j 3 u a r i o ( * E l r e g i s t r o na 5 r.ee ja i c a o a * } ;
490 Programación en Linux
f
tf 11valor*i[l) ^ <talloc(rwwio_BuFj) ■« NULL) (
nansa)«_a_usjarlo(‘ Error ce nenoria*);
brea»;
)
c RecuDerjr todos los registros */
valor_r9tomaco = líst3r_regs(slávea, valoras);
if|vaIor_retcmaao == 0 ) {
lensajeji^suanoCProoiena con el admnistrasor de tase de oatos*),
break;
)
• Exhibir los -egístros recuperados er osntalla •.
í a r ( i * 0 ; i < contador; - ‘•i! {
3p rin tfitjf_cla ve , •’í . ' s *. | in t;s tr le n (c la v e s [l]), c la v e s U ]);
sprint*( buf_valor, v s * . (in t)$ trle fl< v a lo r* s [i])( v a lo re s fij);
Ustar_r3gs(0uf.clave, Out_valor, i ) ;
}
tér.saj9_a_uSLano|'Este es a l u ltin o registro* );
Capitule 22: Proyecto de programación 491
c«rr»r_sef); • C * r ra r la 3 «3 « 39 <JatOí */
eerr*r_rcvr»*»(J; • C#r-*r •! SU08Í3tit<M tí# C U T O S */
«* i:< € x :’ .5UCC€3S);
• I n s t r u c c ió n * ! 3« u so í« . ír o y a e a
•i
fO iO »© dO _3«_*«0U O {vO llJ)
<
pucs(*MOOO 0* 9 * t£ 0 tn:«rfai_uiuarvo_o3fl l-a 5»ia a« dato»!*);
•*it!£x!*_F*:w í£ l;
)
m t e r f a z ^ u s u a r io _ cd m . c debería r e a t a r l e familiar al lector. El flujo de
este programa, y gran p a n e de su código, se asem ejan mucho al código do
c l i e n t e _ c 3 n . c . Ello es deliberado. £1 d U e io de la interfaz de base de datos
es tal que la muca diferencia verdadera e n tre el cliente de línea de comandos
y e! program a interactivo es que los datos recuperados de la base de datos de
be formateado de u n a m anera que re-aulte adecuada para las ncurses.
Por supuesto, existen ciertas diferencias m t e r f a z _ u su a rlo _ c C m . c es
mucho m as sencillo de invocar. El p ro g ram a acepta u n a opción de linea de
comandos. - a archivo), que le perm ite a uno utilizar una base de datoa dife
ren te a la predeterm inada. c d _ « u s ic a .tíb. Los argum entos u opciones in
válidas producen un m ensaje con instrucciones de uso, del cual se m uestra a
continuador, u n ejemplo:
$ ¿nts-*íi_usjl<’ i3 j:tí« -s áljjfta asse 3é catos
UlCC EMPLEO; ín:er*ai_t,»u3rio_c<Ja [-a ■
‘ •O*ra_t>ase_3a_datosí
Toda la acción tiene lugar en ol lazo w h ile loop. La sentencia s*ví tc f. procesa
las puiaaaor.es de teclas del usuario, procediendo entonces a llam ar a la ru ti
na adecuadu El usuario puede p u lsar una de laa siguiente* teclas válidos
• F2: A ñadir un registro
• F3: E lim inar un registro
• F4: B uscar un rogistro
• F5: R ecuperar un registro
• F6: L istar todos loa registros
• F I0 : S alir del program a
Si so comete u n «rror de ti peo aparecer» en la p an talla el m ensaje C la v e no
del* m i d a exhibido en la línea do escudo. El éxito o fracaso de cada operación
se m u estra en la línea do estado por medio de la fiinaón m en sa}e _ a _ u su a -
r i o . Uno puede hacer fácilmente que el program a acepte otros pulsaciones do
tecla como alias do loa comandos actualm ente definidos. Por ejemplo, el tipear
a o A lo perm itiría al usuario añ ad ir un registro, y si o p ea ra I o L podría obte
ner un listado de todos los registras presentes en la base de datos.
Cuando so oprim e F2. prim ero ol program a le solicita que ingrese el nom bre
del in térp re te y luego el título del CD. En !a figura 22-2 se m u estra la a p a
riencia de la p an talla después de haberse añadido un registro.
Si la clave ingresada ya existe an la base de datos, se exhibe en p an ta lla el
correspondiente m ensaje de error.
P ara eiim inar un registro de la baso de datos, O prim a F3. La p an talla que
aparece cuantío se elim ina un regislro 3e m u estra en la figura 22-3.
Cawtulo 22: Proyecto de programación 493
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.
Lo que viene
¿Qué «tí !o que viene ahora? ¡Bueno, c u rra r el libro y convertirse en un lamo
so program ador de Linux, por supuesto! Hablando on aerio, el lector ha cu
bierto en « t e libro u n a g ran cantidad d<* m aterial y ponee una sólida base
p ara seguir program ando. Lo que re*ta es sunplem onte escribir pilas de pro
gram as que utilicen lo que haya aprendido. No existe realm ente otra nume
ra de convertirse en ur. program ador com petente de Linux que ia práciica.
A unque un libro ie pueda m o strar los principios y modalidades básicas, la
experiencia es el m ejor m aestro. ¡Siga a d ela n te y programe!
í Parte VI
%
Apéndices
A . R e c u rs o s a d ic io n a le s
B . H e r r a m ie n t a s a d ic io n a le s d e p ro g r a m a c ió n
I J ,1
A
Recursos adicionales
Bibliografía comentada
ALLESA.VDRO RUBWl, L inux D tvict D riixrs. O’Rcilly, 1998, ISBN' 56592-292-
l. Este m el libro que tr a ta sobre cómo escribir controladores de dispositivos
para Linux; contiene vanos ejemplo* completos y útiles.
ARMAS KaLLZ DaLHEI>gx. programmíng with Qt. OTtoüly. 1999. ISBN 1-
56592 588-2. Por el momento. es ei único libro publicado sobre la pro
gram ación con Qt Si uno pretende realizar programación formal con el tool*
kit Qt. esta libro es de empleo obligado.
B ill RücENBIatt, Leam íng ihe Korr. Shell, C/Reilly. 1993, ISBN 1-56592-054-6.
U na introducción tutorial a la interfaz de Kcrn, contiene varios capítulos dedica
dos a la program aran de scnpts para esta inierfítt. Todo su contenido debena
poder ser aplicado a p d k sh , la versión de dominio publico de la interfaz de Korr.
BRENT B. Weu3£. Practica! Programmíng m T il and Tk, 2da edición. Prer.ti-
ce Hall, 1997, ISBN 0-13-616830-2. T d/T k es el lenguaje UNDG'Linux de
scn p ts que cuenta con más prestaaor.es. T d es la sección de modo cexto y Tk
aáade una interfaz X Window, Este libro es el texto recomendado para
aprender Td/Tic-
Brzax W. KkrmGHaN. D e ssis M- R ítckie, The C Programmíng Lan^uage,
edición. P rennce Hall, 1988. ISBN 0-393-9694-5-2. Conciso pero completo
m anual sobre el lenguaje C de programación, tal como se encuentra norm a
lizado por ANSI e ISO, esento por la5 dos personas que crearon el C.
C am£ROS N ew Ha M, Bü_l R osensla TT, L ea m in g :he bash Shell, 2da edición,
O'Rcüly, 1998. ISBN 1-56592-347-2. U n a introducción tu to ria l a la in te rfa z
c a s f i , contiene varios capítulos dedicados a la program ación ¿e sc rip ts p a ra
e s ta in te rfaz .
Clo-.ts L. Tondo, S cott E. Gqg>£L, The C A n s ia r Book: Solutions to Exerci-
íes ir. :'ne C Programmíng Language, 2** edición. Preatice Hall, 1989, ISBN
0-13*109653-2. E s:e libro contiene soluciones para cada ejercido que Kernig-
h an y Ritchie pocen - a su libro, The C Programmíng Language. Lam enta-
} l
500 Programación en Linux
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/
Linux.com
nttp:/,*w*. :inu*.car/
JUEGOS
The Linux G ame D evílopers Web R ing (Ei C uadrilátero de los prugram ado-
res de juegos para Linux)
ntrp:/ w ».« c . m : -«Kk-lO/lfiOBlcg..ira
Linux GSDK
rr.-.z: i- ’ i i t í a-c.c*-esquirol u í---d8*.fi:a¿
G rap.cos
Form atos de -archivos gráficos
-■zzz:¡ OTv.cis.oMa-srstí.Ki'nyBtríaxt, faq/uswet/gi'aaíucs
áfil«for*ats-fsc.‘ tco .rrr;
5 04 Programación en Unux
Mesa
3
h* í : 11■**». asee. « ta c . etiul «orianp /Mesa. fttnl
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
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 )
SEGURIDAD
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 /
T .iíoriai de GTK
•<: t p : / /la m>n. con/- slow/gtk /
Acér.dice A; Recursos adicionales 505
PROGRAMACIÓN UNIX
S un Developer's Corniectioc .Conexión p a ra program adores de Sun
:rtrp:/ «v».3un.:ofl/a«-<*lí-0'f"3/devoloi5ars.nrrl
PROGRAMACIÓN X W1ND0W
Tho O pen G roup (El Grupo A bierto >(anteriorm ente X C onsortium )
n tt o :/
’lfechniad X Window System S ito s (Sitios técnicos de sistem as X Wúidow)
* W .! **• r*?:ui,0*tiy*«t0n/KSit»i.ht»l
X Imago Extensión irifo (Inform ación sobro extensión de X Iinago)
n * T O ;.u a e ri.e tí.c c o /c rn ín /j/U o -jín /
XPM form at and library (F o rm ato s y bibliotecas do XPM)
http :!!**• i/ir u . f <■/ »aali / U tw i / <o«>•hw l
DISTRIBUIDORES
C aldera System s
flttp;: / **<• «yJtMU .coa/
Debían
rictp: ■ «-*"».e*oi*vor<;1
Red H at Soft*.varo
h ttp :/ *»*.¡'wr*í:.co«>
S lackw are
■wn.sUcm»»rj.cai
nrtff: ***.:arsa. zza
S ta n p e d e
rizc:.. hsn.iZiaceei.erii/
Programación en Linux
S-u.S.E
h t t p : / > '* « * . í i i s s . c c * /
U senet
com p. adm Ln . p o i Ley - Políticas de adm inistración de sitios.
com p. L ang. c -C u b re program ación con ANSI/ISO C.
cOiTp. o s . l i n u x . d e v e lo p m e n t. a p p s -C ubro ios detalles de programación
de aplicaciones bajo Linux.
com p. o s . i i n u x . d e v e lo p m e n t. s y s te m -C ubre todo lo quv uno siem pre
quiso sabor sobro ln programación de sistem as con Linux, pero no se atrevió
¡i preguntar.
comp - o s . l i n u x .S etu p -E sta b le c im ie n to y adm inistración de un sistem a
Linux.
com p. s h o l i . p ro g ram m er -Cubro program ación de interfaces.
com p. u m x . adm m -A dm inistración do un sistem a UNIX.
comp. u n tx .p ro g ram m er-A n aliza la program ación en el entorno UNIX.
L is ta s d o c o rre o
L.u siguientes listas de correo son accesible» con Majordonio Para suscribirse
a una lista, envío un tr.en.saje a m a|ordom o& vger. r u t g e r s . edu con la p ala
bra s u s c r i b e seguida por ol nombre de la lista de correo en el cuerpo del
mensaje. Los comandos presentes on la línea de “asunto" no son procesados.
l i n u x - a p p s - A p li c a c io n e s d e softw are
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*/
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
Certificación
• C aldera System s Linux T rainm g
p.r:?:. - c a l c e . * ¿ i y m e s .con/ecucat ic a I
• Linux P ro fe sio n a l ín s u tu te
ntto://9**.lpí.or¡/
Programación en Unux
Compiladores y lenguajes
• A lleg ro CL. un s is te m a d e d esa rro llo ráp id o d e a p lica cio n es L lS P /C om -
m on L ISP
nt t o: fpanz.ccnítflo^i'Oload.ntnl
• C C s T , un in te rp re to C V C + +
h ttp :/ / r o o t.M M .c n / r o o t/ C in t .n t q l
• EGCS
neto://íQ C J.cygnu *.caí1/
• F G R T R A N 90
h t t p :/ / w m .t M ls 'ullt#u.cco/<low nloM /Li' 0 *i(.»itJii
• Tcl/TK
nttpw í»w«.5criDtics.ce*/proau5ts/Tcltk/iraox,nt.Tii
Distribución de software
• P á g in a p rin cip a l d e R ed H a t P a ck a g e M an ager
-ictp://*««,rpn.orgf
Editores
• C forge, u n e n to rn o in te g ra d o d e d esa r ro llo C /C ++
nttp:;/ww.codaforge.cc<r/C3l-Dlfl/Custco/M 8Vir:<aplan/B«ot8ter.C9l?flEgisterafr«9
• Code Crusador
stto- •««■•.cco.eiltecr.
• GNCFro. una versión comercial de las herramientas de desarrollo
GNU
n-tp: 11»»«.cy;ivjj.t3o'5^y0^5
• Jessie. una IDE de plataforma cruzada desarrollada por Silicon
Graphics
Atto:M os9.sai.csa/cro}i«:irt*uia/
Gráficos
General Graphics Interface, un sistema gráfico de plataforma cruzadu
nt-prQ xet.orw
MESA, un clon del toolkit OpenGL de SCI
h ttp ://V M .a tu 3 d .o rg /
Herramientas
LCLint. una herramienta estática de verificación de código
/ ’*v». jcj . ic* .o ::.#©u/Ulti:
Cbecker. para localizar errores de memoria en tiempo de ojecución
nttp: /'*•» .«rg/scfmre/cftfleMr/cnecJur "tBÍ
CCMalloc. otro perfilador de memoria
nt»:/.'iserse.ira v**.Ut-*r%w<cct¡tUocr
Misceláneas
• Lnsure+~. una herramienta estática de validación de ^.odigo •como
LCLint)
ntíj: I /••». par»soft -coai crocucts/lrsure/ ird**-nt>
• PowerRPC, una herramienta de desarrollo rápid» para ..¡uñadas .1 pro
cediraientos remotos
•tttj: «M..Utoclj.coa ;r 0 CLC:*'S0 ^rrpc.'tí«"':-s4<3/v1
• Xaudio SDK. ¿n toolki: para construir soft'vare
h n s : / ¡*v«. t auou . « c / cow Icae i / *Liflu*
• Wotsit's Format, un recurso para cientos de formatos de archi/u
fttt?;/j vw.aotsu.org/
• Wiilows API. para transportar aplicaciones de Wmdows a Linux
• t t s ;, / » W .V Ílle « S .8 0 *
) 1 ) ) .1 ) > ' } } ' >' r ■' ' J ;
512 Programación en ünux
• Inform ix
n t t p ://«w». infornix.co«/linux/
• O racle
n ttp ://platforo#.orael*. con/llnux/
• PostgreSQL
Htip;//Af*w.pca;gr«sqi.org/
1 > J > > ) ) ) > > ) ) > ) ) ) ) ) 1 j ) )
4
índice
S ím b o lo s -g. opciones. 14. 21. 450
-help. opciones. 30
«ifdcfs. arch ivo s con. -i, opción, 37
22 •jN. opción. 37
tin c lu d e . a rc h iv o » que -k. op ció n . 37. 53
ronttonan. 12 •I. o p c io n e s , 14, 220,
$, p a la b ra * cla v e» . 411- 300,413. 421
41S •Ldirnjuno. opción, 14-
S, v a ria b le * . -46 15
.C. e x te n sió n , 9 •m, o pción do lín e a do
.ce. e x te n s ió n , 9 c o m an d o s, 450
.i. e x te n sió n . 9 •MM. opción. 15
.11, e x te n sió n , 10 •n, opción. 37-39
.o, extensión, 10 •O. opción. 14, 19-20,
Jj, extanaión. 10 23. 29
.«o, M to n sió n , 10 •o, opciones, 14, 450
/dov, filM y stcm , 70. 278 -On, opción. 14
t a r u o t ' Li u p to d a te . •p. opción, 301
m en saje d e e r r o r , 52 -peduntic, opciones,
< -1, valor, 84 14. 17-18
< std arg .h , 304 •q, opción, 301, 428
•a. e x te n sió n . 10 , 303 -r, opción, 37, 301-302,
-anvi. o p c ió n , 14. 17-18 414-416, 418-420
•b. o p cio n es, 468 -s, opción. 37, 10-42,
-c, op ció n . 11, 14,300- 300-301
301 -static, opción, 14-15
•D XOPENjSOL’R C E , -truditfonaJ. opción, 14
m acro, 347 -u, opción, 300, 413.
-d. o p c io n e s. 37. 52. 420
301, 428 -v. opción, 15. 300
—dele te, o p c ió n . 449 -W, fam ilia d e opcio
-Dfooobar, o p c ió n de nes, 14, 29. 37, 39
lin e a d e c o m a n d o s, 14 -Wall, opción, 11.17
-E. op ció n . 10 -w error, opción, 15
-£. in d ic a d o re s (flajísj, •Wfile, opción, 37
19. 30 •W im plicit-m d/cactor
-f. opción. 19, 3", 414- (flag) de función. 29
415 -x. opción. 12
•fstack, sw icch d e v e r i
ficació n d e e g es, 29
i
516
i } t i
Programación en Unux
j .1 y / ) ) / ) J )
518 P ro g ra m a c ió n e n Linux
b a s e s d e d a to s b a s a m ie n ta s p a r a . 300* b lo q u e o s d e a d v e r
d a s e n re g is tro s , 304 t e n c i a . 183
204 b ib lio te c a s e s tá tic a s , b lo q u e o s d e le c t u r a
b a s e s d e d a to s q u e 15-17. 303-310 o c o m p a r t id o s . 186
e m p le a n d is p e r b ib lio te c a s b lo q u e o s d e e s c r i t u
sió n ih a s h ) de d a convenciones sobre ra o e x c l u s iv o s ,
tos, 204-205 nom bres. 15 !S (¡
b a s e s d e d a to s de ncurses. 220-240 b lo q u e s d e d a t o s ,
B -tre e , 205 de programación, 134
B asadas en d isp er creación de, 299- b o r r ie r , f u n c ió n . 230
siones o hachea, 317 b orrar
204-205 ístáticas. linkeo do. registros corrientes
basadas en registro?. 15-17 de bases de dutos
204 readlme de GNU. 432 y cursores. 215
Berkeley. 203-217 recursos p ara. 509 directorios. 165-167
CD musicales, códi b ig -en d in n , c o m p u archivos de tarbalis,
go fuente para. ta d o ra s , 392 446
464-495 b its m o d ific a d o re s elementos de bases
recursos de softwa de m odo d e a r c h i de datos Berkeley,
re, 512 vo, 135-136 210-211
Ver lam bitn Domair. bits colas do mensajes.
Ñame Sjutem de acceso. 134 365
(DNS) informados por co semaforoi», 3671-374
b a s tid o re s p a ra a p li mando SN0CTL_ evitar en archivos do
c a c io n e s, 509 0SP_GETCAPS 294 trabajo, durante
B erkeley, b a se d e d a modificadores de ingreso a directo-
tos, 203-217 modo da archivo, rio RCS. 413
B erkeley, A PI ( i n te r 135-136 b o x . f u n c ió n . 239
faz d e p ro g ra m a s bkgd. lla m a d a , 237- b o x , lla m a d a a m a-
d e ap lic a c ió n ) p a 239 c r o , 238
r a so ck ets. 380*382 b lo q u e a d o re s, a rc h i b r k , lla m a d a , 123
vos, 183*186 b u g s (erro res)
b ib lio te c a r s a d l i n e .
b loqueo d e a rc h iv o s de memoria, tipos
GNU. 432
e sp e c ia le s, 133 de,435-436
b ib lio te c a , a rc h iv o s
de, o p c io n e s y a r b lo q u eo d e re g istro s, corrección de errorea
g u m e n to s e m p le a 185*187,189 con GNU cc (gee),
dos, 15-16 b loqueo 21-22
de archivos, 182-189 B u r n e t t , S t e v c n , 137
b ib lio te c a s c o m p a r
tid a s, 310*312 ¿e memoria. 179-180 b u sca r
b ib lio te c a s de p ro de registros. 185-139 ayuda sobre coman
g ra m a c ió n , c r e a b lo q u eo s c o m p a r ti dos de Gnu De-
dos, 1 8 6 Bugger igdb), 437
ción d e, 299-317
blo q u eo s c o m p u ls i paiabras reservadas
b ib lio te c a s de p ro
vos, 183 de Revisión Con-
g ra m a c ió n , h e r r a
¡ ) ) ) ) } > ) ) ) ) J ) ) ) ) ) )
520 Programación en Linux
S26 P ro g ra m a c ió n e n U nux
- . ¿i
'
:
- ' ib •
iir-íi:u- tr '
IC ? I • • / ' V t . . i V <■( i m
-l II ' -•*’
• -i *• ' nr* 1 i i. • -
,i. i i
, ;;; .
ÍV»| l'U-*)» 1 M. - •' r . i | •' " ii... -
: .is_.i l I
n m r i , 'i. >'
rv_\ '• Ji — ; i t :» • l . )• ali . r - ; «■
•i t
l*Vn . J 'T
I! r . ' i »•!'*•.• ’ i- rn 1 '
¡•lili • ' - „• .-
■ :
L;.;-'" > i ii
I I >1 ti - -1=? • •• '
• fllíl *1 I IV
;■> • At-JV i-t
¿r.i.'.i - .?* » •I O l'. j¡ r ’ C t . |’ I .
i*[.
, ) ) ) ) ) ) ) ) ^ 1 ) > ) > y > >
532 Programación en Linux
ín d ic e 541
A u t o r -----------------------------------------------------------
□ OtvUgacKin Cie^tirioa
£
0
¿
Afimm^ra&On
□
Q econom ía
□ Maricíting
□
□ Eloctr6nica
*
Q C om putaoén
□
□ Negocios
l
Q Textos L n jw s-tB ro s
□
□ Otros
□ M anagem en:
^
□
£
1
_ ---------
----
. -----
Puesto: --------------------------
C.P.: --------
Dom cíjo.
Pax:
E-meH:
P learso n
E d u c a c ió n