当前位置:  技术问答>linux和unix

请教高手:多线程访问时如何实现删除一个文件?

    来源: 互联网  发布时间:2015-01-25

    本文导语:  如下要求: 当某一线程欲删除一个文件时,如果另外一些线程正在访问该文件。那么这些线程仍然可以对该文件进行操作。直到所有这些线程关闭了这个文件。该文件才被删除。也就是说,只要有一个线程还打开着...

如下要求:
当某一线程欲删除一个文件时,如果另外一些线程正在访问该文件。那么这些线程仍然可以对该文件进行操作。直到所有这些线程关闭了这个文件。该文件才被删除。也就是说,只要有一个线程还打开着这个文件,该文件的物理空间就没有真正地被删除。(假设是单级目录,即只有根目录)

结构:
////////////////////////////////////
位图模块
class BitMap {
  public:
BitMap(int nitems);     // 初始化方法,给出位图的大小,将所有位标明未用
~BitMap();      // 析构方法
void Mark(int which);   // 标志第which位被占用
void Clear(int which);  // 清除第which位
bool Test(int which);   //测试第which位是否被占用,若是,返TRUE
int Find();            //找到第一个未被占用的位,标志其被占用;
     // 若没有找到,返回-1
int NumClear();      // 返回多少位没有被占用
void Print();      // 打印出整个位图(调试用)
void FetchFrom(OpenFile *file);  //从一个文件中读出位图
void WriteBack(OpenFile *file);  //将位图内容写入文件
  private:
... //内部实现属性
};

////////////////////////////////////
文件头的定义
class FileHeader {
  public:
bool Allocate(BitMap *bitMap, int fileSize);
         // 通过文件大小初始化文件头
         // 根据文件大小申请磁盘空间
void Deallocate(BitMap *bitMap);  // 将一个文件占用的数据空间释放
      // (没有释放文件头占用的空间)
void FetchFrom(int sectorNumber); // 从磁盘扇区中取出文件头
void WriteBack(int sectorNumber); // 将文件头写入磁盘扇区
int ByteToSector(int offset);     // 文件逻辑地址向物理地址的转换
int FileLength();       // 返回文件长度
void Print();       // 打印文件头信息(调试用)
  private:
int numBytes;    //文件长度(字节数)
int numSectors;    //文件占用的扇区数
int dataSectors[NumDirect];    //文件索引表
};

///////////////////////////////////
文件系统模块:
class FileSystem {
  public:
FileSystem(bool format);       // 生成方法
bool Create(char *name, int initialSize); //生成一个文件
OpenFile* Open(char *name);       //打开一个文件
bool Remove(char *name);        //删除一个文件
void List(); //列出文件系统中所有的文件
//(实际上就是根目录中所有的文件)
void Print(); //列出文件系统中所有的文件和它们的内容
  private:
OpenFile* freeMapFile; //位图文件打开文件结构
OpenFile* directoryFile; //根目录打开文件结构
};
////////////////////////////////////
Remove方法
语法: bool Remove (char *name)
参数: name:需要删除的文件名
功能: 在当前的文件系统中删除一个已有的文件
实现: 在根目录下搜寻该文件名
1. 如果没有搜索到,返回FALSE
2. 如果搜索到,打开该文件并返回打开文件控制块
2.1. 将该文件从目录中删除
2.2. 释放FileHeader所占用的空间
2.3. 释放文件数据块占用的空间
2.4. 将对位图和目录的修改写回磁盘
返回: 如果删除成功,返回TRUE;否则返回FALSE

bool FileSystem::Remove(char *name)

    Directory *directory;
    BitMap *freeMap;
    FileHeader *fileHdr;
    int sector;
    
    directory = new Directory(NumDirEntries);
    directory->FetchFrom(directoryFile);
    sector = directory->Find(name);
    if (sector == -1) {
       delete directory;
       return FALSE;  // file not found 
    }
    fileHdr = new FileHeader;
    fileHdr->FetchFrom(sector);

    freeMap = new BitMap(NumSectors);
    freeMap->FetchFrom(freeMapFile);

    fileHdr->Deallocate(freeMap);   // remove data blocks
    freeMap->Clear(sector); // remove header block
    directory->Remove(name);

    freeMap->WriteBack(freeMapFile); // flush to disk
    directory->WriteBack(directoryFile);        // flush to disk
    delete fileHdr;
    delete directory;
    delete freeMap;
    return TRUE;


如何修改remove方法和相应的文件结构,实现上面的要求?


|
由操作系统释放,OS知道哪些进程打开了哪些文件。
创建一个临时文件的典型做法就是用创建方式打开一个文件,然后马上unlink,
但你可以继续使用这个文件句柄读/写,当你close后磁盘空间才被释放。

|
unix就是这样做的。当你删除一个文件时,它的目录项被马上删除。但是只要还有进程打开了该文件,文件所占用的磁盘块就没有释放,直到最后一个进程关闭该文件,文件所占磁盘空间才释放。

建议:多看点Unix系统的书,少看点C++的书。

|
up

|
那你首先要实现对文件的打开记数。

|
用互斥和计数器,可以参照微软的com技术中的关于addRef和release方法

|
那你是要在核心态实现还是用户态?
如果在核心态,根据文件系统的数据结构是可以实现的。
如果在用户态,嘿嘿,我看够戗。
我不了解你的什么nachos。只是随便说说,说错了别见怪。

    
 
 

您可能感兴趣的文章:

  • 请教:线程中调用一个阻塞的方法后,进程及其它线程会阻塞么?
  • 请教大虾:),获取线程id的问题
  • 请教关于线程以及进程通行问题
  • 请教线程问题
  • 请教多线程优先级问题
  • 请教linux 2.6内核移植到arm上最大线程数量的问题。
  • 请教:pthread_join( )在等待一个已经退出的线程时为何会导致死锁?
  • 请教多线程程序的内存占用问题
  • 请教Linux下多线程C++编程
  • 请教如何Kill线程?
  • 请教高手,线程问题,怎样暂停或杀掉多线程?
  • 请教:有什么工具可以“看”到系统中正在运行的线程?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • 入门,请教线程编程的问题,请各路高手帮帮忙
  • 复杂的线程同步问题,请教高手
  • 请教java线程问题
  • 请教一个pthread线程库的使用的问题
  • 请教大家关于多线程
  • 搞不懂TI的demo的线程命名,请教
  • 急,在线等待!!!请教各位同仁一个多线程的问题??
  • 请教:为什么删除不掉?我用超级用户删除某一文件夹rm -R oracle失败。
  • 删除文件出错,请教!
  • 请教高手如何在Linux下删除Apache?!
  • linux 删除命令请教
  • 请教高手AIX中怎么删除行尾的字符^M
  • 高分请教:请问怎么才能得到最近所有有关文件操作(新建,删除等)的记录
  • [请教]shell中删除指定行
  • 请教crontab中运行的程序输出的信息用什么命令删除?
  • 在线等待!请教Linux中删除用户使用什么命令?
  • 请教一下,如何用shell 编程实现删除超过一定时间以前的文件?
  • 请教高手如何在Linux下删除Apache
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • WEB前端 iis7站长之家
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3