小工具知识网

当前位置: 首页 > 行业知识 > 文件基础和文件fd

行业知识

文件基础和文件fd

2026-10-29 17:21:34 来源:互联网转载

文章目录

  • 预备知识
  • C语言的文件接口
  • 系统调用
  • ���件fd

    正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。

    预备知识

    我们平时说文件就是说文件里面有什么,那么空文件有大小吗?答案肯定是有的,我们平时所说的文件除了文件的内容以外还存在文件的创建时间,大小等等,这是文件的属性,所以文件 = 内容 + 属性的。所以我们对文件的操作无非就是对文件内容或者对文件属性的操作。不管是内容还是属性,它们本质都是数据,所以他们被存储在磁盘中,就是磁盘文件。所以我们要访问一个文件的时候都是要把这个文件打开的,该文件被打开前就是磁盘文件,被打开后,因为CPU只和内存打交道,所以被打开的文件一定会被加载到内存。所以加载磁盘文件,一定会访问外设,这部分工作是由OS来做的。

    一个进程是可以打开很多文件的,所以进程和文件的比例关系一定是 1 :n 。而在我们的系统中是有很多进程的,所以被打开的文件也可能会非常的多,所以OS要对这些文件进行管理,管理的本质就是先描述在组织,因此在OS中存在struct file结构体来描述文件,所以以后打开一个文件就创建一个file结构体,把他们用链表链起来,对文件的管理就成了对该链表的增删查改。

    C语言的文件接口

    C语言打开文件的是fopen

    第一个参数就是打开文件的名称,可以使用绝对路径也可以使用相对路径,第二个参数是打开的模式,经常用的就是w以写的方式打开,但是每次打开都会清空文件,不存在就创建,还有一种常用的是a以追加的方式打开,每次打开不会清空文件,直接在文件结尾进行写入,依然是不存在就创建。还有r方式,是以只读的方式打开。经常用的就是这三种模式。

    我们会发现w模式和我们指令所讲的输出重定向非常像。

    a模式和追加重定向非常相似。

    系统调用

    我们再来认识一个系统调用open。

    open函数是一个系统用调用,它的第一个参数就是文件名,和fopen一样,但是第二个参数是标志位。标志位有很多但是这里我们只介绍常用的几种。第三个参数是文件的权限,一般来说只有创建文件的时候需要设置。

    关于函数传入标志为的技巧是Linux中常用的传参方式,接下来给兄弟们演示一下什么叫做标志位传参。

    #include #define Print1 1#define Print2 (1     if(flag & Print1) printf("i am Print1\n");    if(flag & Print2) printf("i am Print2\n");    if(flag & Print3) printf("i am Print3\n");    if(flag & Print4) printf("i am Print4\n");}int main(){    printflag(Print1);    printf("============================\n");    printflag(Print1 | Print2);    printf("============================\n");    printflag(Print1 | Print2 | Print3);    printf("============================\n");    printflag(Print1 | Print2 | Print3 | Print4);    printf("============================\n");    return 0;}    int flag = 0;    int is_read;    if(c == 'a')    {        flag = O_WRONLY | O_APPEND | O_CREAT;    }    else    {        if(c == 'w')        {        flag = O_WRONLY | O_TRUNC | O_CREAT;        }        else        {            if(c == 'r')            {                flag = O_RDONLY;                is_read = 1;            }            else            {                //TODO            }        }    }    int fd = 0;    if(is_read)    {        fd = open(str, flag, 0x666);        if(fd 

上一篇:大米CMS安装全攻略,轻松上手,一键搞定,极速开启你的内容管理之旅!

下一篇:影视级渲染服务器租赁怎么收费啊