c - 调用后出现段错误,但是一个非常相似的函数没有得到段错误错误
问题描述
对于我的一门 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 的任何帮助函数给出分段错误错误将不胜感激!谢谢!
解决方案
推荐阅读
- python - 小数固定精度
- javascript - 已应用 Javascript 样式,但 HTML 中未更改
- python-3.x - 如何在for循环中使用数据框列
- python - 当我合并其中的 2 个时,如何将新列添加到新的 .xlsx 文件中
- mysql - 重启后 XAMPP MySQL 服务崩溃
- machine-learning - Pytorch 中多输出模型的丢失
- react-native - 如何在本机反应中以空键和值作为对象发送 POST 请求
- javascript - 快递,使用不同进口的相同路线?
- reactjs - 如何在上传前预览 PDF 文件?
- python - 如何修复:KeyError:“[Index([...], dtype='object')] 都在 [columns] 中”