//prototipos int chequeoArchivo(char *archivo,time_t *fhcambio,long *tamanio); int cargoArchivo(char *archivo,long int clave,long shmtamanio); //forma de uso de chequeoArchivo() time_t inicio = 0L; long tamanio = 0L; int rc = chequeoArchivo("index.html",&inicio,&tamanio); if ( rc == -1 ) { printf("No puedo obtener info de index.html\n",argv[1]); return 2; } printf("mtime = %li tamanio=%li\n",inicio,tamanio); switch(rc) { case 0: printf("Archivo index.html sin cambio!\n"); break; case 1: printf("Archivo index.html ha cambiado!\n"); // ampliar memoria compartida?? // cargar archivo en memoria compartida break; case -1: printf("Archivo index.html no existe!\n"); break; } ... //forma de uso de cargoArchivo() // supongamos que en argv[1] indico la clave de la memoria compartida, ejemplo "0xA" long int clave = strtol(argv[1],NULL,16); // paso de hexa a decimal // supongamos que tenemos 1KB de memoria compartida, debe ser mas que suficiente para que quepa el archivo! sino desastre!! long shmtamanio = 1024L; /* Formato de la memoria compartida: [long shmtamanio memoria compartida en bytes][long tamanio archivo en bytes][contenido archivo de texto][\0] */ if (!cargoArchivo("index.html",clave,shmtamanio)) { printf("Error cargando index.hmtl en memoria compartida!\n"); return 2; } // listo! archivo cargado en memoria! //implementacion de funciones /* * retorna -1 si hay error, por ejemplo, si no existe archivo * retorna 0 si no hubo cambios y no actualiza fhcambio,tamanio (a menos que sean 0L) * retorna 1 si hubo cambios y actualiza fhcambio,tamanio */ int chequeoArchivo(char *archivo,time_t *fhcambio,long *tamanio) { struct stat info; int rc = stat(archivo,&info); // devuelve 0 si todo Ok if ( rc != 0 ) return -1; if ( !*fhcambio ) *fhcambio = info.st_mtime; if ( !*tamanio ) *tamanio = info.st_size; if ( *fhcambio != ((long) info.st_mtime) ) { *fhcambio = (long) info.st_mtime; *tamanio = (long) info.st_size; return 1; } return 0; } /* * cargo archivo en memoria compartida * 1 todo ok * 0 error */ int cargoArchivo(char *archivo,long int clave,long shmtamanio) { int shmid = shmget(clave,0,0); //debe estar previamente creada de shmtamanio bytes if ( shmid == -1 ) return 0; void *p = shmat(shmid,0,0); if ( p == NULL ) return 0; memset(p,0,(size_t) shmtamanio); // inicializo memoria compartida con \0 long *shmtam = (long *) p; // puntero a tamanio de memoria compartida *shmtam = -1L; // pongo -1L en tamanio mientras actualizo la memoria compartida long *tam = shmtam+1; // puntero a tamanio de archivo (siguiente long) *tam = -1L; // pongo -1L en tamanio mientras actualizo la memoria compartida void *fp = (void *) (tam+1); // puntero a donde debe quedar el contenido del archivo FILE *f = fopen(archivo,"rb"); if ( f == NULL ) return 0; fseek(f,0L,SEEK_END); // calculo tamanio de archivo, parandome al final y preguntando donde estoy long ftam = ftell(f); fseek(f,0L,SEEK_SET); // me paro al comienzo del archivo fread(fp,ftam,1,f); // leo y copio en memoria compartida fclose(f); *shmtam = shmtamanio; // actualizo cabecera de memoria compartida *tam = ftam; shmdt(p); // dejo de usar memoria compartida return 1; }