Está en la página 1de 22

Laboratoriode

SistemasOperativos

Prctica8:

SistemadeArchivos

Objetivo
En est prctica seguimosconlostemasdedesarrollodeaplicacionesenambienteGNU/Linux
pero en esta ocasin nos enfocamos ms en la definicin de Archivo. Como recordarn
hemos hecho mucho nfasis en que en Linux todo es un archivo y esto requiere especial
atencin cuando uno est por adentrarse con el hardware o con otros elementos. Por lo
anterior,
en esta ocasin nos enfocaremos en cmo se manejaelsistemadearchivosen
unS.O.GNU/Linux.

NDICE
Objetivo
TiposdeArchivos
ArchivosRegulares
Directorios
Enlaces(hardandsoftlinks)
Archivosespeciales
tree.c,Desplegandoeltipodearchivo.
ArquitecturadelSistemaOperativo
Arquitecturadelsistemadearchivos
DescriptoresdearchivoseINode
Filedescriptors.
iNode
Estado1.c
Tablasdecontroldeaccesoalosarchivos.
Copiar.c
Laboratorio
Ejercicio1
Ejercicio2
Ejercicio3
Conclusiones
Referencias:
Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

TiposdeArchivos
"
Archivo
" es el concepto ms bsicoyfundamentaldeLinux,ynonecesariamenteserefierea
lo que normalmente conocemos como archivos en disco. Linux trata a los dispositivos y
perifricos (terminales, teclados, unidad USB, CD roms etc.) como si fueran archivos
(
everythingisafile
philosophy).

.
System programming en Linux consiste en abrir, leer, escribir, cerrar y administrar archivos.
Cada archivo cuenta con una agarradera (
handle
) interior que se llama
descriptor de archivo.

Ya hemos manipulado un poco estos descriptores en la primera parte de la prctica anterior,


en donde los utilizamos para hacer referencia a archivos en disco. Pero, no se debe
confundirlos con los file pointers que se utilizan en el standard I/O (segunda parte de la
prcticaanterior)

El
descriptor de archivo es un entero utilizado dentro del Ncleo (Kernel) para
referenciar un archivo. Estos descriptores de archivo se comparten con el espacio de usuario,
detalformaquesonutilizadosdirectamenteporlosprogramasusuarioparaaccesararchivos.

ArchivosRegulares
Lo que la mayora de nosotros llamamos archivo es lo que linux etiqueta como archivos
regulares. Un
archivo regular contiene bytes de datos, organizados en un arreglo lineal
llamado flujo de bytes (
byte strea
m). Ejemplos de estos son losarchivosdetexto,documentos
generadosporalgunasuitedeoficina,archivosejecutables,etc.

Directorios
Actan como un contenedor para otros archivos y directorios en otros ambientes suelen
llamarse folders. Un
directorio
es en s un archivo, que contiene una lista de nombres de
otros archivos o directorios contenidos dentro del directorio,. Cada uno de estos nombresest
a su vez asociado con unnmerodenodoi(
inode)
,queesunidentificadordelarchivointerno
alkernel.

Los directorios son los archivos que nos permiten darle una estructura jerrquica a los
sistemas dearchivosdeLinuxporejemploelsistema oconjuntodearchivosquereside
enunaparticindeundiscoduroounUSB.

La funcin fundamental de un directorio consiste en establecer la relacin que existe


entre el
nombre de cada archivo contenido dentro del directorio, yelnmerode
nodoi
correspondientealarchivo

Losdirectoriosresidencomoarchivosordinariosdentrodelsistemadearchivos.
Puedenserledoscomoarchivosordinarios.
No se pueden crear o escribir sobreelloscomo archivosordinarios(elkernellos

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

protegeporrazonesdeseguridad).

La informacin de un directorio puede obtenerse atravsdelallamadaalsistema:


readdir()
,o
la llamada al sistema
stat() para investigar si se trata de un subdirectorio dentro de un
directorio.

