私はUnix v6ファイルシステムのモデルを作成しています。私は最初に利用可能な空きブロックをファイルに書き込んでから、必要なときに同じものを読み込んで割り当てようとしました。私は100ブロックの空き配列を持っているので、空きブロックの数が100を超えると、現在の空き配列はfree [0]のメモリブロックに書き込まれ、新しい空きブロックはfree [0] 。以下は、私が書いたサンプルコードです。C言語を使用してファイルに配列を書き込む
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
void splitCommand(char**,char*, char*);
unsigned short freeArr[100];
unsigned short nfree=1,fd;
int main()
{
fd = open("v6", O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IEXEC | S_IWRITE);
freeArr[0] = 0;
for (int i = 28; i < 5000; i++)
{
addFreeBlock(i);
}
unsigned short free1=0 ;
lseek(fd, 3127 * 512, SEEK_SET);
read(fd, &(nfree), sizeof(unsigned short));
printf("%d\n",nfree);
for(int i=0; i<nfree; i++)
{
read(fd, &free1, sizeof(unsigned short));
printf("%d\n",free1);
}
}
void addFreeBlock(int block_no)
{
if(block_no==3127)
{
int a=0;
}
if (nfree == 100)
{
lseek(fd, block_no * 512, SEEK_SET);
write(fd, &(nfree), sizeof(unsigned short)); // copy nfree into free array
write(fd, freeArr, 200);// copy free array
nfree=0;
}
freeArr[nfree] = block_no;
nfree++;
}
合計5000ブロックあるとします。各ブロックの長さは512バイトです。私は他の目的のために最初の27ブロックを使用しているので、私は28から5000までのブロックを書いています。
すべてのブロックを書き込んだ後、ランダムな場所に格納されたブロックを読み込もうとしました。私が3027に格納されたブロックを読み込もうとしたとき、私は2927,2928,2929、...、3026から番号をつけた100ブロックを読み取ることができます。しかし、3127に格納されたブロックを読み込むと、3027、3028、3029、...、3081のブロックだけを読み込むことができます。残りはランダムです。私は他のポジションでもやってみました。それはそれらのいくつかのために働く。
どこに間違っていたのか教えていただけますか?
'nfree'は' int'で、 'sizeof(unsigned short) 'を使用すると' sizeof(nfree) 'が代わりに使用されます。 –
猫はスペースバーに座っていますか?とにかく 'open'の戻り値をチェックしてみませんか? –
@EdHeal、 'open'と' read'と 'write'から...私はすべてが重要だと思います。 –