Practica de Sistemas Operativos

 
Explicación de la practica
Documentación
Codigo Fuente
Autores

EXPLICACION DE LA PRACTICA

La practica consiste en crear un archivo que contenga una serie de ficheros de un directorio concreto. Se supone que dichos ficheros contendrán código de texto, pudiendo por ejemplo ser capitulos separados de un libro, de tal forma que el archivo que generamos contendrá  todo el libro completo.

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.

 

DOCUMENTACION

El programa se ejecuta:
- practica <nombre del archivo donde se guardan los ficheros>
Librerias utilizadas propias de UNIX.
- dirent.h: libreria para el manejo de directorios.

- 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.

Descripción de funciones utilizadas.
- DIR *opendir(char *dirname): Esta función abre el directorio a leer.

- 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.

Para más información sobre estas funciones consultar el libro El lenguaje de Programación C (Pag. 198-204).



CODIGO FUENTE  ( practica.c )

Para conseguir el programa compilado pulsar AQUI

/********************************************************************
 *  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);
 }
}

AUTORES

Esta practica a sido realizada:

            Victor Manuel Herrero Rodriguez
            Javier Acosta Molinero

Direcciones de correo:

sisos16@duero.lab.fi.uva.es
sisos01@duero.lab.fi.uva.es

[Explicación] [Documentación] [Programa] [Autores]