【问题标题】:Creating a File System, need C advice创建文件系统,需要 C 建议
【发布时间】:2013-10-15 20:41:25
【问题描述】:

我正在用 C 语言构建这个文件系统。目前我正处于任务的第一步,即创建一个在内存中工作的简单文件系统。我的问题更多地基于 C 而不是基于 Unix 文件系统。我正在尝试“模拟”原始磁盘。我有以下结构:

struct disk {
    void *data;
    unsigned int numOfBlocks;
};

让我们假设这个磁盘上的一个块是 512 字节(就像原始的 Unix 文件系统一样)。我定义了一些函数来创建磁盘、从磁盘读取和写入磁盘。然后我的工作就是实现各种东西,例如数据块、i-node 块、超级块等。

查看上面的void *data 变量。我希望这是一个二维数组。它应该是一个块数组的数组。所以...最有意义的是使用这样的东西。

unsigned char *data[30][512]; // Assuming the disk holds 30 blocks of 512 bytes each

问题来了:如果我定义了其他结构来表示 i 节点、超级块或数据块,并且每个结构的 struct 大小为 512 字节,我该如何正确地转换这个 @ 987654325@到i-nodestruct,还是数据struct等?

谢谢。

【问题讨论】:

    标签: c unix filesystems


    【解决方案1】:

    我不确定我是否理解这个问题。

    根据你的说法: My question isn't how to access the characters in the data variable...it's how to take a 512 byte array of unsigned char for instance and convert it to some other type of struct that is 512 bytes long.

    如果你有:

    unsigned char block[512];
    

    和:

    //total struct size: 512 bytes
    struct something {
         //members here
    };
    

    你可以这样做:

    int main(void)
    {
        struct something *ptr;
        ptr = block;
        return 0;
    }
    

    您可以只使用数组字节来保存结构数据。为避免警告,请转换地址:

    ptr = (struct something *)block;
    

    为指针分配内存后,您可以像往常一样使用它。

    注意:由于我是初学者,所以我可能错了。

    【讨论】:

      【解决方案2】:

      void 指向任何东西,所以如果您可以控制void * 的含义,那么您拥有的定义就足够了。

      要将data 作为二维数组访问,您只需转换类型((char (*)[512])data

      char *array[512] = data;
      byte = array[x][y];
      

      编译器不需要知道第二维的大小,您有责任确保您的程序永远不会访问无效位置。

      【讨论】:

      • 我的问题不是如何访问数据变量中的字符...而是如何获取 unsigned char 的 512 字节数组并将其转换为其他类型的 struct即 512 字节长。
      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      相关资源
      最近更新 更多