sisoputnfrba / foro

Foro de consultas para el trabajo práctico
148 stars 7 forks source link

Manejo del archivo Osada #445

Closed mapeb closed 8 years ago

mapeb commented 8 years ago

Buenas tardes, me habían recomendado la utilización de la biblioteca mman.h para que se mapee el archivo y sincronizarlo con las estructuras que tengo en memoria.

La cuestión es que no esta muy claro, y no se si me lo estoy complicando. Otra manera seria hacer un fwrite todo el tiempo y andar moviendo el puntero sobre el archivo con muchas cuentas. Tienen algún consejo?

Matiasarapura commented 8 years ago

Hola, yo use fopen()(para abrir el archivo) y fread(), a fread le podes poner una estructura, por el momento me mapeo bien y no tuve problema alguno.

agustinlk commented 8 years ago

Hola! Perdón que no vengo a aportar, si no a pedir ayuda. No estoy logrando que el fread() interprete los campos del archivo en número correcto. Ejemplo con el que estoy probando: unsigned char fs_blocks[4]; fread(fs_blocks,4,1,file);

Pero la variable queda: fs_blocks[0]='0' fs_blocks[1]='64' fs_blocks[2]='0' fs_blocks[3]='0'

El número binario que representa al resultado en decimal sería el 16384. Que es justamente el 'Tamaño del FS' del archivo. Estoy haciendo algo mal en la lectura? Gracias!

Matiasarapura commented 8 years ago

Segun lo que entendia el header era lo primero que tenia el archivo, use esto, y me trajo bien todo con la estructura que esperaba

fread(header,sizeof(osada_header),1,file);

y para leer la tabla de archivos tenes que pasar el bitmap, una vez que leiste el header, tu puntero en el FILE queda al final del header (principio de bitmap). El tamaño del bitmap lo tenes en el header(pero en bloques).

Matiasarapura commented 8 years ago

De nada, si vos le pones SEEK_CUR Toma la posicion actual del puntero en FILE, si ahi le sumas 64*CantBloques deberias llegar :D

mapeb commented 8 years ago

A lo que voy es que en caso de reservar un bloque para un archivo o directorio por ejemplo tenes que ir al bitmap, luego a la tabla de asignación y luego al bloque de datos. Que son 3 movimientos de punteros con distintos cálculos que se vuelve engorroso, en ves si hay alguna herramienta que lo haga automático según la estructura de ram sería más rápido

agustinlk commented 8 years ago

Uuuh, no pensé que tenía exactamente la misma estructura que el struct osada-header. Tan simple era y yo leyendo bytes por bytes. Gracias!

Matiasarapura commented 8 years ago

Si creaste un archivo vacio , esta bien que traiga todo 0, no tenes nada en tu fileSystem.

Como llenarlo no lo se, aca terminan mis conocimientos.

fpatalagoity commented 8 years ago

Buenas, me sumo a la cadena de favores jajaja, me tira error esta línea y no entiendo por qué: fread(&osada_header,OSADA_BLOCK_SIZE,1,arch);

me dice too few arguments...

agustinlk commented 8 years ago

Para el bitmap. Existe alguna estructura que represente a un vector de bits? O hay que inventar algo con un vector de bytes? En este caso voy a tener que hacer algo para mapear un bit del archivo a un byte de mi vector. Gracias!!!!

mgarciaisaia commented 8 years ago

¡Qué rápido escaló este thread!

@mapeb: la función que te nombraron probablemente sea mmap (que, 😮, se encuentra en mman.h - y yo que pensé que era un typo). No te quiero jurar nada, pero entiendo que una de las charlas que vamos a dar el sábado 17 va a ser una introducción a mmap.

En dos palabras, mmap te permite operar un archivo como si fuera memoria. La joda no es simplemente que usás corchetitos para direccionar bytes en lugar de hacer fseek(), si no que, además, las escrituras se hacen "gratis" - el SO se encarga de que cuando escribís """en memoria""", eso se escriba en el disco eventualmente.

La alternativa es, como bien dicen, hacer fread, fwrite y floquesea. Ambas opciones son válidas.


@Nicobile, @agustinlk, @fpatalagoity: crear nuevos threads en el foro es reeeeeeeeeeeeeeee barato. Si los problemas o dudas que están teniendo no son sobre el mismo problema que el thread (en este caso, una pregunta sobre mmap), abran un issue nuevo y lo vemos ahí. "El público" que lo lee va a ser el mismo, y evitamos que se pierda alguna duda o consulta entre todos los mensajes. De los 14 mensajes que tiene el thread, 2 tienen que ver con la consulta de la compañera - y el resto son conversaciones aparte que bastante poco tienen que ver :/

Colaboremos entre todos con el orden, así nos entorpecemos el laburo lo menos posible 😉

NicolasEndler commented 8 years ago

como se puede hacer si quiero acceder a un bloque determinado

mgarciaisaia commented 8 years ago

@NicolasEndler dale, jugátela, che :)

¿Qué se te ocurre que podrías necesitar hacer? ¿Cuál sería tu estrategia para resolver ese problema? ¿En qué sub-problemas lo dividirías? ¿Cuáles se te ocurre cómo implementar y cuáles no?

Metele, dale :)

afilgueira commented 8 years ago

Buenas, habiendo pasado tanto tiempo de la ultima respuesta... solucionamos sus problemas? Podemos cerrar el issue?

afilgueira commented 8 years ago

Voy a asumir que si. Si no es el caso, por favor reabran el issue!