今天就跟大家聊聊有關linux系統(tǒng)中怎么調用sys_close,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。
網(wǎng)站建設公司,為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制網(wǎng)站建設服務,專注于成都定制網(wǎng)頁設計,高端網(wǎng)頁制作,對成都玻璃鋼雕塑等多個行業(yè)擁有豐富的網(wǎng)站建設經(jīng)驗的網(wǎng)站建設公司。專業(yè)網(wǎng)站設計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)網(wǎng)站推廣優(yōu)化,H5建站,響應式網(wǎng)站。
1 根據(jù)文件描述符,把指針數(shù)組對應項置空。
2 如果指向的file結構也沒有其他進程使用了,則file結構體可以重用。但是他指向的inode節(jié)點需要回寫到硬盤。具體參考iput函數(shù)。
// 解除文件描述符->file結構體->inode的關聯(lián)
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結構引用數(shù)減一,非0說明還有其他進程或描述符在使用該結構,所以還不能釋放file和inode
if (--filp->f_count)
return (0);
// 沒有進程使用了則釋放該inode或需要回寫到硬盤
iput(filp->f_inode);
return (0);
}
// 釋放inode,如果沒有被引用了,則銷毀,否則引用數(shù)減一即可
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);
// 引用數(shù)減一,還有進程在引用則先不銷毀
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,不需要回寫硬盤,引用數(shù)減一即可
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節(jié)點,引用數(shù)減一后返回
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系統(tǒng)中怎么調用sys_close有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
新聞標題:linux系統(tǒng)中怎么調用sys_close
本文來源:http://sd-ha.com/article10/jgedgo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、域名注冊、定制開發(fā)、微信公眾號、網(wǎng)站維護、虛擬主機
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)