0

私の 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の理由についてのヘルプ関数がセグメンテーション違反エラーを出しています。ありがとうございました!

4

0 に答える 0