Enlaces(hardandsoftlinks)
Un enlace o
link es un nombre dentro de un directorio, que internamente apunta a un
nodoi
que puede corresponder a un archivo en el mismo o en otro directorio. En otros ambientes
suelen denominarse
shortcuts
. La diferencia entre un enlace
hard y un enlace
soft es que el
enlace hard no puede cruzar (se invalida) entre diferentes sistemas de archivos (por ejemplo
entre el sistema de archivosdeldiscoduroyelsistema dearchivosdeunUSB).Encambio,un
enlace
soft puede apuntar a cualquier lado, incluyendo archivos y directorios que residen en
diferentessistemasdearchivos.

Archivosespeciales

Archivosdedispositivosbasadosencaracteres,comoelarchivo
teclado,

Archivosdedispositivosbasadosenbloques,comolosarchivosendisco.
En los dispositivos demodobloquehayunbufferquemejoraenormementelavelocidad
de transferencia. Un mismo dispositivo puede ser accedido de modobloqueodemodo
carcterdependiendodeldriverutilizado.
Pipes con nombre, que como sabemos se utilizan para ligar la salida (
standard out
)de
unprogramaconlaentrada(
standardin)
deotroy
Sockets
,queseutilizanparaintercomunicarprogramasquepueden residirenlamisma
odiferentesmquinas.

tree.c,Desplegandoeltipodearchivo.
/*** PROGRAMA:tree.c
FORMA DE USO:
Tree [opciones] <nombre_directorio> [ <nombre_directorio> ... ]
(opciones)
-f mostrar los archivos que hay dentro de
Un directorio agregando:
(d) directorio
(o) archivo ordinario
(b) archivo especial modo bloque
(c) archivo especial modo caracter
(p) fifo
(x) archivo ejecutable
VALOR DE RETORNO:
0: si se ejecuta correctamente.
-1: si se produce algun error. ***/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

struct opciones
{
unsigned mostrar_archivos:1;
};
enum Boolean {NO,SI};
void tree(char *path, struct opciones opciones);
/*** FUNCION: main
DESCRIPCION
Funcion principal , se encarga de analizar los argumentos
De la linea de ordenes y de invocar a la funcion tree.***/
int main (int argc, char *argv[])
{
struct opciones opciones;
int i, j;
/*Analisis de los argumentos en la linea de ordenes.*/
if (argc<2)
{
fprintf (stderr,"Forma de uso: tree [-f] nombre_directorio\n");
exit (-1);
}
for (i=1;i<argc;i++)
if (argv[i][0] =='-')
for (j=1;argv[i][j]!=0;j++)
switch (argv[i][j])
{
case 'f':
opciones.mostrar_archivos= SI;
break;
default:
fprintf(stderr, "Opcion [-%c] desconocida \n",argv[i][j]);
}
/*Analisis de la estructura en arbol de directorios para cada uno
de los argumentos que aparecen en la linea de ordenes y que no
son opciones de tree.*/
for (i=1;i<argc;i++)
if (argv [i][0]!='-')
tree (argv[i],opciones);
return 0;
}
/*** FUNCION: tree
DESCRIPCION:
Esta funcion recibe el path name de un directorio se encarga de
analizarlo. Si en el directorio hay subdirectorios, la
funcion se
llama de forma recursiva para analizar ese subdirectorio.
Segun las opciones que esten activas, la funcin desplegara por
pantalla un tipo de informacion u otra.

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

***/
void tree(char *path, struct opciones opciones)
{
DIR *dirp;
struct dirent *dp;
static unsigned int nivel = 0;
struct stat buf;
int ok;
int i;
char archivo [256];
char tipo_archivo;
/*Apertura de directorio.*/
if ((dirp=opendir(path)) == NULL)
{
perror(path);
return;
};
/*Leemos, una por una, las restantes entradas del directorio.*/
while ((dp=readdir(dirp))!=NULL)
{
/*Formamos el path name correspondiente al archivo de la
entrada de
directorio que estamos procesando*/
sprintf(archivo,"%s/%s",path, dp->d_name);
/*Lectura del inode del archivo. */
ok=stat(archivo,&buf);
/*Si el archivo es un subdirectorio, llamamos nuevamente a tree.*/
if (ok!=-1 && (buf.st_mode & S_IFMT) == S_IFDIR)
{
for (i=0;i<nivel;i++)
printf("\t");
printf ("%s %s \n",dp->d_name, opciones.mostrar_archivos ? "(d)":"");
/* Si es referencia a "este directorio" (.) o el "directiorio padre"
(..), saltar) */
if (!strcmp(".", dp->d_name) || !strcmp("..", dp->d_name))
continue;
++nivel;
tree(archivo,opciones);
--nivel;
}
/* Si el archivo no es un directorio y esta activa la opcion
Mostrar_archivos (-f), presentamos por pantalla el
nombre del
archivo y su tipo.*/
else {
if (ok !=-1 && opciones.mostrar_archivos== SI) {
for (i=0;i<nivel;i++)
printf ("\t");
switch (buf.st_mode & S_IFMT)

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

{
case S_IFREG:
if (buf.st_mode & 0111)
tipo_archivo = 'x';
else
tipo_archivo = 'o';
break;
case S_IFCHR:
tipo_archivo = 'c';
break;
case S_IFBLK:
tipo_archivo = 'b';
break;
case S_IFIFO:
tipo_archivo = 'p';
break;
default:
tipo_archivo = '?';
} //switch
fprintf(stdout,"(%c) %s \n", tipo_archivo, dp->d_name);
}else
fprintf(stdout," %s \n", dp->d_name);
}
} /* while */
closedir(dirp);
} /* tree */

