Dicha practica constará de dos procesos los cuales sincronizaremos por concurrencia,utilizando memoria compartida.
PROCESO PADRE
Se encargara de buscar ficheros, distinguiendo si nos encontramos ficheros
o directorios.
Así como si no se pueden leer(son ocultos) dichos ficheros.
Si encuentra un fichero cogera su nombre y tamaño, donde se
ira escribiendo en una tabla, que nos mostrará por pantalla,
la cual estara en memoria y pasara al segundo proceso.
PROCESO HIJO
Este buscará y cogerá el nombre del fichero de la tabla,
se encargará de abrir dicho fichero y escribirlo en el archivo carácter
a carácter. Continuará este proceso con todos los ficheros
que componen la tabla.
- sys/stat.h: libreria para obtener información sobre ficheros.
- sys/types.h: En está libreria estan definidos algunos tipos de datos utilizados en las anteriores librerias.
- int closedir (DIR *dirp): Cierra el directorio abierto con opendir.
- struct dirent *readdir (DIR *dirp): Función para leer las entradas del directorio.
- int stat(char *path, struct stat *buf): Nos da información sobre el fichero leido.
/********************************************************************
* PROGRAMA: Practica.c
*
* AUTORES: Victor Manuel Herrero Rodriguez
*
*
Javier Acosta Molinero
*
* PRACTICA DE SISTEMAS OPERATIVOS - 3º
DE ESTADISTICA
*
*********************************************************************/
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include "rshmem.h"
#define EVER (;;) /* Para bucle infinito */
#define NOM 14
#define TAM 50
typedef struct {
/* Estructura donde se guardan los nombres */
char nombre[NOM];
/* y tamaños de los ficheros
*/
long tam;
}TAB;
/********************************************************************
*
FUNCION PRINCIPAL
*
* DESCRIPCION: Recibe dos argumentos
*
* - Nombre del archivo
que contendra todos los ficheros. *
* - Directorio donde
estan los ficheros.
*
* Realiza dos procesos en concurrencia mediante
memoria compartida *
*********************************************************************/
main(int argc,char *argv[])
{
char *n1,*n2,*n3,*MarcaFin; /* Punteros
a memoria compartida */
TAB *tmem[TAM]; /* Puntero a tabla de ficheros */
FILE *tabla;
/* Variables que controlan los ficheros */
FILE *fich_l;
char d;
DIR *dact;
/* Estructuras y variables que controlan */
struct dirent *dp;
/* el directorio y sus ficheros
*/
struct stat buf;
int dficheros;
char permisos[3];
permisos[0]= 'x';
permisos[1]= 'w';
permisos[2]= 'r';
int k=0;
/* Contador */
char archivo[NOM];
/* Archivo donde alojar los ficheros */
/* Se comprueban los parametros introducidos */
if(argc!=2){
fprintf(stderr, "\nForma de uso: %s
Nombre_archivo ",argv[0]);
exit(-1);
}
/* Copiamos argumentos */
strcpy(archivo,argv[1]);
if (!crearMemoria()){
/* Se crea memoria compartida */
fprintf(stderr, "error
de crearMemoria\n");
exit(-1);
}
n1=memoria;
/* Se asignan direcciones de memoria a los */
n2=n1+sizeof(char);
/* punteros
*/
n3=n2+sizeof(char);
MarcaFin=n3+sizeof(char);
archivo=MarcaFin+sizeof(char);
tmem[0]=archivo+14*sizeof(char);
for(k=1;k<TAM;k++)
tmem[k]=tmem[k-1]+sizeof(TAB);
*n1=0; /* Inicializacion
de variables en memoria compartida */
*n2=0;
*n3=TAM;
*MarcaFin='N';
if(0!=fork()){
/* PROCESO PADRE */
dact = opendir("."); /* Apertura del
directorio */
while(NULL != (dp = readdir(dact))) /* Leemos
el contenido del */
{
/* directorio
*/
dficheros = stat(dp->d_name,&buf);
/* Informacion del fichero */
/* Omitimos ficheros que no interesan
y subdirectorios */
if((dficheros != -1 && (buf.st_mode
& S_IFMT) != S_IFDIR)
&& ( dp->d_name[0]
!='.') && (strcmp(archivo,dp->d_name)!= 0)
&& (strcmp("practica",dp->d_name)!=
0))
{
strcpy(tmem[(*n1)]->nombre,dp->d_name);
/* Creamos tabla en */
tmem[(*n1)]->tam = buf.st_size;
/* memoria */
TP
printf("\n%-14s %8li",dp->d_name,buf.st_size);
printf("\t");
/* Obtenemos los permisos
del fichero */
for(k=0;k<9;k++)
{
if(buf.st_mode
& (0400>> k))
printf("%c",permisos[(8-k)%3]);
else
printf("-");
}
TP
(*n1)++;
}
}
closedir(dact);
printf("\n");
*n3=(*n1);
while((*MarcaFin)!='F'); /*espera que termine el PROCESO HIJO */
if (!eliminarMemoria()) /* Eliminamos memoria
compartida */
fprintf(stderr,
"error de eliminarMemoria\n");
exit(0);
}
else{ /* PROCESO HIJO */
tabla=fopen(archivo,"a");
for EVER { /* Repetir mientras existan ficheros
*/
while((*n2)>=(*n1)) /* Espero a tener algun nombre
de fichero */
/* nuevo
*/
if((*n2)==(*n3)){ /* El proceso hijo
a terminado
*/
*MarcaFin='F';
exit(0);
}
fprintf(tabla,"\n\n");
fich_l=fopen(tmem[(*n2)]->nombre,"r");
fscanf(fich_l,"%c",&d);
while(!feof(fich_l)) /* Copiamos el
fichero al archivo */
{
fprintf(tabla,"%c",d);
fscanf(fich_l,"%c",&d);
}
fclose(fich_l);
(*n2)++;
}
fclose(tabla);
}
}
Victor Manuel Herrero Rodriguez
Javier Acosta Molinero
Direcciones de correo:
sisos16@duero.lab.fi.uva.es
sisos01@duero.lab.fi.uva.es