为了完成一个项目,我必须使用文件“创建”动态HDD(我称他为FDD)。该文件首先包含一个寻址表,其中包含一个inode的off_t。
一个inode包含n个off_t,每个off_t代表文件中群集的开始。
很好!
然后,我添加了一个选项来删除FDD中包含的文件。为避免孔过大,我将它们保存在地址表(称为“空表”)中,该地址表知道孔在哪里以及孔的大小。
这实际上是行不通的...实际上,当我删除文件时,我注意到它在我的空表中,它很好地添加了漏洞,最后,我的表已完全损坏(其值为“ 47878465” ....)。我的FDD占用的内存也超过了400GB(大约3kB时),不知道为什么...
这里的“无效表” .c和.h
失败来自函数“ ajouterVide”,恰好是我写英文注释的地方。
___________。H
`typedef struct{
int taille[NTAB];
off_t vide[NTAB];
off_t next;
off_t mypos;
}vide;`
___________。C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "virtualFS.h"
#include "inode.h"
#include "inode_t.h"
#include "table.h"
#include "table_t.h"
#include "tableVide.h"
vide* creerVide(){
int i;
vide* v = (vide*)malloc(sizeof(vide));
v->next = -1;
v->mypos = sizeof(table);
for(i=0; i<NTAB; i++){
v->vide[i] = -1;
v->taille[i] = 0;
}
return v;
}
void freeVide(vide** v){
free(*v);
*v = NULL;
}
off_t saveVide(int fd, vide* v){
off_t curr = lseek(fd, 0, SEEK_CUR);
if(curr == -1){
perror("");
exit(EXIT_FAILURE);
}
if(write(fd, v->taille, sizeof(int) * NTAB) == -1){
perror("Ecriture n");
exit(EXIT_FAILURE);
}
if(write(fd, v->vide, sizeof(off_t) * NTAB) == -1){
perror("");
exit(EXIT_FAILURE);
}
if(write(fd, &v->next, sizeof(off_t)) == -1){
perror("");
exit(EXIT_FAILURE);
}
if(write(fd, &v->mypos, sizeof(off_t)) == -1){
perror("");
exit(EXIT_FAILURE);
}
return curr;
}
vide* loadVide(int fd){
vide* v = creerVide();
if(read(fd, v->taille, sizeof(int) * NTAB) == -1){
perror("Lecteure1 vide");
exit(EXIT_FAILURE);
}
if(read(fd, v->vide, sizeof(off_t) * NTAB) == -1){
perror("Lecture vide");
exit(EXIT_FAILURE);
}
if(read(fd, &v->next, sizeof(off_t)) == -1){
perror("Lecture vide");
exit(EXIT_FAILURE);
}
if(read(fd, &v->mypos, sizeof(off_t)) == -1){
perror("Lecture vide");
exit(EXIT_FAILURE);
}
return v;
}
vide* rechercherTableVide(int fd, int* indice){
int ind = 0;
vide* v, * newv;
lseek(fd, 0 , SEEK_SET);
loadTable(fd);
v = loadVide(fd);
afficherVide(v);
while(v->vide[ind] != -1){
if(ind == NTAB){
ind = 0;
if(v->next != -1){
lseek(fd, v->next, SEEK_SET);
freeVide(&v);
v = loadVide(fd);
}else{
newv = videEnfant(fd, v);
freeVide(&v);
v = newv;
}
}else
ind++;
}
*indice = ind;
return v;
}
void ajouterVide(int fd, inode* i, off_t pos){
int j, ind = 0;
vide* v = NULL;
size_t taille;
for(j=0; j<NBLOCK; j++){
if(i->tab_ad[j] == -1)
j = NBLOCK;
else{
v = rechercherTableVide(fd, &ind);
v->vide[ind] = i->tab_ad[j];
if(j == NBLOCK-1 || i->tab_ad[j + 1] == -1) /*On est au dernier bloc, potentiellement plus petit*/
taille = i->taille % TBLOCK;
else{
int jj;
taille = TBLOCK;
for(jj=j; jj<NBLOCK-1; jj++){
if(contigue(i->tab_ad[jj], TBLOCK, i->tab_ad[jj+1]) == 1){
if(jj == NBLOCK-2 || i->tab_ad[jj+2] == -1)
taille += i->taille % TBLOCK;
else
taille += TBLOCK;
j++;
}else
jj = NBLOCK;
}
}
v->taille[ind] = taille;
lseek(fd, v->mypos, SEEK_SET);
saveVide(fd, v);
/*If i load / save / load / save many times, its always Ok here*/
freeVide(&v);
}
}
v = rechercherTableVide(fd, &ind);
/*Here its completly fucked :( */
v->vide[ind] = pos;
v->taille[ind] = tailleInode(i);
lseek(fd, v->mypos, SEEK_SET);
saveVide(fd, v);
freeVide(&v);
}
int contigue(off_t d1, size_t taille, off_t d2){
return d1 + (off_t)taille == d2 ? 1 : 0;
}
最佳答案
我找到了对该问题的解释。这是由于数据结构对齐引起的,我已经成功解决了问题:)
感谢一切。