Primerosecompilaparaobtenerelprogramaejecutableutilizandoelsiguientecomando:
[user@localhosthome]$gccotreetree.c

Despus,seejecutacomosifuerauncomando:
[user@localhost home]$ ./tree hola

hola1
hola11
hola12

hola2
[user@localhost home]$ ./tree -f hola

hola1 (d)
(o) h1
hola11 (d)
hola12 (d)
hola2 (d)
(o) h2
(o) h

Duestimatefilespaceusage
El comando
du (
disk ussage
) nos dice cunto espacio (en bloques) utiliza cada directorio.Si
deseasverloenformatoentendibleporelhumanousalaopcin
h.

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

[user@localhost home]$ du
22
./Finales/al149830
18
./Finales/al246793
14
./Finales/al158072
170
./Finales/al171574
10
./Finales/al171465
50
./Finales/al501240
16
./Finales/al501747
16
./Finales/al177269
320
./Finales
72
./CyUnixAvanzado
10
./pruebas
402
.

El valor mostrado indica cuntos bloques poseen los archivos en el directorio indicado en la
lnea de comandos del du (default: el directorio local) incluyendo subdirectorios y el mismo
directorio (en el ejemplo, el directorio local ocupa 402 bloques incluyendo todos sus
subdirectoriosyarchivos).

Los bloques son importantes peus son la referencia directa a losclusters deldiscodurodonde
se almacenan (o los bloques en memorias flash), sin embargo, nosotros estamos
acostumbrados a ver el tamao en trminos de Bytes y es posible lograrlo con el argumento
h.

ArquitecturadelSistemaOperativo
Linux es propiamente el Kernel de un sistema UNIX por lo mismo tiene una arquitectura
heredada de Unix y de lacualmantienesusencillez. Esunaarquitecturadecapas queposee
3elementos:
Capadehardware
CapadeKernel
CapadeUsuario

Alserunsistemajerrquico ydecapas,todalacomunicacin haciaelhardwaredebedepasar


por la capa de Kernel (y es en este punto donde esta el control y la seguridad). La siguiente
imagenayudaraasuapreciacin:

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

Una
distribucin de linux o
distro
, tal como Ubuntu o Fedora, agrega al Kernel un shell, un
conjunto de comandos, una interfase tipo GUI y varias aplicaciones tiles pero todas las
distribuciones utilizan bsicamente el mismo Kernel, que ha sido desarrollado y mantenido
durantemuchosaosporunaextensacomunidadencabezadaporLinusTorvald.

Durante las prcticas pasadas ya hemos estudiado el manejo de las libreras de GNU yaque
se trata de las herramientas provedas en cualquier
distro basado en Linux (Ubuntu, Fedora,
Redhat , Arch, etc...) y se trata de comandos como
cd, awk, ls, rm, tar, rsync, etc... que
pueden formar parte de
shell scripts.
Cuando usamos cualquier
comando tal como
rm f /
,
el Kernel valda primero losprivilegiosypermisosdelusuarioquelomanda aejecutarantesde
realizar la accin. Con el comando mostrado en particular, seguramente no lorealizarpuesa
excepcin de Root nadie tiene control del directorio raz (Por cierto, ese comando tiendeaser
unabromapesadaenlosforosdeLinux).

