You are on page 1of 7

Estructura de directorios para los trabajos

src include lib bin


Creacin de una librera esttica(ejecutando los comandos desde el
directorio src):
ar crs ../lib/libprueba.a modulos.o
Los mdulos se han de compilar como:
gcc -c modulo.c
As obtendremos los modulos objetos modulo.o
Para compilar y crear un ejecutable:
gcc gcc -o programa programa.c -L../lib -lprueba -I../include
Usaremos -I../include si tenemos ficheros .h en nuestro directorio
include.
Creacin de una librera dinmica:
Los modulos los compilaremos como:
gcc -c -fPIC modulos.c
Despues compilaremos la librera con:
gcc -shared -Wl,-soname,libprueba.so.1 -o ../lib/libprueba.so.1.0 *.o
Despues crearemos el enlace simbolico en el directorio /lib
ln -s libprueba.so.1.0 libprueba.so.1
Para poder usar las librera seguimos los paso eatblecidos en los
apuntes en las paginas 7 y 8.
Makefile para libreras dinmicas:
OBJS=funciones1.o funciones2.o
INCLUDE=../include/
CFLAGS= -fPIC -I$(INCLUDE)
PROG=../bin/inodo
LIBRERIA=../lib/libinodo.so.1.0
$(PROG): inodo.o $(LIBRERIA)
gcc -o $(PROG) -I$(INCLUDE) inodo.o $(LIBRERIA)
$(LIBRERIA): $(OBJS)
gcc -shared -Wl,-soname,libinodo.so.1 -o $(LIBRERIA) $
(OBJS)
$(OBJS) inodo.o: $(INCLUDE)inodo.h

A continuacin se expone otro ejemplo de makefile dinamico:


