掛載完成之后,文件系統(tǒng)就可以使用了,可以拉出來練練了。
open
常見的編程語言的文件操作,都會(huì)有一個(gè)open函數(shù),它們最終都會(huì)調(diào)用系統(tǒng)調(diào)用open。這個(gè)系統(tǒng)調(diào)用的定義在kernel/fs/open.c。
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
if (force_o_largefile())
flags |= O_LARGEFILE;
return do_sys_open(AT_FDCWD, filename, flags, mode);
}
do_sys_open
do_sys_open是所有文件打開的必經(jīng)之路,有必要好好的研究一下它。
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
struct open_flags op;
int fd = build_open_flags(flags, mode, &op);
struct filename *tmp;
if (fd)
return fd;
tmp = getname(filename);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
struct file *f = do_filp_open(dfd, tmp, &op);
if (IS_ERR(f)) {
put_unused_fd(fd);
fd = PTR_ERR(f);
} else {
fsnotify_open(f);
fd_install(fd, f);
}
}
putname(tmp);
return fd;
}
先看fd = get_unused_fd_flags(flags);,這句是要獲得fd。fd是file descriptor,即文件描述符。對(duì)于小白來說,這個(gè)東西會(huì)比較抽象,這里先理清一下。
文件描述符
現(xiàn)代計(jì)算機(jī)可以并發(fā)運(yùn)行多個(gè)程序,每個(gè)程序就是一個(gè)進(jìn)程。當(dāng)我們說打開文件時(shí),主語就是某一個(gè)進(jìn)程,即我們可以說“某個(gè)進(jìn)程打開了文件”。
文件在被訪問之前都要先打開(原因這里先不管),若甲進(jìn)程打開了一個(gè)文件后,乙進(jìn)程也要訪問這個(gè)文件,那么乙進(jìn)程也要打開文件,然后才能訪問。也就是說,每個(gè)進(jìn)程對(duì)文件的開關(guān)狀態(tài)都是獨(dú)立的。
將視角聚焦到一個(gè)進(jìn)程上,它可以同時(shí)打開多個(gè)文件,這些被這個(gè)進(jìn)程打開的文件都會(huì)有一份相關(guān)信息被放在內(nèi)存里,其中一個(gè)信息就是這個(gè)fd。這個(gè)fd可以簡單理解為進(jìn)程打開的文件的編號(hào),編號(hào)從0開始。在Linux系統(tǒng)中,新創(chuàng)建的進(jìn)程會(huì)默認(rèn)打開標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出文件,它們的fd值是0,1,2,當(dāng)我們?cè)俅蜷_一個(gè)文件時(shí),它的fd會(huì)是3。當(dāng)我們關(guān)閉文件時(shí),它的fd值會(huì)被釋放,可以重新用作其它文件的打開???code>get_unused_fd_flags可知,最小的沒被占用的fd會(huì)被優(yōu)先返回。