Adems ya hemos manipulado la interaccin con el hardware al crear programas que copian
archivos dentro del disco duro, ya sea directamente conlos comandosreadywriteoutilizando
libreras de usuario (standard I/O).En ambos casos, es el Kernel quien toma el control., sin
embargo a momentos distintos, esto se puede apreciar con la siguiente imagen donde se
vuelven a marcar las 3 capas pero desplegando ms ampliamente las acciones que se
realizan:

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

Ladiferenciaentrelosdosradicacompletamenteenloquesevioenlaprcticaanterior
referenteaI/OSystemProgramming.

Arquitecturadelsistemadearchivos
Linux proporciona un espacio denombresdearchivosydirectoriosglobal (aplicableamltiples
dispositivos) y unificado (el mismo para diferentes dispositivos). En un espacio de nombres
unificado:
El acceso a los archivos en discos o unidades diferentes se realiza siempre dentro de
un espacio de nombres unificado, es decir, todos los archivossonaccesiblesdentrode
lamismaynicajerarquadedirectorios.
Un archivoenundiscopodraseraccesiblemediantela ruta/media/usbdisk/plank.jpg,o
incluso mediante /home/desktop/plank.jpg (
inodes
), estomedianteligas(Algoparecido
alosatajosdeWindows).
Enunespaciodenombresnounificado:
Los archivos contenidos en diferentes discos o unidades son accesibles a travs de
diferentes espacios de nombres, es decir, hay un espacio de nombres diferente para
cadadisco.
Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

En Winows, un archivo en una memoria USB podra ser accesible mediante la ruta
F:\plank.jpg, mientras que en el disco duro est ubicado en C:\ en Linux en cambio,
ambos tipos de archivo se accedera con un path del mismo tipo, que podra ser por
ejemplo /media/usbdisp/palnk.jpg para elcasodelusb o/home/user/fulano/plank.jpg.Lo
que ha sucedido es que el sistema de archivos completo del USB se ha montado en
usbdisp,yentoncessehacevisiblecomoundirectoriocualquiera.

Unsistemadearchivos:
Esunacoleccindearchivosydirectoriosenunajerarquavlidayformal.
Los sistemas de archivos pueden ser agregados y removidos individualmente del
espaciodenombresglobaldearchivosydirectorios.
Linux tambin soporta sistemas de archivos virtuales que existen slo en memoria, y
sistemasdearchivosderedqueexistenenmquinasatravsdelared.
Los sistemas de archivos fsicos residen en dispositivos dealmacenamientoenbloque,
como CDs, unidades flash, tarjetas compact flash, o discos duros. Algunos de estos
dispositivos son divisibles en particiones, lo que significa que pueden ser divididos en
mltiplessistemasdearchivos,loscualespuedensermanipuladosindividualmente.

Launidaddireccionablemspequeaenundispositivodebloqueesel
sector.

El
sector es una caracterstica fsica del dispositivo. El tamao de los sectores es casi
siempre una potencia de dospor ejemplo, 512 bytes es muy comn. Un dispositivo de
bloque no puede transferir o accesar una unidad de datos ms pequea que un sector
todaslasoperacionesdeI/Oocurrenentrminosdeunoomssectores.

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

Igualmente, la unidad lgica direccionable ms pequea enunsistemadearchivosesel


bloque.
El bloque es una abstraccin del sistema de archivos, no del medio fsico donde elsistema
de archivos reside. Un bloque es usualmente un mltiplodeltamaodesector.Losbloques
son generalmente ms grandes que el sector, pero deben ser menores que el tamao de
pgina (la unidad ms pequea direccionable porlaunidaddememoria,uncomponentedel
hardware).Tamaoscomunesdebloqueson512bytes,1kilobytey4kilobytes.

