歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核中的文件描述符(三)--fd的回收

Linux內核中的文件描述符(三)--fd的回收

日期:2017/3/1 10:03:36   编辑:Linux內核

Kernel version:2.6.14

CPU architecture:ARM920T

1.close函數

上圖說明了close(fd)的執行過程,主要包括兩部分:釋放文件描述符fd,關閉文件file。

//fs/open.c
asmlinkage long sys_close(unsigned int fd)
{
struct file * filp;
struct files_struct *files = current->files;//獲得當前進程的files結構
struct fdtable *fdt;

spin_lock(&files->file_lock);
fdt = files_fdtable(files);//通過進程的打開文件列表獲得文件描述符位圖結構
if (fd >= fdt->max_fds)
goto out_unlock;
filp = fdt->fd[fd];
if (!filp)
goto out_unlock;
rcu_assign_pointer(fdt->fd[fd], NULL);
FD_CLR(fd, fdt->close_on_exec);
__put_unused_fd(files, fd);//釋放文件描述符
spin_unlock(&files->file_lock);
return filp_close(filp, files);//關閉文件

out_unlock:
spin_unlock(&files->file_lock);
return -EBADF;
}

2.釋放文件描述符__put_unused_fd

static inline void __put_unused_fd(struct files_struct *files, unsigned int fd)
{
struct fdtable *fdt = files_fdtable(files);
__FD_CLR(fd, fdt->open_fds);//清除位圖中的相應標記
if (fd < fdt->next_fd)
fdt->next_fd = fd;//如果釋放的fd小於next_fd,則next_fd = fd,下次分配從next_fd開始。
//因此釋放一個fd後,再打開或創建一個文件放回的可能還是剛釋放的fd
}

Copyright © Linux教程網 All Rights Reserved