文件系统中的块分配-C编程

文件系统中的块分配-C编程,c,linux,filesystems,C,Linux,Filesystems,我必须使用块分配在模拟磁盘上创建一个cp/m文件系统 初始化磁盘创建并初始化磁盘控制结构列表 目录中的文件该目录最初为空 显示自由位图除块0外,所有块最初都是自由的 打开/创建文件如果指定的文件名不在目录中, 将创建一个新文件 读取文件列出文件占用的块(而不是这些块的内容) 写入文件为文件分配另一个块,不应为文件预先分配块,应分配第一个可用块 删除文件取消分配所有块,并释放目录项 正如您在下面的代码中看到的,我正在努力理解如何将基本文件系统功能与块分配集成在一起。我试图用toggle_bit函数

我必须使用块分配在模拟磁盘上创建一个cp/m文件系统

初始化磁盘创建并初始化磁盘控制结构列表 目录中的文件该目录最初为空

显示自由位图除块0外,所有块最初都是自由的

打开/创建文件如果指定的文件名不在目录中, 将创建一个新文件

读取文件列出文件占用的块(而不是这些块的内容)

写入文件为文件分配另一个块,不应为文件预先分配块,应分配第一个可用块

删除文件取消分配所有块,并释放目录项

正如您在下面的代码中看到的,我正在努力理解如何将基本文件系统功能与块分配集成在一起。我试图用toggle_bit函数从头文件中分配结构来初始化磁盘。这样行吗

/* cpm.c
   Useful functions for Workshop E 
*/
#include"cpm.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <dirent.h>
#include <stdlib.h>

#define BUFFERSIZE      4096

void oops(char *, char *);
unsigned char bitmap[12];
struct CPMdirent directory[64];

int toggle_bit(int block) /*directory - initilise disk*/
{

    int elem=block/8;
    int pos=block%8;
    int mask=1<<pos;

    bitmap[elem]^=mask;

    return bitmap[elem]&mask;
}


int block_status(int block)
{
    int elem=block/8;
    int pos=block%8;
    int mask=1<<pos;

    return bitmap[elem]&mask;
}


int main(int argv, char *av[])
{
    int     choice = 0;
    int     input_fd, output_fd, n_chars, status;

    char    buffer[BUFFERSIZE];
    char    cwd[1024];
    char    file_name[9];

    FILE    *fptr;

    struct  dirent *dir;
    DIR     *dp;

    do
    {
        printf("Please choose a task (enter the number)\n");
        printf("1. Intialise Disk\n");

        switch(choice)
        {
            /*Intialising the disk (store directory in arrays)*/
            case 1:
                printf("~~~~~~~~~~~~ Initialising the disk ~~~~~~~~~~~~\n");
                toggle_bit(0);
                directory[0].usercode;
                directory[0].filename[9];
                directory[0].filetype[4];
                directory[0].extent;
                directory[0].blockcount;
                directory[0].blocks[16];
                printf("\nDisk sucessfully initialised.\n");
                break;

    }
    while(choice != 8);

}

void oops(char *s1, char *s2)
{
    fprintf(stderr,"Error: %s ", s1);
    perror(s2);
    exit(1);
}
/*cpm.c
研讨会E的有用功能
*/
#包括“cpm.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义缓冲区大小4096
void oops(char*,char*);
无符号字符位图[12];
结构CPMdirent目录[64];
int-toggle_位(int-block)/*目录-初始化磁盘*/
{
int elem=块/8;
int pos=块%8;

int mask=1这是
C
代码。但是你把代码放进了html代码段。是的,对不起,我使用这个网站有点新:)@Youtrippin你有什么具体的问题吗?请记住,你应该制定一个清晰的问题陈述(目前不起作用的,尽可能详细)和一个所需的输出示例(已经在那里)。请阅读以了解更多有关此问题的信息。我也不太了解整个数据块分配,我需要一些帮助来为我指出正确的方向。但首先,我如何初始化磁盘并检查您是否已初始化它?@Youtrippin如果问题真的是“如何初始化”(我对此表示怀疑),答案是:通过给变量分配有用的值,比如
目录[0]。blockcount=;
如果问题是“什么是有用的值”-您的标记可能有误。您会在CP/M文件系统规范中找到有用的值。这是
C
代码。但您将代码放入html代码段。是的,很抱歉,我使用此网站有点新:)@Youtrippin您有任何具体问题吗?请记住,您应该制定一个明确的问题陈述(目前不起作用的,尽可能详细)和一个示例所需的输出(已经在那里)。请阅读以了解更多有关此问题的信息。我也不太了解整个数据块分配,我需要一些帮助来为我指出正确的方向。但首先,我如何初始化磁盘并检查您是否已初始化它?@Youtrippin如果问题真的是“如何初始化”(我对此表示怀疑),答案是:通过为变量分配有用的值-如
目录[0]。blockcount=;
如果问题是“什么是有用的值”-您的标记可能是错误的。您可以在CP/M文件系统规范中找到有用的值