为了完成一个项目,我必须使用文件“创建”动态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;
}

最佳答案

我找到了对该问题的解释。这是由于数据结构对齐引起的,我已经成功解决了问题:)
感谢一切。

07-24 09:17