网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

linux系统中怎么调用sys_close

今天就跟大家聊聊有关linux系统中怎么调用sys_close,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于成都定制网页设计,高端网页制作,对成都玻璃钢雕塑等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业网站推广优化,H5建站,响应式网站。


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<    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有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


分享题目:linux系统中怎么调用sys_close
链接分享:http://bjjierui.cn/article/jgedgo.html

其他资讯