浅尝辄止62-FAT32-内核4

挂载完成之后,文件系统就可以使用了,可以拉出来练练了。

open

常见的编程语言的文件操作,都会有一个open函数,它们最终都会调用系统调用open。这个系统调用的定义在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是所有文件打开的必经之路,有必要好好的研究一下它。

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,即文件描述符。对于小白来说,这个东西会比较抽象,这里先理清一下。

文件描述符

现代计算机可以并发运行多个程序,每个程序就是一个进程。当我们说打开文件时,主语就是某一个进程,即我们可以说“某个进程打开了文件”。
文件在被访问之前都要先打开(原因这里先不管),若甲进程打开了一个文件后,乙进程也要访问这个文件,那么乙进程也要打开文件,然后才能访问。也就是说,每个进程对文件的开关状态都是独立的
将视角聚焦到一个进程上,它可以同时打开多个文件,这些被这个进程打开的文件都会有一份相关信息被放在内存里,其中一个信息就是这个fd。这个fd可以简单理解为进程打开的文件的编号,编号从0开始。在Linux系统中,新创建的进程会默认打开标准输入、标准输出和标准错误输出文件,它们的fd值是0,1,2,当我们再打开一个文件时,它的fd会是3。当我们关闭文件时,它的fd值会被释放,可以重新用作其它文件的打开。看get_unused_fd_flags可知,最小的没被占用的fd会被优先返回。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • epoll概述 epoll是linux中IO多路复用的一种机制,I/O多路复用就是通过一种机制,一个进程可以监视多...
    发仔很忙阅读 10,965评论 4 35
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,725评论 0 3
  • 一、Linux系统概述 不加引号可理解为宏,直接替换,单引号中特殊字符会被解释为普通字符,双引号中$,,'还是特殊...
    赤果_b4a7阅读 1,551评论 0 2
  • iOS 10系统下调用系统相册,相机功能及调用通讯录,麦克风时遇到闪退的情况,描述如下: 崩溃描述: 这个程序已经...
    MangoJ阅读 676评论 0 0
  • 一个月的时间过得很快,这个月也发生了很多烦心的事情,身体不适,频繁孕吐,天气忽冷忽热,工作程序繁琐,被生活琐事所困...
    爱吃糖糖的小魔女阅读 361评论 0 0