DescriptoresdearchivoseINode
Filedescriptors.
Antes de que un archivo pueda ser ledo o escrito, debe ser abierto. El kernel mantiene una
lista de archivos abiertos por proceso, llamada la
tabla de archivos
. Esta tabla esindexadaa
travs de enteros no negativos conocidos como
file descriptors (comnmente abreviado
fd
).
Cada entrada en la lista contiene informacin sobre un archivo abierto, incluyendo un
apuntador a una copia en memoria del
inodedelarchivoymetadatosasociados,comosonla
posicin del archivo y los modos de acceso. Tanto el espacio de usuario como el espacio de
kernel usan
file descriptors como cookies nicas por proceso. Abrir un archivo regresa un file
descriptor, mientras las operaciones subsecuentes (leer, escribir, y as sucesivamente) toman
el
filedescriptor
comosuargumentoprimario.

iNode

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

Unarchivoposeevarioscomponentes:
nombre,
contenidoe
informacinadministrativa(permisosyfechasdemodificacin).

Aunque los archivos son usualmente accedidos mediante nombres de archivo, en realidad no
estn asociadosdirectamenteconesosnombres.Encambio, unarchivoes referenciadoporun
inode (originalmente information node)
, al cual se le asigna un valor numrico nico. Este
valor se llama
inode number
, a menudo abreviado como
inumber o
ino
. Un
inode almacena
metadatos asociados con un archivo, como su fecha de modificacin, propietario, tipo,
longitud, y la localizacin de los datos delarchivoperonoelnombredelarchivo!El
inodees
tanto un objeto fsico, ubicado en el disco en un sistema de archivos tipo Unix, como una
unidad conceptual, representada por una estructura de datos enelkerneldeLinux.Larelacin
deinodesconnombresdearchivolamantieneeldirectorio,comoveamosantes.

Cada archivo tiene asociado un nodoi. El inode tiene informacin necesaria para que un
procesopuedaaccederalosarchivos.Loscamposdeuninodeson:
Tipodearchivo:ordinario,directorio,especialotubera(pipe).
Tipodeacceso:permisosdeusuario,grupoyrestodeusuarios.
Tiempos de acceso al archivo: fecha de ltima modificacin, fecha delaltimavezque
seaccedialarchivo,ydelaltimavezquesemodific.
Tamaodelarchivo.
Apuntadores a bloques de disco donde se almacena el contenido del archivo: los
archivosnotienenporqueestarfsicamenteenbloquescontinuos.

Nota
: el nodoi NO contiene el nombre del archivo. Es en los archivos directorios es
dondeacadainodeseleasignaunnombredearchivo.

El tamao de un inode es fijo. Con el propsito de direccionar archivos muy grandes


Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

(recordemos que un archivo no est en bloques continuos), entonces en UNIX sistema V, los
nodosi tienen una tabla de tamao 13. Las primeras 10 posiciones de esta tabla, entradas
directas, contienen direcciones de bloques con datos de archivos. La entrada 11, entrada
indirecta simple, apunta a un bloque que contiene una tabla de direcciones de bloques, que
apuntan al bloque de datos. La posicin 12, entrada indirecta doble, apunta a un bloque que
contiene una tabla de direcciones que apunta a bloques que contienen direcciones donde se
encuentran los datos. La posicin 13 es una entrada indirecta triple, como se muestra en la
siguientefigura:

Elnmerodebloquesdireccionablesesentonces:

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

Unbloquepuedeserdetamao1024,4096,etc.

ElSOcargalalistadenodosideldiscoamemoriaprincipal,conocidacomotabladenodosi.

La tabla de nodosi contiene la informacin de la listadeinodesmsotrosdatoscomoestado


el estado de cada nodoi (p. ej., si el nodoi esta bloqueado, si hay algn proceso que est
esperando que el nodoi se desbloquee, si la copia del inode quehayenmemoriaes diferente
alacopiadedisco,etc.)

Importante
: el sistemadearchivosmanipula(cambiodepermisos,propietariodelarchivo,etc.)
la tabla de nodosi, pero no modifica directamente la lista de nodosi en el disco enelinstante
en que ocurren estos cambios. Esto podra plantear problemas deinconsistenciaentrelatabla
y la lista de nodosi, ya que una actualizacin de la tabla de nodosi, no implica una
Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

actualizacin inmediata de la lista de nodosi. La solucin a esta inconsistencia es que el


