溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux系統(tǒng)中怎么調(diào)用sys_close

發(fā)布時(shí)間:2021-06-24 15:54:57 來(lái)源:億速云 閱讀:285 作者:Leah 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)linux系統(tǒng)中怎么調(diào)用sys_close,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。


1  根據(jù)文件描述符,把指針數(shù)組對(duì)應(yīng)項(xiàng)置空。
2 如果指向的file結(jié)構(gòu)也沒有其他進(jìn)程使用了,則file結(jié)構(gòu)體可以重用。但是他指向的inode節(jié)點(diǎn)需要回寫到硬盤。具體參考iput函數(shù)。

// 解除文件描述符->file結(jié)構(gòu)體->inode的關(guān)聯(lián)
int sys_close(unsigned int fd)
{    
    struct file * filp;

    if (fd >= NR_OPEN)
        return -EINVAL;
    // 清除close_on_exec標(biāo)記,該標(biāo)記表示fork+exec時(shí)關(guān)閉該文件
    current->close_on_exec &= ~(1<<fd);
    if (!(filp = current->filp[fd]))
        return -EINVAL;
    // 當(dāng)前進(jìn)程的文件描述符指針置空
    current->filp[fd] = NULL;
    if (filp->f_count == 0)
        panic("Close: file count is 0");
    // file結(jié)構(gòu)引用數(shù)減一,非0說明還有其他進(jìn)程或描述符在使用該結(jié)構(gòu),所以還不能釋放file和inode
    if (--filp->f_count)
        return (0);
    // 沒有進(jìn)程使用了則釋放該inode或需要回寫到硬盤
    iput(filp->f_inode);
    return (0);
}

// 釋放inode,如果沒有被引用了,則銷毀,否則引用數(shù)減一即可
void iput(struct m_inode * inode)
{
    if (!inode)
        return;
    // 有進(jìn)程在使用該inode則阻塞
    wait_on_inode(inode);
    // 沒有進(jìn)程引用該inode
    if (!inode->i_count)
        panic("iput: trying to free free inode");
    // 管道inode
    if (inode->i_pipe) {
        // 喚醒等待隊(duì)列,因?yàn)樵摴艿揽赡芤讳N毀了,不然那會(huì)使等待者無(wú)限等待,這句是不是可以放到if后
        wake_up(&inode->i_wait);
        // 引用數(shù)減一,還有進(jìn)程在引用則先不銷毀
        if (--inode->i_count)
            return;
        // 釋放管道對(duì)應(yīng)的一頁(yè)大小
        free_page(inode->i_size);
        // 該inode可以重用,因?yàn)閕node指向inode_table的元素
        inode->i_count=0;
        inode->i_dirt=0;
        inode->i_pipe=0;
        return;
    }
    // 沒有dev說明不是硬盤文件對(duì)應(yīng)的inode,不需要回寫硬盤,引用數(shù)減一即可
    if (!inode->i_dev) {
        inode->i_count--;
        return;
    }
    if (S_ISBLK(inode->i_mode)) {
        // 塊文件,inode->i_zone[0]保存的是設(shè)備號(hào),把buffer中屬于該dev設(shè)備的回寫到硬盤
        sync_dev(inode->i_zone[0]);
        wait_on_inode(inode);
    }
repeat:
    // 還有進(jìn)程引用該inode節(jié)點(diǎn),引用數(shù)減一后返回
    if (inode->i_count>1) {
        inode->i_count--;
        return;
    }
    // 該inode沒有進(jìn)程引用了,inode對(duì)應(yīng)的文件也沒有被其他目錄項(xiàng)引用了,刪除該inode的內(nèi)容,并釋放該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;
}

看完上述內(nèi)容,你們對(duì)linux系統(tǒng)中怎么調(diào)用sys_close有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI