Escolar Documentos
Profissional Documentos
Cultura Documentos
OBJETIVOS
Taller de Linux
1. COMANDOS BASICOS
OBJETIVO: Utilizar comandos basicos para manejo de archivos y directorios
cd Cambia el directorio
pwd print working directory (muestra el directorio actual)
ls Lista el contenido de directorios
cp Copiar archivos
mv Mover archivos o directorios
rm Borrar archivos o directorios
mkdir Crear directorios
rmdir Borrar directorios vacos
whatis Imprime la descripcion breve de la pagina de manual
apropos Busca entre las paginas de manual y las descripciones
exit Produce la terminacion normal de un programa
logout Salir de de un logueo de sesion
man Interfaz para los manuales electronicos de referencia
1
1.2. Formato de los comandos UNIX
Los comandos UNIX son almacenados en un computador como archivos con permisos de ejecucion. La mayora
de los comandos se almacenan en directorios de archivos binarios estandar como /bin,/usr/bin o /usr/local/bin.
Los comandos UNIX usan el siguiente formato:
nombre-comando: el nombre del comando actual generalmente es el nombre del programa ejecutable que imple-
menta el comando.
-opciones: el smbolo - se usa para indicar una opcion. La opcion modifica el modo de operar del comando.
lista de parametros: La lista de parametros (o argumentos) con los que operara el comando podra ser 0 1
o mas parametros. Los parametros son separados por espacios en blanco.
-h, --human-readable
Anade una letra indicativa de tamano, tal como M para megabytes binarios , a cada tamano. (Nueva en fileutils-4.0.)
-a
Incluye en el listado ficheros cuyos nombres empiecen con ..
Nota: Por regla general para todas las aplicaciones, las opciones de la lnea de comando se pueden agrupar.
Ejemplo: Si queremos realizar un listado en formato largo, que nos muestre tambien los archivos ocultos con
el tamano en unidades faciles de leer, debemos pasar las siguientes opciones al comando ls:
[usuario ]@host:$ ls -l -a -h
2
1.5. Visualizacion de archivos de texto (less)
Ademas del comando cat y more, uno de los mas utilizados es el less. El comando less permite desplazar el
texto hacia arriba y hacia abajo, realizar busquedas dentro del archivo, y muchas otras funciones utiles. La forma
mas facil de utilizar el comando less es:
1.6. Ejercicios
1. Visualice el tamano del archivo .bash history utilizando el comando ls. Nota: el mismo se encuentra oculto
por estar precedido por un punto.
6. Copiar el archivo en el mismo directorio con el nombre datos2 y verificar que el contenido sea el mismo.
7. Para que sirve el parametro -i del comando cp?
8. Crear el directorio prueba2 y copiar dentro el archivo datos.
2. PERMISOS DE ARCHIVOS
OBJETIVO: Comprender el sistema de permisos para el acceso a archivos y directorios
3
2.1. Comando chmod
chmod - cambia los permisos de acceso de ficheros
SINOPSIS:
chmod [opciones] modo fichero...
Opciones de POSIX: [-R]
Opciones de GNU (en la forma mas corta): [-cfvR] [reference=rfile] [help]
[version] []
DESCRIPCION:
chmod cambia los permisos de cada fichero dado segun modo, que puede ser o bien una representacion simbolica
de los cambios a realizar, o bien un numero octal que representa el patron de bits de los nuevos permisos.
Modo Simbolico:
El formato de un argumento de cambio de modo simbolico es [ugoa...][[+-=][rwxXstugo...]...][,...]. Tal
argumento es una lista de ordenes de cambio de modo simbolico, separadas por comas. Cada orden de cambio de
modo simbolico empieza con cero o mas letras del conjunto ugoa: estas controlan a que usuarios se referiran los
nuevos permisos del fichero cuyos permisos se van a cambiar:
Las letras rwxXstugo seleccionan los nuevos permisos para los usuarios afectados:
(r) lectura.
(w) escritura o modificacion.
(x) ejecucion (para un fichero ejecutable) o permiso de paso (para directorios).
(X) ejecucion solamente si el fichero es un directorio o ya tiene permiso de ejecucion para algun usuario.
(s) activar el bit SUID o SGID para ejecucion.
(t) activar el bit pegajoso.o STI.
(u) los permisos que el usuario propietario del fichero ya tiene.
(g) los que otros usuarios del grupo del fichero, pero no el propietario, ya tienen.
(o) los que otros usuarios distintos de los anteriores ya tienen.
As, chmod g-s fichero quita el bit SGID (establecer el identificador de grupo), chmod ug+s fichero activa los
bits SUID y SGID, pero en cambio chmod o+s fichero no hace nada.
Modo Numerico:
Un modo numerico esta compuesto de 1 a 4 dgitos octales (0-7), formados mediante adicion de los bits de valores
4, 2 y 1. Los dgitos que falten se toman como ceros iniciales. El primer dgito selecciona los atributos SUID (4),
SGID (2) y STI [sticky] (1). El segundo selecciona los permisos para el usuario propietario del fichero: lectura
(4), escritura (2) y ejecucion (1); el tercero, los permisos para otros usuarios del mismo grupo que el fichero, pero
no el propietario, con los mismos valores que antes; y por ultimo, el cuarto dgito selecciona los permisos para los
otros usuarios que no son ni el propietario ni estan en el mismo grupo que el fichero, con los mismos valores de
nuevo. chmod nunca cambia los permisos de enlaces simbolicos; la llamada al sistema chmod(2) no puede cambiar
sus permisos. Esto no es un problema puesto que los permisos de los enlaces simbolicos nunca se usan. Sin embargo,
para cada enlace simbolico puesto en la lnea de ordenes, chmod cambia los permisos del fichero al cual apunta. En
cambio, chmod hace caso omiso de los enlaces simbolicos que encuentre durante el recorrido recursivo de directorios.
OPCIONES DE POSIX
-R Cambia recursivamente los permisos de directorios y sus contenidos.
OPCIONES DE GNU
4
-c, changes Muestra un mensaje mencionando solamente aquellos ficheros cuyos permisos cambian realmente.
-f, silent, quiet No muestrax mensajes de error sobre ficheros cuyos permisos no se pueden cambiar.
-v, verbose Describe prolijamente la accion efectuada o no para cada fichero.
-R, recursive Cambia recursivamente los permisos de directorios y sus contenidos.
OPCIONES ESTANDARES DE GNU
help Muestra un mensaje en la salida estandar sobre el modo de empleo y acaba con codigo de exito.
version Muestra en la salida estandar informacion sobre la version y luego acaba con codigo de exito.
Termina la lista de opciones.
reference=rfile (Nueva en fileutils 4.0.) Cambia el modo de file al del fichero rfile.
2.2. Ejercicios
1. En un directorio vaco (nuevo), crear 9 archivos (archiv1,archiv2,etc.) utilizando el comando touch.
Quitarle todos los permisos con el comando chmod a-rwx archiv*
2. Modificar los permisos usando el operador = del chmod, para que queden de la siguiente manera:
[usuario ]@host:$ archiv1 -rwx------ $ chmod u=rwx,go= archiv1
[usuario ]@host:$ archiv2 -rw------- $
[usuario ]@host:$ archiv3 -rwxrwxrwx $ chmod a=rwx archiv3
[usuario ]@host:$ archiv4 -rwxrw-r-- $
[usuario ]@host:$ archiv5 -rwxr----- $
[usuario ]@host:$ archiv6 -r-xrw-r-- $
[usuario ]@host:$ archiv7 -r-------x $
[usuario ]@host:$ archiv8 -rw-r--r-- $
[usuario ]@host:$ archiv9 -rw-rw-r-- $
3. Modificar los permisos de los archivos anteriores utilizando los operadores + y - del chmod para que queden
de la siguiente manera (Los cambios son relativos a los archivos del ejercicio anterior):
archiv1 -rwxr (agrega lectura para otros) $ chmod o+r archiv1
archiv2 -r (quita escritura para propietario) $
archiv3 -rw-rw-rw- (quita ejecucion para todos) $chmod a-x archiv3
archiv4 -rwx-w- (quita lectura para grupo y otros) $
archiv5 -rwx-wx (quita lectura al grupo, agrega esc. y ejec para otros) $
archiv6 -rwxrw- (agrega escritura al propietario, quita lectura a otros) $
archiv7 -rwx-w- $
archiv8 -r $
archiv9 -rwx $
6. Con una sola instruccion, quitar permisos de lectura, escritura y ejecucion para todos los archivos utilizados
en el ultimo ejercicio.
$
5
7. Crear un directorio y quitarle todos los permisos de ejecucion. Explicar que pasa al intentar entrar al directorio
con el comando cd. Explicar el significado de los permisos r,w y x para directorios.
8. Informarse sobre los grupos a los que pertenece su usuario.
9. Utilizando los comandos chown y chgrp, intentar cambiar el propietario y el grupo del archivo num3. Cual
es el problema?
mostrara por pantalla el contenido del archivo history-final seguido por masters-thesis. Si no se le pasan nombres
de archivos a cat como parametros, leera datos de stdin y los enviara a stdout. Por ejemplo.
Como se puede ver, cada lnea que el usuario teclea es inmediatamente reenviada al monitor por [usuario ]@host:$
cat. Cuando se esta leyendo de la entrada estandar, los comandos reconocen el fin de la entrada de datos cuando
reciben el caracter EOT (end-of-text, fin de texto). Normalmente es generado con la combinacion [ctrl-D].
El comando sort toma como entrada lneas de texto (de nuevo leera desde stdin si no se le proporcionan
nombres de archivos en la lnea de comandos), y devuelve la salida ordenada a stdout. Pruebe lo siguiente:
6
[usuario ]@host:$ sort > shopping-list
peras
manzanas
bananas
[ctrl-D]
[usuario ]@host:$
Como puede ver, el resultado de sort no se muestra por pantalla, en su lugar es salvado en el archivo shopping-
list, el cual se puede ver as:
[usuario ]@host:$ cat shopping-list
bananas
manzanas
peras
[usuario ]@host:$
Ya podemos ordenar la lista de la compra y ademas guardarla. Creemos ahora otro listado desordenado de
nuestras futuras compras en el shopping:
Al no especificar al cat un nombre de archivo, tomara la entrada de la entrada estandar (teclado) y la salida se
redirecciona a un archivo llamado items.
Hay otra forma de hacer esto. No solo puede ser redireccionada la salida estandar, tambien puede ser redirec-
cionada la entrada estandar usando el smbolo <.
Tecnicamente, sort < items es equivalente a sort items, pero nos permite demostrar que sort < items se
comporta como si los datos del archivo fueran tecleados por la entrada estandar. El interprete de comandos es quien
maneja las redirecciones. sort no recibe el nombre del fichero (items) a leer. Desde el punto de vista de sort, esta
leyendo datos de la entrada estandar como si fueran enviados desde el teclado.
7
3.4. Filtros
Un filtro es un programa que lee datos de la entrada estandar, los procesa de alguna forma, y devuelve los datos
procesados por la salida estandar. Usando la redireccion la entrada estandar y/o salida estandar pueden ser archivos.
sort es un filtro simple: ordena los datos de entrada y enva el resultado a la salida estandar.
cat es incluso mas simple, no hace nada con los datos de entrada, simplemente enva a la salida cualquier cosa que
le llega
Si en su lugar, usamos el smbolo >>, la salida sera anadida al final del archivo nombrado, en lugar de ser
sobrescrito.
Anadira la salida de ls al final de file-list. Es conveniente tener en cuenta que las redirecciones son caractersticas
proporcionadas por el interprete de comandos. Este, proporciona estos servicios mediante el uso de la sintaxis >,
>> y <.
3.7. Ejercicios
1. Crear un archivo llamado listado bin que contenga el listado del directorio /bin. Uso obligatorio de: ls; >
$
2. Crear un archivo llamado listado sbin que contenga el listado del directorio /sbin. Uso obligatorio de: ls; >
$
3. Crear un archivo llamado binarios que contenga ambos listados. Uso obligatorio de: cat; >
$
4. Ordenar alfabeticamente el listado binarios y guardar el resultado en un archivo binarios2. Uso obligatorio
de: sort; <; >
$
8
5. Verificar que los datos en binarios2 sean correctos.
6. Crear un archivo llamado datosv con los siguientes datos personales dentro: Nombre, apellido y CC. Uso
obligatorio de: cat; >
$
7. Agregar a datosv una lnea que indique el directorio actual. Uso obligatorio de: pwd; >>
$
8. Agregar a datosv un listado en formato largo del directorio /etc. Uso obligatorio de: ls; >>
$
9. Observar (por pantalla) el archivo datosv resultante a traves del filtro more y verificar que los datos esten
correctos. Uso obligatorio de: more; <
$
[usuario ]@host:$ ls
english-list
history-final
masters-thesis
notes
[usuario ]@host:$ ls > file-list
[usuario ]@host:$ sort -r file-list
notes
masters-thesis
history-final
english-list
[usuario ]@host:$
Aqu, salvamos la salida de ls en un archivo, y entonces ejecutamos sort -r sobre ese archivo. Pero esta forma
necesita crear un archivo temporal en el que salvar los datos generados por ls.
La solucion es usar las pipes. El uso de pipes es otra caracterstica del interprete de comandos, que nos permite
conectar una cadena de comandos en un pipe, donde la stdout del primero es enviada directamente a la stdin
del segundo y as sucesivamente. Queremos conectar la salida de ls con la entrada de sort. Para crear un pipe se
usa el smbolo | :
9
Esta forma es mas corta y obviamente mas facil de escribir. Otro ejemplo util, usando el comando:
mostrara una lista larga de los archivos, la mayora de los cuales pasara rapidamente ante nuestros ojos sin que
podamos leerla. En lugar de esto, usemos more para mostrar la lista de archivos en /usr/bin.
Ahora podemos ir avanzando pagina a pagina comodamente. Pero el potencial de los pipes no termina aqu.
Podemos .entubarmas de dos comandos a la vez. El comando head es un filtro que muestra la primeras lneas del
canal de entrada (aqu la entrada desde una pipe). Si queremos ver el ultimo fichero del directorio actual en orden
alfabetico, usaremos:
Donde head -1 simplemente muestra la primera lnea de la entrada que recibe en este caso, el flujo de datos
ordenados inversamente provenientes de ls.
4.2. Ejercicios
1. Obtener un listado en orden alfabetico inverso de los primeros 3 comandos del directorio /bin. Ayuda: (posible
resultado: cat,bash,arch). Utilizar: ls, sort y head.
$
2. Obtener el mismo resultado que en el ejercicio anterior, pero utilizando el comando tail en vez de head.
$
3. Contar la cantidad de archivos en el directorio /bin. Ayuda: Para contar palabras se utilizara el comando wc
-w.
$
4. Buscar dentro de /usr/doc o /usr/share/doc algun archivo de texto comprimido (extension .gz). Una vez
elegido el archivo, observar el contenido con el comando zcat. Ordenar las lneas alfabeticamente y mostrar
el resultado a traves del less. Todo usando pipes.
$
5. Obtener (utilizando una sola lnea de comandos y pipes) un archivo donde figuren todos los usuarios y los
grupos definidos en el sistema, ordenados alfabeticamente. Visualizar a traves del less. Ayuda: (El archivo
/etc/passwd contiene una lnea por cada usuario definido en el sistema. En el comienzo de la lnea figura el
nombre del usuario. Algo similar ocurre con los grupos, en el archivo /etc/group). Utilizar cat para juntar
ambos archivos, ordenar las lneas alfabeticamente y mostrar el resultado.
$
6. Obtener la cantidad de usuarios y grupos definidos en el sistema (suma de ambos). Ayuda: Similar al ejercicio
anterior, pero contando la cantidad de lneas del archivo concatenado.
$
5. EXPRESIONES REGULARES
OBJETIVO: Utilizar expresiones regulares de linux
10
5.1. Construccion de expresiones regulares
Las expresiones regulares se utilizan para hacer busquedas contextuales y modificaciones sobre textos. Se pueden
encontrar en muchos editores de textos avanzados, en programas de analisis gramatical y en muchos lenguajes. Para
practicar las expresiones regulares utilizaremos el comando grep.
caracter de correspondencia multiple. Cero o mas apariciones del caracter previo. Se utiliza
en combinacion con . y con los rangos.
Ejemplo:
f.*o (texto que empiezan con f y termina con o)
^
Ancla de comienzo de lnea
Ejemplo:
j
(lnea que comienza con j)
? El signo de interrogacion especifica cero o una ocurrencia del caracter precedente. Ejemplo:
pesos? coincide con la cadena peso o con pesos.
+ El smbolo mas indica especifica una o mas ocurrencias del caracter precedente. Por lo que
la expresion [0 9]+ es equivalente a la expresion [0 9][0 9]
Ejemplo:
Para buscar el texto hello world dentro del archivo main.c
[usuario ]@host:$ grep hello world main.c
[usuario ]@host:$ grep hello world <main.c
[usuario ]@host:$ cat main.c | grep hello world
(las tres lneas hacen lo mismo)
5.3. Ejercicios
1. Para trabajar utilizaremos un archivo creado de la siguiente forma:
ls /bin/ > b.txt (si el ls utiliza colores usar \ls /bin/ > b.txt )
11
2. Buscar dentro de b.txt si esta listado el comando mount (utilizar grep)
$
3. buscar dentro de b.txt comandos que empiecen con fs
$
A diferencia de Windows y MS-DOS, en Linux, ademas de no haber una asignacion de letras a: b: c: d: e: para
las unidades de disco y las particiones, es necesario indicarle al sistema cuando se utilizara una unidad de disco
extraible para poder acceder a esta y cuando se dejara de utilizar para poder retirarla y cambiarla por otra en el
caso de unidades removibles.
La mayora de las tarjetas principales de los computadores tienen capacidad para soportar hasta cuatro discos
duros o unidades IDE. Bajo Linux, los dispositivos fsicos del sistema se acceden a traves de archivos especiales
ubicados en el directorio /dev (devices o dispositivos).
12
Particiones ejemplo
Particiones primarias primera /dev/hda1
Segunda /dev/hda2
Tercera /dev/hda3
Cuarta /dev/hda4
Para el caso del cdrom, existe normalmente un dispositivo /dev/cdrom que es un link (puntero) a la ubicacion
real del dispositivo (por ejemplo a /dev/hdc si esta conectado como maestro en la IDE2)
Aprender la utilizacion de los comandos mount y umount es necesario si se quiere entender que es lo que real-
mente ocurre en un sistema Linux cuando utilizamos una aplicacion grafica o los iconos del escritorio para acceder
a las unidades de disco (cdrom, floppys, etc.). Sabiendo que particion o dispositivo deseamos montar y su tipo, la
sintaxis a utilizar como root para el comando mount sera del siguiente modo:
13
Como ejemplo supondremos que deseamos montar el dispositivo /dev/hda1, que corresponde a la particion don-
de se encontrara la instalacion Windows, en un punto de montaje que previamente hemos creado, /mnt/windows/.
La lnea de comando correspondera a la siguiente:
Hecho lo anterior, podremos acceder a los directorios contenidos en dicha particion donde estara instalado Win-
dows, con solo cambiar a /mnt/windows/:
root@host:$ cd /mnt/windows/
Utilice el comando ls a fin de ver el contenido del directorio en el cual ahora se encuentra:
root@host:$ ls -l
Si en este momento decidiesemos desmontar la unidad con el comando umount, el sistema nos enviara un men-
saje de error indicandonos que no es posible desmontar la unidad pues esta se encuentra ocupada. A fin de poder
desmontar dicha unidad, es necesario salir de esta y que ningun otro proceso o programa se encuentre utilizando
algun contenido de dicha unidad. Es decir, ejecutemos lo siguiente:
root@host:$ cd ~
Una vez cumplido esto, solo necesitara ejecutar el siguiente comando para desmontar /dev/hda1 de /mnt/win-
dows/:
El primer campo describe el dispositivo especial de bloque o sistema de archivos remoto a ser montado.
El segundo campo describe el punto de montaje para el sistema de archivos. Para particiones de intercambio
(swap), este campo debe decir none.
El tercer campo describe el tipo del sistema de archivos (ext2, vfat, msdos, etc).
El cuarto campo describe las opciones de montaje asociadas con el sistema de archivos. Es una lista de
opciones separadas por comas. Contiene como mnimo el tipo de montaje y otras opciones apropiadas para
el tipo del sistema de archivos. Las distintas opciones para sistemas de archivos locales estan documentadas
en mount(8). Las siguientes opciones son comunes para cualquier tipo de sistema de archivos: noauto (no
monta el sistema cuando se ejecuta mount -a, p.ej., cuando arranca el sistema), y user (permite que un
usuario monte el sistema de archivos). Para mayor informacion, vease mount(8).
Normalmente solo el root puede modificar este archivo. Si esta definido en el archivo /etc/fstab los usuarios
podran montar un dispositivo especificando solo el punto de montaje, o solo el dispositivo. Por ejemplo:
14
Por ejemplo si tenemos una particion windows en /dev/hda1 y queremos que tambien los usuarios, y no solo
root, puedan montarla , es necesario que la particion o unidad de disco este especificada en el fichero /etc/fstab del
siguiente modo:
La lnea especfica que del dispositivo /dev/hda1 que tendra como punto de montaje /mnt/windows/ y que
posee formato FAT o FAT32 -vfat-, podra ser montada y desmontada por los usuarios -user- en modo de lectura
y escritura -rw-, con permisos de ejecucion de programas -exec-, sin permitir la ejecucion de programas con SUID
-nosiud-, y que el contenido de la particion le pertenecera por defecto al grupo users -gid=100-, al cual pertenecen
todos los usuarios del sistema, y dicha particion, al igual que las unidades de disco extrable, no sera montada
durante el arranque del sistema -noauto-. Los usuarios sin privilegios solo tendran que ejecutar la siguiente lnea
de comando para poder montar y acceder a la particion que corresponde a la instalacion de Windows
Un ejemplo de /etc/fstab para configurar una particion de Windows, unidad de floppy, unidad de CDROM y
Zip Drive IDE/ATAPI:
La lnea /dev/hda3 corresponde al sistema de archivos principal / o root donde reside nuestro sistema de archi-
vos mas importante.
6.4. Ejercicios
1. Investigar el archivo /etc/fstab del sistema. Cual es la lnea correspondiente a la unidad de CDROM?
2. Utilizar el comando mount para listar los dispositivos montados actualmente.
3. Hay algo montado en forma remota a traves de NFS? Si lo hay, aclarar fuente y punto de montaje.
7. Verificar la copia haciendo un cat y luego desmontar la memoria. Es importante desmontar siempre la unidad
antes de quitar el medio fsico.
8. Si colocamos una lectora de cdrom como esclava en la segunda controladora IDE, como montamos un cd
formato iso, siendo root?
9. Si queremos facilitar y permitir el uso de esta lectora a los usuarios, que lnea debemos agregar al /etc/fstab?
10. Cuando se utiliza la opcion defaults en /etc/fstab, que opciones se estan usando realmente?
11. Para que sirve la opcion -a en los comandos mount y umount
15
7. CONTROL DE PROCESOS
OBJETIVO: Comprender el manejo de procesos en linux
[usuario ]@host:$ ps
PID TTY STAT TIME COMMAND
24 3 S 0:03 (bash)
161 3 R 0:00 ps
[usuario ]@host:$
La columna PID representa el identificador de proceso. La ultima columna COMMAND, es el nombre del proceso que
se esta ejecutando. Ahora solo estamos viendo los procesos que esta ejecutando [usuario]. Vemos que hay dos pro-
cesos, bash (Que es el shell o interprete de comandos que usa [usuario]), y el propio comando ps. El bash ejecuto ps
cuando [usuario] tecleo el comando. Cuando ps termina de ejecutarse (despues de mostrar la tabla de procesos),
el control retorna al proceso bash, que muestra el prompt, indicando que esta listo para recibir otro comando. Un
proceso que esta corriendo se denomina tarea para el shell. Los terminos proceso y tarea, son intercambiables. Sin
embargo, se suele denominar tarea a un proceso, cuando se usa en conjuncion con control de tareas, que es un
rasgo del shell que permite cambiar entre distintas tareas.
Hay muchos mas procesos aparte de estos corriendo en el sistema, para verlos todos, teclearemos el comando ps
-aux. En muchos casos, los usuarios solo ejecutan un trabajo cada vez, que es el ultimo comando que teclearon desde
el shell. Sin embargo, usando el control de tareas, se podra ejecutar diferentes tareas al mismo tiempo, cambiando
entre cada uno de ellos conforme se necesite. Cuan beneficioso puede llegar a ser esto?. Supongamos que estamos
con un procesador de textos, y de repente necesitamos parar y realizar otra tarea. Con el control de tareas se
podra suspender temporalmente el editor, y volver al shell para realizar cualquier otra tarea, y luego regresar al
editor como si no lo hubiese dejado nunca. Lo siguiente solo es un ejemplo, hay montones de usos practicos del
control de tareas.
Algunos programas necesitan mucho tiempo para terminar, y no hacen nada interesante mientras tanto. Com-
pilar programas es una de estas tareas, as como comprimir un fichero grande. No tiene sentido que se siente y se
aburra mientras estos procesos terminan. En estos casos es mejor lanzarlos en segundo plano, para dejar la compu-
tadora en condiciones de ejecutar otro programa.
Los procesos se pueden suspender: Un proceso suspendido es aquel que no se esta ejecutando actualmente,
sino que esta temporalmente parado. Despues de suspender una tarea, puede indicar a la misma que continue, en
primer plano o en segundo, segun necesite. Retomar una tarea suspendida no cambia en nada el estado de la misma,
la tarea continuara ejecutandose justo donde se dejo.
Suspender un trabajo no es lo mismo que interrumpirlo: Cuando usted interrumpe un proceso (general-
mente con la pulsacion de CTRL-C), el proceso muere, y deja de estar en memoria y utilizar recursos del ordenador.
Una vez eliminado, el proceso no puede continuar ejecutandose, y debera ser lanzado otra vez para volver a realizar
16
sus tareas. Tambien se puede dar el caso de que algunos programas capturan la interrupcion, de modo que pulsando
CTRL-C no se para inmediatamente. Esto se hace para permitir al programa realizar operaciones necesarias de
limpieza antes de terminar. De hecho, algunos programas simplemente no se dejan matar por ninguna interrupcion.
La serie de y-es continuara hasta el infinito, a no ser que usted la elimine, pulsando la tecla de interrupcion,
generalmente CTRL-C. Tambien puede deshacerse de esta serie de y-es redirigiendo la salida estandar de yes hacia
/dev/null, que como recordara es una especie de agujero negro o papelera para los datos. Todo lo que usted enve
all, desaparecera.
Supongamos ahora que queremos dejar que el comando yes siga ejecutandose, y volver al mismo tiempo a la
shell para trabajar en otras cosas. Para ello enviaremos a yes a segundo plano, lo que nos permitira ejecutarlo, pero
sin necesidad de interaccion. Una forma de mandar procesos a segundo plano es anadiendo un caracter & al final
de cada comando.
Como podra ver, ha regresado al shell. Pero que es eso de [1] 164?, Se esta ejecutando realmente el comando
yes? [1] representa el numero de tarea del proceso yes. El shell asigna un numero a cada tarea que se este ejecutando.
Como yes es el unico comando que se esta ejecutando, se le asigna el numero de tarea 1. El numero 164 es el
numero de identificacion del proceso, o PID, que es el numero que el sistema le asigna al proceso. Ambos numeros
pueden usarse para referirse a la tarea como veremos despues.
Ahora usted tiene el proceso yes corriendo en segundo plano, y enviando constantemente la senal y hacia el
dispositivo /dev/null. Para chequear el estado del proceso, utilice el comando interno de la shell jobs:
Ah esta!. Tambien puede usar el comando ps, como mostramos antes, para comprobar el estado de la tarea.
Para eliminar una tarea, utilice el comando kill Este comando toma como argumento un numero de
tarea o un numero de ID de un proceso. Esta era la tarea 1, as que usando el comando:
[usuario ]@host:$ kill %1 Matara la tarea.
Cuando se identifica la tarea con el numero de tarea, se debe preceder el numero con el caracter de porcentaje
( % ). Ahora que ya hemos matado la tarea, podemos usar el comando jobs de nuevo para comprobarlo:
17
[usuario ]@host:$ jobs
[1]+ Terminated yes > /dev/null
[usuario ]@host:$
La tarea esta, en efecto, muerta, y si usa el comando jobs de nuevo, no mostrara nada. Tambien podra matar
la tarea usando el numero de ID de proceso (PID), el cual se muestra conjuntamente con el ID de tarea cuando
arranca la misma. En nuestro ejemplo el ID de proceso es 164, as que el comando:
De nuevo, dado que yes corre en primer plano, no debe retornar el prompt de la shell. Ahora, en vez de inte-
rrumpir la tarea con CTRL-C, suspenderemos la tarea. El suspender una tarea no la mata: solamente la detiene
temporalmente hasta que se desee retomarla. Para hacerlo debemos pulsar la tecla de suspender, que suele ser
CTRL-Z.
El shell muestra el nombre del comando de nuevo, de forma que tenga conocimiento de que tarea es la que ha
puesto en primer plano. Pare la tarea de nuevo, con CTRL-Z. Esta vez utilice el comando bg para poner la tarea
en segundo plano. Esto hara que el comando siga ejecutandose igual que si lo hubiese hecho desde el principio con
& como en la seccion anterior.
[usuario ]@host:$ bg
[1]+ yes >/dev/null &
[usuario ]@host:$
Y tenemos de nuevo el prompt. El comando jobs debera decirnos que yes se esta ejecutando, y podemos matar
la tarea con kill tal y como lo hicimos antes.
Como podemos parar la tarea de nuevo? Si pulsa CTRL-Z no funcionara, ya que el proceso esta en segundo
plano. La respuesta es poner el proceso en primer plano de nuevo, con el comando fg, y entonces pararlo. Como
puede observar, podra usar fg tanto con tareas detenidas, como con las que esten corriendo en segundo plano.
Hay una gran diferencia entre una tarea que se encuentra en segundo plano, y una que se encuentra detenida.
Una tarea detenida es una tarea que no se esta ejecutando, es decir, que no usa tiempo de CPU, y que no esta
haciendo ningun trabajo (la tarea aun ocupa un lugar en memoria, aunque puede ser volcada a disco). Una tarea
en segundo plano, se esta ejecutando, y usando memoria, a la vez que completando alguna accion mientras usted
18
hace otro trabajo. Sin embargo, una tarea en segundo plano puede intentar mostrar texto en su terminal, lo que
puede resultar molesto si esta intentando hacer otra cosa. Por ejemplo, si uso el comando:
[usuario ]@host:$ yes &
sin redirigir stdout a /dev/null, una cadena de y-es se mostraran en su monitor, sin modo alguno de interrumpirlo
(no puede hacer uso de CTRL-C para interrumpir tareas en segundo plano). Para poder parar esas interminables
y-es, tendra que usar el comando fg para pasar la tarea a primer plano, y entonces usar CTRL-C para matarla.
Otra observacion: Normalmente, los comandos fg y bg actuan sobre el ultimo proceso parado (indicado por
un + junto al numero de tarea cuando usa el comando jobs). Si usted tiene varios procesos corriendo a la vez,
podra mandar a primer o segundo plano una tarea especfica indicando el ID de tarea como argumento de fg o bg,
como en:
No se pueden usar los ID de proceso con fg o bg. Ademas de esto, si usa el numero de tarea por s solo, como:
[usuario ]@host:$ %2 es equivalente a [usuario ]@host:$ fg %2
Recordemos que el uso de control de tareas es una utilidad del shell. Los comandos fg, bg y jobs son internos del
shell. Si por algun motivo utilizamos una shell que no soporta control de tareas, no dispondremos de estos comandos.
7.6. Ejercicios
1. Ejecutar en la siguiente secuencia:
[usuario ]@host:$ bash
[usuario ]@host:$ yes > /dev/null &
[usuario ]@host:$ yes > /dev/null &
[usuario ]@host:$ bash
[usuario ]@host:$ ping host valido > /dev/null &
[usuario ]@host:$ ping otro host valido > /dev/null &
19
4. Leer la pagina de manual del ls. Suspender el proceso. Leer la pagina de manual del cat. Suspender el proceso.
Hacer un ping a otra maquina. Suspender el proceso. Que otros procesos se han disparado? De que proceso
son hijos?
5. Retomar el proceso man ls en primer plano y terminarlo normalmente
6. Pasar el proceso pin de suspendido a ejecucion en segundo plano. Eliminar luego el proceso ping.
7. Ejecutar un procesos [usuario ]@host:$ yes > /dev/null & y un [usuario ]@host:$ ping host > /dev/null
&. Cuanto porcentaje de cpu consume cada uno? es constante?
8. Matar todos los procesos que han quedado perdidos.antes de cerrar las sesiones.
8. COMPRESION DE ARCHIVOS
OBJETIVO: Conocer herramientas mas utilizadas para el empaquetado y compresion de archivos
donde opcioneses la lista de comandos y opciones para tar, y archivo1hasta archivoNes la lista de archivos
a anadir o extraer del archivo empaquetado. Por ejemplo, el comando
# tar cvf backup.tar /etc
En el primer argumento de tar (cvf), la opcion c le dice a tar que cree un nuevo archivo (create). La opcion
v fuerza a tar en el modo verbose, imprimiendo los nombres de los archivos segun se empaquetan. La opcion f
le dice a tar que el siguiente argumento (backup.tar) es el nombre del archivo a crear. El resto de los argumentos
de tar son los nombres de archivos y directorios a anadir al archivo empaquetado.
el nombre de directorio /etc se anadio al principio de cada nombre de archivo. Para poder extraer los archivos
en el directorio correcto, se necesitara utilizar los siguientes comandos:
# cd /
# tar xvf backup.tar
Ya que los archivos se extraen con el nombre de camino almacenado. Sin embargo, si se empaquetaron los
archivos con los comandos:
# cd /etc
# tar cvf hosts group passwd
Los nombres de directorio no se salvaron en el archivo empaquetado. Por esto se necesitara hacer cd /etc.antes
de extraer los archivos. Como se puede ver, el como haya sido creado un archivo tar marca una gran diferencia en
como se extrae. Se puede usar el comando:
# tar tvf backup.tar
20
para mostrar unndic del archivo tar antes de desempaquetarlo. De esta forma se puede ver que directorio
se utilizo como origen de los nombres de los archivos, y se puede extraer el archivo desde la localizacion correcta.
Ademas agregando el switch z utiliza el gzip y el gunzip para comprimir / descomprimir.
Por ejemplo:
# gzip -9 backup.tar
Comprimira backup.tar y lo dejara como backup.tar.gz, que es la version comprimida del archivo tar. La opcion
-9 le dice a gzip que utilice el mayor factor de compresion.
El resultado sera backup.tar.gz. Para desempaquetar este archivo, se usan los comandos contrarios:
# gunzip backup.tar.gz
# tar xvf backup.tar
Si se quieren comprimir todos los archivos de un directorio se debe usar * en <archivos a comprimir>.
Para descomprimirlos se debe usar el comando unzip. El formato del comando unzip es:
# unzip <nombre_archivo_comprimido>
21
-r: comprime todos los subdirectorios y archivos bajo el directorio donde estamos, o donde le indicamos.
-i: Incluye solo los archivos que especificamos, por ejemplo: # zip todo * -i (backslash) .txt (solo comprimira
los archivos que finalicen con .txt).
-f: Si ya hemos creado un .zip de nuestros archivos, pero periodicamente modificamos estos, con este argumento
no hace falta crear el .zip de nuevo, este agrega los cambios de nuestros archivos en el zip, basandose en la fecha de
creacion de estos. Esta opcion no funciona como -u, no agrega archivos nuevos a nuestro zip, solo actualiza los que
ya estan.
-q: Trabaja en modo silencioso, es decir, elimina todos los mensajes informativos.
-u: Actualiza los archivos que hemos modificado, y tambien agrega archivos a nuestro .zip. # zip -u nombre
archivo comprimidoarchivo a agregar
-x: Esta opcion sirve para excluir uno o varios archivos en nuestro .zip. # zip nombre archivo* -x (backs-
lash)*.Z (se excluyen los archivos Z de nuestro .zip)
-y : Esta opcion sirve para guardar los links en el zip como links en vez de guardar el archivo al que apunta el
link.
Nota: El comando ls genera la lista que es mandada a traves de un pipe para que cpio la reciba, y empaquete
los archivos. Cuando queremos sacar los archivos ejecutamos el siguiente comando:
22
# cpio -tv < archivo.cpio
8.11. Ejercicios
1. Buscar algun archivo de texto comprimido con gzip (*.gz); Ayuda: para buscar archivos, utilizar el comando
locate Archivo elegido:
2. Utilizar cat para ver el contenido. (Si la terminal queda mal configurada, comando reset)
3. Utilizar zcat para ver el contenido. Si es muy largo el texto pasarlo a traves de less o more.
4. descomprimir el archivo ( en /tmp)
11. Extraer los archivos desde el archivo cpio creado en el punto anterior en el directorio /sbin.
12. Generar un archivo bzip2 que contenga todos los archivos del directorio /sbin.
Generar un archivo zip que contenga todos los archivos del directorio /sbin.
Generar un archivo tar.gz que contenga todos los archivos del directorio /sbin.
Anotar los tamanos de los archivos resultantes.
Nota: Si los tamanos difieren demasiado, puede deberse a la inclusion o no de links.en la compresion. Para
que la comparacion sea valida, incluir los archivos apuntados con links dentro de los archivos comprimidos.
(El significado de links o enlaces se vera mas adelante)
Sbin.cpio
Sbin.zip
Sbin.bz2
Sbin.tar.gz
9. BUSQUEDA DE ARCHIVOS
OBJETIVO: Conocer herramientas mas utilizadas en la busqueda de archivos
23
9.1. COMANDO find
El comando FIND, es el comando que se encarga de buscar archivos. Para utilizarlo, debemos saber algun dato
que nos ayude en la busqueda, por ejemplo: su nombre, parte de su nombre, fecha de creacion, tamano, etc. Casi
siempre cuando se busca un archivo, se lo busca por su nombre, o parte de el. Para buscar un archivo por su
nombre, hay que ejecutar el comando find, seguido del directorio en el cual queremos buscar (ruta a partir de la
cual comenzar a buscarlo), la opcion -name , y el nombre, o parte, del nomre del archivo. La sintaxis del comando
find para busquedas por nombre de archivo es:
El comando find buscara todos los archivos que coincidan con <nombre archivo> realizando esta busqueda en
el directorio <ruta de inicio> y todos los subdirectorios del mismo en forma recursiva. Ejemplo:
Buscara en todo el sistema (por debajo del directorio raz /) archivos con el nombre main.c Ahora veamos
otro ejemplo. Si no recordamos el nombre del archivo, pero s, que lo creamos hace dos das, existe una solucion, la
cual es, buscar todos los archivos del sistema, creados luego de cierto tiempo.
# find / -ctime 2
Esto nos mostrara todos los archivos creados a partir de hace dos das.
Tambien puede pasar que no recordemos ni el nombre ni cuando fue creado, pero si que sepamos que el tamano
es de 650 Kb y que debe estar dentro de nuestro directorio home. Podemos buscar los archivos que tengan un
tamano de 650 Kb bajo nuestro directorio home usando:
El comando find tambien permite buscar archivos por propietario, grupo, por tipo de permisos, por tipo de
archivo y otras opciones mas. Ademas se pueden realizar busquedas compuestas por dos criterios. Para una des-
cripcion detallada de este comando consultar las paginas de manual (man find). Tambien existen ejemplos en info
find El comando find, es una utilidad realmente buena, pero a veces, puede resultar un poco lenta. Existen otras
utilidades que son mas rapidas, con las que se puede obtener listados de archivos, que coincidan con lo que se quiere
buscar
# locate <nombre_archivo>
El comando locate tiene otras opciones, para un listado completo de las mismas, consultar man locate.
# which <nombre_ejecutable>
24
9.4. COMANDO: whereis
Este comando busca por directorios, y devuelve la ubicacion de los ejecutables, codigos fuente y paginas de
manual que concuerden con la busqueda. En s, se puede decir que el comando whereis, sirve para ver donde esta
X programa, en el sistema de archivos. El formato simple del comando whereis es:
# whereis <nombre_ejecutable>
El -H nos informa el archivo al que pertenece la lnea encontrada. Como alternativa sencilla al find, tambien
podramos buscar archivos con el siguiente comando:
Para buscar archivos comprimidos con gzip que ademas esten debajo de /home podramos usar:
9.6. Ejercicios
1. Buscar en el directorio /usr y subdirectorios, directorios que comienzen con man. Utilizar find (ver las
opciones name y type).
2. Crear en (home/usuario) un archivo de la siguiente forma: touch APELLIDO.NOMBRE reemplazando
NOMBRE y APELLIDO. Cambiar de directorio y buscar el archivo con el comando locate. Se encontro?
Por que? Realizar la busqueda en (home/usuario) combinando ls con grep
3. Utilizar locate pare encontrar archivos comprimidos con gzip, pero que se encuentren en /usr/doc (combinar
locate con grep)
4. Encontar el binario ifconfig y su pagina de manual. Binario:
Manual:
5. Utlizar grep para ubicar archivos en /etc que contengan el texto tcp. Utilizar less para ver los resultados.
(hacer que grep nos informe de que archivo proviene cada resultado)
6. Ahora, realizar la misma busqueda pero para lneas que ademas de tcp tengan el texto 80 Que archivos
da como resultado?
7. Crear un directorio nuevo. Copiar al mismo 5 archivos de texto comprimidos con gzip. Realizar una busqueda
de texto dentro de los 5 archivos (usar zcat y grep).
8. Explicar para que sirve la opcion -mount o -xdev del find.
9. Buscar en /etc archivos con permisos 0600 (lectura y escritura solo para el propietario root)
10. Como podra obtenerse el mismo resultado utilizando el comando ls en conjunto con grep?
25
10. INFORMACION DEL SISTEMA
OBJETIVO: Identificar recursos y componentes hardware del sistema
Hay varios comandos que nos permiten obtener informacion sobre el hardware y el software de nuestro siste-
ma GNU/Linux. La misma informacion se puede obtener muchas veces por diferentes metodos. A veces existen
variaciones segun las distribucion sobre la que estemos trabajando o la version del kernel utilizada. Mucha de la
informacion del hardware de nuestro sistema puede accederse a traves del directorio /proc, llamado pseudo-sistema
de archivos. Para una descripcion detallada del mismo consultar la pagina de manual man proc(Descripcion del
contenido del pseudo-sistema de archivos proc)
A continuacion se presenta una lista con algunas de las herramientas basicas para obtener informacion acerca
de las caractersticas de nuestro sistema:
10.5. Discos
Comando : df - Espacio total y utilizado por cada filesystem. Punto de montaje
Comando: mount - Discos montados
Archivo : /etc/fstab -filesystems montados en el arranque y mas utilizados.
Archivo : /etc/mtab -filesystems montados actualmente.
Archivo : /proc/mounts -Discos montados
Archivo : /proc/swaps -Discos swap
26
Archivo : /proc/partitions (particiones, bloques)
Archivos dentro de: /proc/ide o /proc/scsi
Por ejemplo:
/proc/ide/hda/geometry - Geometra del disco
/proc/ide/hda/model - Modelo
/proc/ide/hda/media - Tipo (disco, cdrom,etc)
Comando : cfdisk o sfdisk (solo como root)
Comando : fdlist (listado de dispositivos de discos removibles)
10.7. Generales
Comando : dmesg - Examinar el buffer anillo del Kernel. Utilizado por ejemplo para visualizar la informacion
que presenta el sistema en el arranque.
Comando : uptime - Muestra el tiempo que el sistema estuvo encendido, la hora, la cantidad de usuarios y la carga
promedio.
Archivo : /proc/rtc - Informacion sobre la configuracion del hardware del reloj de tiempo real.
Archivo : /proc/filesystems - Filesystems soportados
Comando : history - Historial de comandos del bash (.bash history)
Comando : set -Muestra todas las variables del shell. Algunas variables nos muestran como esta configurado el
entorno.
10.8. Ejercicios
1. Nombre de host:
2. IP:
3. Modelo de procesador:
4. Velocidad:
5. Memoria :
6. Tamano de disco rgido:
7. modelo:
8. geometra:
9. Particiones
10. nombre: tama~
no: utilizado: tipo(ext2/swap):
11. nombre: tama~
no: utilizado: tipo:
12. nombre: tama~
no: utilizado: tipo:
13. nombre: tama~
no: utilizado: tipo:
14. Distribucion:
15. Version del Kernel:
16. Modulo de placa de red:
27
17. Tiempo de funcionamiento del sistema:
Aqu, el archivo foo tiene el numero de inodo 22192 en el sistema de archivos. Podemos crear otro enlace a foo,
llamado bar:
# ln foo bar
Ahora, accediendo a foo o a bar accederemos al mismo archivo. Si hace cambios en foo, estos cambios tambien
seran efectuados en bar. Para todos los efectos, foo y bar son el mismo archivo. Estos enlaces son conocidos como
enlaces duros (hard links) porque directamente crean el enlace al inodo. Notese que solo podemos crear enlaces duros
entre archivos del mismo sistema de archivos. Los enlaces simbolicos (ver mas adelante) no tienen esta restriccion.
Cuando borra un archivo con rm, esta solamente borrando un enlace a un archivo. Si usa el comando
# rm foo
La orden ls -i mostrara los numeros de inodo. Solo el enlace de nombre foo es borrado; bar todava existira. Un
archivo es borrado definitivamente del sistema cuando no quedan enlaces a el. Usualmente, los archivos tienen un
unico enlace, por lo que el uso de rm los borra. Pero si el archivo tiene multiples enlaces, el uso de rm solo borrara
un unico enlace; para borrar el archivo, debera borrar todos los enlaces del archivo. La orden ls -l muestra el
numero de enlaces a un archivo (entre otra informacion).
# ls -l foo bar
-rw-r--r-- 2 root root 12 Aug 5 16:51 bar
-rw-r--r-- 2 root root 12 Aug 5 16:50 foo
La segunda columna en el listado, 2, especifica el numero de enlaces al archivo. Un directorio no es mas que
un archivo que contiene informacion sobre la translacion enlace a inodo. Tambien, cada directorio tiene al menos
28
dos enlaces duros en el: . (un enlace apuntando a s mismo) y . (un enlace apuntando al directorio padre). En
el directorio raz (/), el enlace .. simplemente apunta a /.
crearemos un enlace simbolico bar apuntando al archivo foo. Si usamos ls -i, veremos que los dos archivos
tienen inodos diferentes, en efecto.
# ls -i foo bar
22195 bar 22192 foo
#
De cualquier modo, usando ls -l vemos que el archivo bar es un enlace simbolico apuntando a foo.
# ls -l foo bar
lrwxrwxrwx 1 root root 3 Aug 5 16:51 bar -> foo
-rw-r--r-- 1 root root 12 Aug 5 16:50 foo
#
Los bits de permisos en un enlace simbolico no se usan (siempre aparecen como rwxrwxrwx). En su lugar, los
permisos del enlace simbolico son determinados por los permisos del archivo apuntado por el enlace (en nuestro
ejemplo, el archivo foo). Funcionalmente, los enlaces duros y simbolicos son similares, pero hay algunas diferencias.
Por una parte, se puede crear un enlace simbolico a un archivo que no existe; lo mismo no es cierto para enlaces
duros. Los enlaces simbolicos son procesados por el nucleo de forma diferente a los enlaces duros, lo cual es solo una
diferencia tecnica, pero a veces importante. Los enlaces simbolicos son de ayuda puesto que identifican al archivo al
que apuntan; con enlaces duros no hay forma facil de saber que archivo esta enlazado al mismo inodo. Los enlaces
se usan en muchas partes del sistema Linux. Los enlaces simbolicos son especialmente importantes para el sistema
de libreras compartidas en /lib. La operacion rm sobre un fichero simbolico no actua sobre el fichero apuntado
sino sobre el propio enlace simbolico destruyendolo.
11.4. Ejercicios.
1. Crear un archivo de texto llamado ej0 que contenga su NOMBRE y AELLIDO.
2. Crear un par de enlaces duros con ej0 llamados hard1 y hard2.
3. Crear un enlace simbolico a ej0 llamado sym1
Figura 1: img1
29
Los enlaces rgidos no muestran nada particular listados con ls -l pero los enlaces simbolicos vienen acom-
panados de una flecha que apunta a otro nombre de fichero. Hay una columna de numeros a continuacion de
los permisos. Se trata de una columna que indica el numero de enlaces rgidos que estan asociados a un mismo
fichero.
En el caso de ej0, hard1 y hard2 aparece un 3 y esta claro porque son enlaces creados por nosotros
pero el directorio dir1 tiene un 2. Esto significa que existe otro enlace rgido para ese directorio que nostros
no hemos creado. Se ha creado automaticamente al crear dir1. Acuerdese que todos los directorios se crean
con un par de entradas que . y .. El 2 por lo tanto en este caso se debe a la entrada . dentro del propio
dir1 y si dentro de dir1 existieran directorios habra que contabilizar cada uno de los .. de los directorios
hijos como enlaces rgidos de dir1.
6. Ver el contenido de ej0 .
7. Agregar (usando el operador >>) el texto CC al archivo hard1.
8. Ver nuevamente el contenido de ej0. $ $ $ $
La informacion es accesible desde distintos nombres de ficheros pero no son copias sino que se trata de la
misma unidad de informacion.
9. Borrar ej0. Hacer un cat a sym1. Hacer un cat a hard1.
Figura 2: img2
En el caso de los enlaces rgidos da igual cual es el enlace o fichero original. Son totalmente equivalentes y
la informacion solo desaparecera del sistema cuando el ultimo enlace rgido sea eliminado. La diferencia con
el enlace simbolico es que actua simplemente accediendo al nombre del fichero que tiene almacenado en su
interior. Por eso en el caso que acabamos de ver sym1 queda apuntando a ej0 que es un fichero que ya
no existe.
10. Hacer un ls -li La opcion -i sirve para visualizar el numero de inodo. Un inodo es una clave numerica para
el acceso al sistema plano de ficheros donde cada almacen de informacion tiene una unica clave y por eso los
distintos enlaces rgidos contienen el mismo valor de inodo.
11. Cambiar el nombre de hard2 por ej0 usando el comando mv. Con esto el link simbolico debera funcionar
nuevamente.
12. Verificar que sym1 es valido (cat sym1)
13. Mover el enlace simbolico sym1 a dir1 usando el comando mv.
14. Verificar si funciona sym1 (que esta ahora dentro de dir1). Hay error? Por que? :
Los enlaces simbolicos son relativos si no se especifica la ruta completa del target al momento de su creacion.
15. Trasladar ej0 a dir2 y comprobar como queda todo y si ./dir1/sym1 es valido nuevamente
16. Ahora vamos acrear un symlink con ruta absoluta. Dentro de dir1 creamos un symlink de nombre ultimo
symlink, pero esta vez especificando el path completo del target (/..../dir1/ej0). Una manera de hacerlo facil
para los casos donde el path completo sea muy largo: ln -s pwd/ej0 ultimo symlink $
17. Verificar que ultimo symlink funcione correctamente y luego moverlo a otro directorio. El symlink debera
seguir apuntando correctamente a su target.
30
Figura 3: img3
Si la compilacion resulto exitosa, se obtendra un archivo a.out. Si se desea que el compilador genere un archivo
con nombre distinto a a.out lo especificamos con la opcion -o nombre archivo salida:
# gcc simple_main.c -o simple_main
Para esto es necesario que el directorio donde se encuentra el programa figure en el PATH. En caso de que no
figure, debemos ejecutar el programa especificando su ruta:
$ # ./simple_main
Si aun el programa no ejecuta, puede ser que los permisos no esten correctamente seteados. Debemos utilizar el
comando chmod para agregar permiso de ejecucion. Si el archivo se transfiere a otro directorio o a otra maquina,
es posible que se modifiquen los permisos originales.
31
2) Ejecutar el archivo simple main
El archivo ejecutable obtenido es de mayor tamano que el obtenido sin agregar la informacion de debug. Si lo
deseamos podemos quitar esta informacion de debug con el comando strip:
$ # strip simple_main2
El archivo obtenido es aun menor que el que se obtuvo sin utilizar el switch -g. Esto se debe a que incluso
estos archivos contienen cierta informacion, como por ejemplo nombres de funciones, etc.
3) Compilar agregando informacion de debug y comparar el archivo obtenido con el archivo anterior.
El flag -O le dice al compilador que optimice el codigo. El compilador demorara mas ya que tratara de aplicar
varios algoritmos de optimizacion. Podemos especificar el nivel de optimizacion de la siguiente forma:
Cuanto mayor es el nivel de optimizacion, es mas probable que nuestro codigo deje de funcionar correctamente.
Esto es debido a bugs en el compilador ya que las optimizaciones aplicadas se hacen mas complejas.
5) Definir dentro del archivo simple main.c una variable cualquiera, sin utilizarla. Compilar el fuente con y
sin warnings. Comparar resultados.
32
A medida que el programa crece, el tiempo de compilacion se incrementa y para cada pequeno cambio es nece-
sario re-compilar el programa completo.
Es mucho mas complicado que varias personas tranbajen juntas en el mismo proyecto con este tipo de organi-
zacion.
La solucion a esto es separar el codigo en varios archivos, cada uno conteniendo funciones con algun tipo de
relacion entre s. Hay dos formas posibles de compilar un programa C de multiples archivos. La primera es utilizar
una sola lnea de comandos para compilar todos los archivos. Supongamos que tenemos un programa que tiene sus
fuentes en main.c , a.c y b.c:
main.c:
#include <stdio.h>
/* define some external functions */
extern int func_a();
extern int func_b();
int
main(int argc, char* argv[])
{
int a = func_a();
int b = func_b();
char c;
char* bc = &c;
printf("hello world,\n");
printf("a - %d; b - %d;\n", a, b);
return 0;
}
a.c:
int func_a()
{
return 5;
}
b.c:
int func_b()
{
return 10 * 10;
}
Esto ocasionara que el compilador compile cada archivo en forma separada y luego los enlace (linking)
# gcc -c main.cc
# gcc -c a.c
# gcc -c b.c
# gcc main.o a.o b.o -o hello_world
Los primeros 3 comandos toman el codigo fuente y lo compilan en algo llamado objet file, con el mismo nombre
pero con la extension .o. Es el flag -c que le dice al compilador que solo genere archivos objeto y no archivos
ejecutables. En el archivo objeto, existen smbolos no resueltos todava. Para crear el ejecutable final, luego de crear
33
los 3 objetos, utilizamos el cuarto comando para enlazar todo en un solo programa. De esta forma necesitamos
re-compilar solamente los archivos modificados y luego re-enlazar todos los archivos objeto. Supongamos que cam-
biamos el archivo a.c :
# gcc -c a.c
# gcc main.o a.o b.o -o hello_world
Este ahorro en tiempo de compilacion , se hace mas importante en grandes programas con muchos archivos fuente.
2.
3.
4.
5.
6.
7.
34