sistema realiza actualizacionesperidicasdelalistadenodosi.Naturalmente,antesdeapagar
el sistema tambin es necesario hacer una actualizacin de la lista de nodosi. El programa
shutdown
eselencargadodeestatarea.
La informacin de los nodosi de archivos y directorios puede ser accesible a travs de
llamadasalcomandostat().
Estado1.c
A continuacin se presenta el programa
estado1.c
, que muestra el tipo de un archivo
basndoseenlainformacincontenidaensunodoi:
/*PROGRAMA:estado1.c(basadoenprograma3.10enterceraedicion.)
DESCRIPCION:
Presentaporpantallalainformacionestadisticade
nombre_archivo.
FORMADEUSO:

estado<nombre_archivo>[<nombre_archivo>...]
VALORDERETORNO:
0:siseejecutasatisfactoriamente.
1:sisedaalgunacondiciondeerror.

*/
#include<stdio.h>
#include<stdlib.h>
#include<pwd.h>
#include<grp.h>
#include<sys/types.h>
#include<sys/stat.h>

charpermisos[]={'x','y','r'}

intestado(char*archivo)
{
structstatbuf
structpasswd*pw
structgroup*gr
inti

if(
stat(archivo,&buf)
==1)/*Leeinformaciondeltipoarchivo.*/
{

perror(archivo)

exit(1)
}

fprintf(stdout,"Archivo:%s\n",archivo)
fprintf(stdout,"Nro.deinode:%d\n",buf.st_ino)

fprintf(stdout,"Tipo:")
/*Analisisdeltipodedispositivo*/
Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

/*Paraconcereltipodearchivo,seutilizanunasconstantesdefinidas*/
/*ensys/stat.h*/
/*S_IFMT=0170000*/
/*S_IFREG=0100000*/
/*S_IFDIR=0040000*/
/*S_IFCHR=0020000*/
/*S_IFBLK=0060000*/
/*S_IFIFO=0010000*/
switch(buf.st_mode&S_IFMT)/*mascaraparaobtenereltipodearchivo*/
{

caseS_IFREG:

printf("ordinario\n")
break

caseS_IFDIR:

printf("directorio\n")
break

caseS_IFCHR:

printf("especialmododecaracter\n")
break

caseS_IFBLK:

printf("especialmodobloque\n")
break

caseS_IFIFO:

printf("FIFO")
break
}
}

intmain(intargc,char*argv[])
{
inti

/*Analisisdelosargumentosdelalineadecomandos.*/
fprintf(stderr,"argc=%d\n",argc)
if(argc<2)
{

fprintf(stderr,"Formadeuso:%snombre_archivo\n",argv[0])

exit(1)
}

/*Ciclodeconteo*/
for(i=1i<argci++)
{

estado(argv[i])
}
exit(0)
return0
}

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

Primero se compila para obtener el programa ejecutable utilizando el siguiente comando:


[username@localhosthome]$gccoestado1estado1.c

Despusseejecutacomosifuerauncomando:

[username@localhosthome]$ls
copiar.chola
[username@localhosthome]$./estadocopiar.c
Archivo:copiar.c
Nro.deinode:20578307
Tipo:ordinario
[username@localhosthome]$./estadohola
Archivo:hola
Nro.deinode:20578313
Tipo:directorio

Otra forma de ver los nodos-i de los archivos es utilizando la opcin


-i
del comando
ls
como se
muestra a continuacin:
[username@localhosthome]$lsi
1145832168alphawords 1145831648alphawords~
1145832166fruits

Tablasdecontroldeaccesoalosarchivos.
Adems de la tabla de i-nodes, el Kernel mantiene en memoria otras dos tablas con informacin
necesaria para manipular un archivo: tabla de archivos y la tabla de descriptores de archivo.

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

La
tabla de archivos
es una estructura global del kernel y en ella hay una entrada para cada
archivoquelosprocesosdelkernelodelusuariotienenabiertos.

La
tabla de descriptores de archivos
es una
estructura local a cada proceso
. Esta tabla
identifica todos los archivos abiertos por proceso. En cada una de las entradasdelatablahay
un apuntador a una entradadelatabladearchivosdel sistema.Cuandoarrancaunproceso,el
sistema abre automticamente tres archivos (0, entrada estndar 1, salida estndar 2, error
estndar).

