首页 > 解决方案 > 调用后出现段错误,但是一个非常相似的函数没有得到段错误错误

问题描述

对于我的一门 CS 课程,我们正在创建一个迷你 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 以及其他变量。这是我的 creat 函数的代码:

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 的任何帮助函数给出分段错误错误将不胜感激!谢谢!

标签: clinuxmkdirext2

解决方案


推荐阅读