# Fichero para compilar la
# aplicacion "polinomios". Enlazado DINAMICO con la libreria creada
por nosotros.
# Variables que se van a utilizar y opciones de los mismos.
CFLAGS = -I../include -fPIC
OBJS = funciones1.o funciones2.o
PROGRAMA = ../bin/ordena
#Programa ejecutable y ficheros que forman parte del mismo
$(PROGRAMA): principal.c ../lib/libordena.so.1.0
gcc principal.c -I../include -o $(PROGRAMA)
../lib/libordena.so.1.0
#Biblioteca de usuario y ficheros que forman parte de la biblioteca
lib ../lib/libordena.so.1.0: $(OBJS)
gcc -shared -Wl,-soname,libordena.so.1 -o
../lib/libordena.so.1.0 \
*.o
# Ficheros de cabecera y modulos con codigo fuente: REGLA IMPLICITA
objs $(OBJS): ../include/ordena_cadenas.h
eje: $(PROGRAMA)
@echo "Iniciando la ejecucion ..."
@test -f ../lib/libordena.so.1 || ln -s ../lib/libordena.so.1.0
../lib/libordena.so.1
# las dos lineas siguientes hacen lo mismo
#
export LD_LIBRARY_PATH=../lib; $(PROGRAMA)
LD_LIBRARY_PATH=../lib $(PROGRAMA)
@echo "Fin del Makefile"
borra:
rm *.o
rm ../lib/*

Makefile para libreras estticas:


CFLAGS=-I../include #Variable que modifica el valor por defecto de las
Reglas Implcitas
../bin/programa : prog1.o ../lib/libprograma.a
gcc -o ../bin/programa prog1.o -L../lib -lprograma
../lib/libprograma.a : prog2.o prog3.o
ar crs ../lib/libprograma.a prog2.o prog3.o
prog1.o prog2.o : ../include/defin.h #Regla Implcita / en este caso
solo se han puesto en esta regla prog1.o y prog2.o porque el enunciado
adverta que solo ellos incluyen el fichero de cabecera defin.h

Funcin para comprobar parmetros: (en la expresin, numpar !=, el


nmero que le sigue es el nmero de parmetros que se van a pasar).
Prototipo: void comprobar_parametros(int);
Declaracin:
void comprobar_parametros (int numpar)
{
if (numpar !=2){
printf ("ERROR DE PARAMETROS\n");
exit (-1);
}
}
Llamada: comprobar_parametros (argc);
Abrir ficheros con open:
Declaramos una variable entera para almacenar el descriptor de
fichero:
int fichero;
Usamos la siguiente lnea para abrir el fichero:
fichero=open (argv[1], O_RDONLY);
Donde argv[1] es el nombre del fichero a abrir.
O_RDONLY abre el fichero en modo solo lectura, si quisieramos abrir un
fichero para escribir en el o que se cree si no existe usaremos:
fichero=open (argv[1], O_CREAT | O_WRONLY, 444);
La llamada al sistema open devuelve en todos los casos un nmero
negativo si se ha producido un error o un entero positivo en el caso
de xito el cual corresponde al descriptor del fichero.
Los ficheros abiertos con open se cierran con close:
close fichero;
Abrir ficheros con fopen:
Primero declaramos una variable tipo FILE*:
FILE *fich;
Para abrir un fichero en modo lectura usaremos:
fich=fopen(argv[1],r);
Donde argv[1] es el nombre del fichero a abrir.
Si quisieramos abrirlo para escribir en el usariamos:
fich=fopen(argv[1],w);
En el caso de que el fichero de escritura no exista y queramos crearlo
usaremos a en lugar de w.

Para comprobar si han ocurrido errores en la apertura del fichero con


fopen fich debe de ser distinto a NULL para eso utilizaremos la
expresin:
if (fich==NULL)
{
printf (Error abriendo fichero\n);
exit (-1);
}
Los ficheros abriertos con fopen se cierran con fclose:
fclose (fich);
Llamada al sistema read:
Es usada para leer ficheros de texto y binarios.
Prototipo:
int read(int descriptor_de_fichero, void *buffer, int nbytes);
Llamada: VER FUNCIONES2.C EN EJEMPLO 3
int nbytes;
char buffer[MAXTAM_CADENA];
nbytes=read(fich, buffer, MAXTAM_CADENA);
while (nbytes != 0)
{
Llamada al sistema write:
Es usada para escribir en ficheros de texto y binarios.
Prototipo:
int write(int descriptor_de_fichero, void *buffer, int nbytes);
Llamada: VER FUNCIONES2.C EN EJEMPLO 3
int i;
char lf=10;
for (i=0;i<n;i++)
{
write (fich, matriz[i], strlen(matriz[i]));
write (fich,&lf,sizeof(lf)); // Esta lnea escribe el
caracter de fin de lnea.
}
Funcin de librera fread: VER EJEMPLO USO DE FREAD.
Es usada para leer archivos binarios.
Prototipo:
int fread(buffer,tamao_de_la_estructura,nmero_elementos,des
criptor_de_fichero);
Nota: buffer es una variable tipo struct de la esctructura en la que
esten almacenados los datos en el fichero binario.

Llamada:
struct utmp reg;
fread (reg,sizeof(struct utmp),1,fich);
while (!feof(fich)
{
fread(reg,sizeof(struct utmp),1,fich);
}
Funcin de librera fwrite: VER EJEMPLO 4.
Es usada para escribir en archivos binarios.
Prototipo:
int fwrite(buffer,tamao_de_la estructura,nmero_elementos,des
criptor_de_fichero);
Nota: buffer es igual que en fread lo que ahora es la estructura en la
que se van a guardar los datos binarios.
Llamada:
fwrite(&reg1,sizeof(reg1),1,fichsalida);
Funcin de librera fscanf: VER EJEMPLO 6.
Se usa para leer archivos de texto con delimitadores.
Prototipo:
int fscanf(descriptor_de_fichero,cadena_formato,variables...);
Llamada:
char caracter;
int entero;
fscanf(fich,"%c%d",caracter,entero);
Funcin de librera fprintf: VER EJEMPLO 12
Se usa para escribir en un archivo de texto con formato.
Prototipo:
int fprintf(descriptor_de_fichero,cadena_formato,variables...);
Llamada:
char cadena[MAX_TAM];
int entero;
strcpy (cadena,"hola");
fprintf(fichero,"%s %d",cadena,entero);

Funcin de librera fgets: VER EJEMPLO 4.


Se usa para obtener datos de un fichero de texto.
Prototipo:
char *fgets(cadena_buffer,tamao_cadena,descriptor_fichero);
Llamada:
char cadena[MAX_TAM_CADENA];
fgets(cadena,sizeof(cadena),fichero);
Funcin de librera fputs:
Se usa para escribir datos en un fichero de texto.
Prototipo:
int fputs(cadena,descriptor_fichero);
Llamada:
char cadena[MAX_TAM_CADENA];
fputs (cadena,fichero);
Abrir directorios con opendir: VER EJEMPLO 10 PAG. 2/3.
Creamos un descriptor directorio:
DIR *dirp;
Abrimos el directorioc con opendir:
dirp=opendir(ruta_directorio);
Para comprobar que el directorio se ha abierto correctamente usamos:
if (dirp==NULL)
{
perror (ruta_directorio);
exit (-1); //O si estamos en una funcion return.
}
Funcin de librera readdir: VER EJEMPLO 10 PAG. 2/3.
Prototipo:
struct dirent *readdir(descriptor_directorio);
Llamada:
struct dirent *dp;
dp=readdir(descriptor_directorio);
Nota: readdir devuelve datos que se almacenan en una estructura tipo
dirent.

Funcin de librera sprintf: VER EJEMPLO 12 PAG. 2/2.


Se usa copiar en una cadena la concatenacin de una serie de cadenas.
Prototipo:
int sprintf(cadena,cadena_formato,variables...);
Llamada:
sprintf(ruta_total,"%s/%s",absoluta,relativa);
Funcin de librera getcwd: VER EJEMPLO 12 LINEAS COMENTADAS.
Copia la ruta del directorio actual en una variable cadena.
Prototipo:
char *getcwd(cadena_buffer,tamao_cadena_buffer);
Llamada:
char cadena[MAX_TAM];
getcwd(cadena,sizeof(cadena));
NOTA: getcwd devuelve NULL si ha ocurrido un error y si no devuelve la
ruta absoluta hasta el directorio actual.
INICIALIZAR UN PUNTERO CUANDO SE DECLARA COMO PUNTERO A UNA
ESTRUCTURA:
MODO 1:
struct stat *inodo,inodo2;
inodo=&inodo2;
MODO 2:
struct stat *inodo;
inodo=(struct stat*)malloc(sizeof(struct stat));

You might also like