Cuando un proceso invocaunallamada(


open,creat,dup,link)
parahacer unaoperacinsobre
un archivo, le va a pasar al kernel el descriptor de archivos. El kernel va a utilizar esenmero
para acceder a la tabla de archivos del proceso, y buscar en ella cualeslaentradadelatabla
de archivos que le da acceso a su nodoi. A travs del nodoi es que se tiene acceso a los
datos. Si elusuariocreaotros archivos,entonceselnmerodedescriptordearchivocontinuaa
partirdeestenumero.
Copiar.c

/*PROGRAMA:copiar.c
FORMADEUSO:
./copiarorigendestino

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

VALORDERETORNO:
0:siseejecutasatisfactoriamente.

1:sisedaalgunacondiciondeerror
*/
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>

charbuffer[BUFSIZ]

intmain(intargc,char*argv[])
{
intfd_origen
intfd_destino
intnbytes

/*Analisisdelosargumentosdelalineadecomandos*/
if(argc!=3)
{
fprintf(stderr,"Formadeuso:%sorigendestino\n",
argv[0])
exit(1)
}

/*Aperturadelarchivoenmodosololectura*/
if((fd_origen=open(argv[1],O_RDONLY))==1)
{
perror(argv[1])
exit(1)
}

/*Aperturaocreaciondearchivosenmodosoloescritura*/
if((fd_destino=open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,0666))==1)
{
perror(argv[2])
exit(1)
}
fprintf(stdout,"Num.descriptordelorigen%d\n",fd_origen)
fprintf(stdout,"Num.descriptordeldestino%d\n",fd_destino)

/*copiamoselarchivoorigenenelarchivodestino.*/
while((nbytes=read(fd_origen,buffer,sizeofbuffer))>0)
write(fd_destino,buffer,nbytes)

close(fd_origen)
close(fd_destino)
return0
}

al ejecutralo generaria:

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

[username@localhosthome]$./copiaroriginal.txtcopia.txt
Num.descriptordelorigen3
Num.descriptordeldestino4

Dos archivos pueden tener asignado el mismo nodo-i. El comando utilizado para asignar
ligas(hard links o soft links) a nombres de archivo es
ln
.

[username@localhosthome]$lntmptmpl
[username@localhosthome]$lsil
total60
20578307rwrr1usernameusername1158Aug2715:45copiar.c
20578323rwrr1usernameusername2263Aug2821:05entrada.c
20578312rwrr1usernameusername2155Aug2720:30estado.c
20578310rwrr1usernameusername3265Aug2719:45fcntl.c
20578313drwxrxrx4usernameusername4096Aug2819:51hola/
20578311
rwrr2usernameusername4Aug2719:42tmp
20578311
rwrr2usernameusername4Aug2719:42tmpl
20578322rwrr1usernameusername4363Aug2820:35tree.c

El comando
rm
en realidad no borra nodos-i; borra entradas del directorio a nodos-i. Solo cuando
la ltima liga a un archivo desaparece, entonces el sistema borra el nodo-i, y en consecuencia,
tambin el archivo.

