Advertisement
d1cor

mmap.c

Jun 27th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.53 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : UM - juncotic.com           *
  4. * Title      : Ejemplo modificacion archivo*
  5. *******************************************/
  6.  
  7. #include<stdio.h>
  8. #include<stdio.h>
  9. #include<stdlib.h>
  10. #include<sys/types.h>
  11. #include<sys/stat.h>
  12. #include<unistd.h>
  13. #include<dirent.h>
  14. #include<fcntl.h>
  15. #include<errno.h>
  16. #include<sys/mman.h>
  17. #include<string.h>
  18.  
  19. int main(int argc, char** argv) {
  20.  
  21.     int fd1=0;
  22.     char *buff;
  23.     int i;
  24.     char dst[100];
  25.     char *ini;
  26.  
  27.     // abrimos el file en modo lectura-escritura
  28.     // este archvio originalmente podria contener, por ejemplo, esta cadena:
  29.     // 123456789-_A_-987654321
  30.  
  31.     fd1=open("/tmp/archivo.txt",O_RDWR,(mode_t)0666);
  32.     if(!fd1) goto err;
  33.  
  34.     // mapeamos la memoria en el puntero buff
  35.     if((buff=mmap(NULL,50,PROT_WRITE,MAP_SHARED,fd1,0))==MAP_FAILED){
  36.         close(fd1);
  37.         perror("Error de mapeo");
  38.         exit(EXIT_FAILURE);
  39.     }
  40.  
  41.     // imprimimos por pantalla el contenido del archivo utilizando buff
  42.     printf("El contenido del archivo es:%s, len: %d\n",buff, strlen(buff));
  43.  
  44.     // obtenemos la longitud de la memoria (y por ende, del archivo :-) )
  45.     int len = strlen(buff);
  46.  
  47.     // ciclamos mientras no alcancemos la longitud máxima
  48.     // vamos corriendo el puntero hasta encontrar la letra A
  49.     for(i=0; i<len; i++){
  50.         if (*(buff+i) == 'A'){
  51.             printf("Encontrado en %d\n",i);
  52.             ini = buff+i;
  53.             break;
  54.         }
  55.         printf("Buscando: %c (lenght de lo que queda: %d\n",*(buff+i), strlen((buff+i)));
  56.         sleep(1);
  57.     }
  58.     // cuando se encontró la letra A, ini va a contener el puntero al inicio del bloque de datos que inicia con "A"
  59.     // e "i" va a tener la cantidad de bytes que hay hasta el caracter "A"
  60.  
  61.     // movemos a dst el bloque de datos anterior a "A"
  62.     memmove(dst, buff, i);
  63.  
  64.     // concatenamos a ese bloque, el bloque que sigue a "A"
  65.     memcpy(dst+i, buff+i+1, len-i);
  66.  
  67.     // uso "buff+i+1" para "saltar" el caracter "A", pero puede reemplazarse el 1
  68.     // con los N chars que correspondan a la longitud de los datos a eliminar
  69.  
  70.     printf("DST: %s\n",dst);
  71.     // la cadena resultante deberia haber eliminado la A
  72.     // 123456789-__-987654321
  73.  
  74.     // limpiamos la memoria original del puntero / archivo
  75.     memset(buff,0,len);
  76.  
  77.     // movemos la memoria modificada a la ubilicacion de buff, que es la dir de memoria mapeada
  78.     memmove(buff,dst,len-1);
  79.     // lo mismo, 1 se reemplaza con N bytes si se eliminan N en vez de 1.
  80.  
  81.     munmap(buff,len);
  82.     close(fd1);
  83.     return 0;
  84.  
  85. err:
  86.     fprintf(stderr,"(%d) %s\n",errno,strerror(errno));
  87.     exit(errno);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement