私の CS クラスの 1 つで、ミニ EXT2 ファイル システムを作成しています。このプログラムでは、関数 mkdir と creat を作成する必要があります。これらの関数の両方で、次のような iput という関数を呼び出します。
int iput(MINODE *mip)
{
// dispose of minode pointed by mip
// Code in Chapter 11.7.2
INODE *ip;
int i, block, offset;
char buf[BLKSIZE];
if (mip==0)
{
return;
}
mip->refCount--;
printf("mip->refcount = %d\n", mip->refCount);
if (mip->refCount > 0)
{
return 0;
}
if (mip->dirty == 0)
{
return 0;
}
// dec refCount by 1
// still has user
// no need to write back
// write INODE back to disk
block = (mip->ino - 1) / 8 + inode_start;
offset = (mip->ino - 1) % 8;
// get block containing this inode
get_block(mip->dev, block, buf);
printf("get block works in iput\n");
ip = (INODE *)buf + offset; // ip points at INODE
*ip = mip->inode; // copy INODE to inode in block
put_block(mip->dev, block, buf); // write back to disk
printf("put block works in iput\n");
//midalloc(mip); //
mip->refCount = 0;
return 1;
}
Minode は、他の変数とともに inode を内部に保持する単なる構造体ラッパーです。私の作成関数のコードは次のとおりです。
int my_creat(MINODE *pip, char *name)
{
MINODE *mip;
int ino = ialloc(pip->dev);
int bno = balloc(pip->dev);
mip = iget(dev,ino);
INODE *ip = &mip->inode;
ip->i_mode = 0x81A4;
ip->i_uid = running->uid;
ip->i_gid = running->gid;
ip->i_size = 0;
ip->i_links_count = 1;
ip->i_atime = time(0L);
ip->i_ctime = time(0L);
ip->i_mtime = time(0L);
ip->i_blocks = 2;
ip->i_block[0] = bno;
for (int i = 1; i < 15; i++)
{
ip->i_block[i] = 0;
}
mip->dirty = 1;
iput(mip);
char buf[BLKSIZE];
dp = (DIR *)buf;
dp->inode = ino;
strncpy(dp->name, ".", 1);
dp->name_len = 1;
dp->rec_len = 12;
char *cp;
cp = buf + 12;
dp = (DIR*)cp;
dp->inode = pip->ino;
dp->name_len = 2;
strncpy(dp->name, "..", 2);
dp->rec_len = BLKSIZE - 12;
put_block(pip->dev,bno,buf);
enter_name(pip,ino,name);
}
そして、ここに私の mkdir 関数のコードがあります:
int mymkdir(MINODE *pip, char *name)
{
MINODE *mip;
int ino = ialloc(pip->dev);
int bno = balloc(pip->dev);
printf("bno inside mymkdir = %d\n", bno);
printf("ino inside mymkdir = %d\n", ino);
char buf[BLKSIZE];
mip = iget(dev,ino);
printf("goes over iget again\n");
INODE *ip = &mip->inode;
ip->i_mode = 0x41ED;
ip->i_uid = running->uid;
ip->i_gid = running->gid;
ip->i_size = BLKSIZE;
ip->i_links_count = 2;
ip->i_atime = time(0L);
ip->i_ctime = time(0L);
ip->i_mtime = time(0L);
ip->i_blocks = 2;
ip->i_block[0] = bno;
for (int i = 1; i < 15; i++)
{
ip->i_block[i] = 0;
}
mip->dirty = 1;
iput(mip);
printf("goes over iput");
dp = (DIR *)buf;
dp->inode = ino;
strncpy(dp->name, ".", 1);
dp->name_len = 1;
dp->rec_len = 12;
char *cp;
cp += dp->rec_len;
dp = (DIR*)cp;
dp->inode = pip->ino;
dp->name_len = 2;
strncpy(dp->name, "..",2);
dp->rec_len = BLKSIZE - 12;
put_block(pip->dev,bno,buf);
enter_name(pip,ino,name);
}
それらは実質的にまったく同じですが、何らかの理由で mkdir で iput を呼び出した後、クラッシュしてセグメンテーション違反エラーが発生しますが、それは私の creat 関数では発生しません。これらは事実上まったく同じ機能であるため、これは意味がありません。したがって、一方が機能していなければ、もう一方も機能していないはずです。また、それらは同じファイルmkdir_creat.cにありますが、iput関数は別のCファイル内にあり、gcc main.c mkdir_creat.cなどを使用してLinuxターミナルから実行しています.mkdirの理由についてのヘルプ関数がセグメンテーション違反エラーを出しています。ありがとうございました!