[username@localhosthome]$rmtmp
rm:removeregularfile`tmp'?y
[username@localhosthome]$lsil
total56
20578307rwrr1usernameusername1158Aug2715:45copiar.c
20578323rwrr1usernameusername2263Aug2821:05entrada.c
20578312rwrr1usernameusername2155Aug2720:30estado.c
20578310rwrr1usernameusername3265Aug2719:45fcntl.c
20578313drwxrxrx4usernameusername4096Aug2819:51hola/
20578311
rwrr1usernameusername4Aug2719:42tmpl
20578322rwrr1usernameusername4363Aug2820:35tree.c
[username@localhosthome]$

El propsito de una liga es de dar dos nombres a un mismo archivo, para que ste pueda
aparecerendosdirectoriosdiferentes.

Puede haber ligas suaves o duras. La liga suave se utiliza cuando se hace un ligado a un
archivo que se encuentra en un sistema de archivos diferente. El ligado tambin puede
hacerseentredirectorios.

--- Ejercicios ---


Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

Para el desarrollo de esta prctica manejaremos cierta cantidaddearchivos,para prepararun


directorio temporal ejecute el siguiente Shell scripting (Descargar archivosexclusivamentede
laPginadellaboratorio).

Ejercicio1
Cree el directorio en
~/SistArchivos/ , guarde en dichodirectorioelsiguienteshellscripting
conelnombrepreparacion.shyejecutelo:

#! /bin/bash
mkdir originales respaldo
mkdir originales/Nivel
mkdir originales/Nivel/Segundo
cat /etc/passwd > originales/Listado
wget http://cs.mty.itesm.mx/lab/operativos/img_tec/thumb_3.png
wget http://cs.mty.itesm.mx/lab/operativos/Complementos/Practica7.tar
mv thumb_3.png originales/thumb_3.png
mv Practica7.tar originales/Prctica7.tar
#ls / -R > originales/Nivel/Segundo/Listado.txt
ln originales/Listado respaldo/Arch1
ln -s ../originales/thumb_3.png respaldo/Arch2
ln originales/thumb_3.png respaldo/Arch3

Ejercicio2
Guardeelarchivo tree.cen~/SistArchivos/ yacontinuacincomplelo(nombredesalida:Tree)
para despus ejecutarlo utilizando como directorio objetivo el directorio ~/SistArchivos/ de tal
formaquedesplieguelainformacindecadaarchivo.

1. Desplieguelaejecucindelprograma
2. Porqueldirectoriooriginales/Nivelmuestra3directorios?
3. Por que si
preparacion.sh
es un archivo de texto al igual que
originales/Listado
,
el,primeroaparececonlaleyenda(x)envezde(o)?
4. Porqutree.cyTreesondiferentesparaelS.O.?
5. Como identifica a los archivos en respaldo/ ? De qu se diferencian respecto a
/originales?(UtiliceelshelldelEjercicio1comoreferencia)

Ejercicio3
Guardeelarchivoestado1.cen~/SistArchivos/yacontinuacincompilelo(nombredesalida:
Estado1)paradespusejecutarloutilizandocomoargumento~/SistArchivos/originales/

1. Desplieguelaejecucindelprograma
2. Querepresentaloqueregres?
3. EjecuteelprogramaEstado1enlosarchivosordinariosen
~/SistArchivos/originales/
y
Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza

Laboratoriode

SistemasOperativos

losarchivosordinariosen
~/SistArchivos/respaldo
.Desplieguelassalidas(los
utilizaraenelsiguienteejercicio).

Ejercicio4
Guardeelarchivocopiar.cen~/SistArchivos/yacontinuacincomplelo(nombredesalida:
Copiar)

Ejecuteelsiguientecomando

rm ~/SistArchivos/originales -f -R

1. Porquescorrectalaafirmacindequesepuederecuperarciertainformacin?
2. Quearchivoordinarionosepuederecuperar(Utilicedereferenciaelejercicio1)?
3. CompruebesusrespuestasanterioresmediantelosInodesqueobtuvoenelejercicio
anterior.
4. SirevisaelshellscriptingnotarqueArch2yArch3fueroncreadosdelmismoarchivo.
QueocurreconArch2ahora?
5. Ejecutecopiarcuyosargumentosseran
~/SistArchivos/respaldo/arch1
~/SistArchivos/respaldo/arch4
6. Que diferencia a arch1 y arch4 para el S.O.? Como lo puede
comprobar?

Conclusiones
MencionesusconclusionespersonalesrespectoasistemasdearchivosenGNU/Linux.

Laboratorio
Accesodirectoalaligadeformulario:
SISTEMADEARCHIVOS
Retroalimentacin:SistemadeArchivos

Referencias:
Love,
Robert.,

Linux System Programming,

O'REILLY, 2007. Biblioteca: QA76.76.O63 L69 2007


Marquez,Fernando,
ProgramacinAvanzadaenUNIX
,3a.edicion,2004.BibliotecaQA,76.76,.O63,
M37,2006(Reserva)

Autor
:Dr.JuanA.NolazcoFlores
Coautores
:M.C.RobertoAceves,M.C.JorgeVillaseor,

Ing.RalFuentes,J.I.icaza