今天就跟大家聊聊有关linux系统中怎么调用sys_close,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
1 根据文件描述符,把指针数组对应项置空。
2 如果指向的file结构也没有其他进程使用了,则file结构体可以重用。但是他指向的inode节点需要回写到硬盘。具体参考iput函数。
// 解除文件描述符->file结构体->inode的关联
int sys_close(unsigned int fd)
{
struct file * filp;
if (fd >= NR_OPEN)
return -EINVAL;
// 清除close_on_exec标记,该标记表示fork+exec时关闭该文件
current->close_on_exec &= ~(1<<fd);
if (!(filp = current->filp[fd]))
return -EINVAL;
// 当前进程的文件描述符指针置空
current->filp[fd] = NULL;
if (filp->f_count == 0)
panic("Close: file count is 0");
// file结构引用数减一,非0说明还有其他进程或描述符在使用该结构,所以还不能释放file和inode
if (--filp->f_count)
return (0);
// 没有进程使用了则释放该inode或需要回写到硬盘
iput(filp->f_inode);
return (0);
}
// 释放inode,如果没有被引用了,则销毁,否则引用数减一即可
void iput(struct m_inode * inode)
{
if (!inode)
return;
// 有进程在使用该inode则阻塞
wait_on_inode(inode);
// 没有进程引用该inode
if (!inode->i_count)
panic("iput: trying to free free inode");
// 管道inode
if (inode->i_pipe) {
// 唤醒等待队列,因为该管道可能要被销毁了,不然那会使等待者无限等待,这句是不是可以放到if后
wake_up(&inode->i_wait);
// 引用数减一,还有进程在引用则先不销毁
if (--inode->i_count)
return;
// 释放管道对应的一页大小
free_page(inode->i_size);
// 该inode可以重用,因为inode指向inode_table的元素
inode->i_count=0;
inode->i_dirt=0;
inode->i_pipe=0;
return;
}
// 没有dev说明不是硬盘文件对应的inode,不需要回写硬盘,引用数减一即可
if (!inode->i_dev) {
inode->i_count--;
return;
}
if (S_ISBLK(inode->i_mode)) {
// 块文件,inode->i_zone[0]保存的是设备号,把buffer中属于该dev设备的回写到硬盘
sync_dev(inode->i_zone[0]);
wait_on_inode(inode);
}
repeat:
// 还有进程引用该inode节点,引用数减一后返回
if (inode->i_count>1) {
inode->i_count--;
return;
}
// 该inode没有进程引用了,inode对应的文件也没有被其他目录项引用了,删除该inode的内容,并释放该inode
if (!inode->i_nlinks) {
truncate(inode);
free_inode(inode);
return;
}
// 需要回写硬盘,则回写
if (inode->i_dirt) {
write_inode(inode); /* we can sleep - so do again */
wait_on_inode(inode);
goto repeat;
}
inode->i_count--;
return;
}
看完上述内容,你们对linux系统中怎么调用sys_close有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。