linux文件基础-1_文件读写_open的flag

一、文件操作的基础

1、操作系统提供的相关API

1).API函数由linux系统提供,由应用层程序调用,来实现各种功能
2).linux中常用的文件IO接口
open close write read lseek

3).对文件操作的一般步骤
(1)open打开文件得到文件描述符、并检查返回值
(2)对文件进行读写操作(其他的操作)
(3)最后close关闭文件

2、对文件操作的内存情况

1)文件存在与块设备中、静态文件
2)open文件时内核的操作:
(1)进程先建立文件的数据结构,然后再去申请一段内存,将块设备中的静态文件读到内存中(动态文件)
(2)我们对文件的读写操作,是针对这动态文件的操作。与静态文件并不同步。
(3)close关闭文件时,内存中的动态文件去更新块设备中的静态文件。
(4)这么设计的原因:①块设备的限制、②内存可以按字节访问,随机操作

3、文件描述符

1)文件描述符(file descriptor):区分一个程序/进程打开的多个文件
2)文件描述符就是个数字,合法范围为0或者一个正整数,不能是一个负数。这个数字与打开这个文件时的数据结构挂钩,操作动态文件就是通过这个数字来区分。
3)文件描述符的作用域:当前进程
4)对文件的所有操作都是通过这个文件描述fd。

4、实时查man手册

1)查询linux shell : man 1 xx
2)查询API:man 2 xx
3)查询库函数: man 3 xx

5、文件读写

#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    int fd = -1,ret = -1;        // fd 就是file descriptor,文件描述符
    char buf[100] = {0};
    char writebuf[20] = "l love linux";
    
    // 第一步:打开文件
    fd = open("a.txt", O_RDWR);  
    if (-1 == fd)       //(fd < 0)
    {
        printf("文件打开错误\n");
    }
    else
    {
        printf("文件打开成功,fd = %d.\n", fd);
    }
    
    // 第二步:读写文件
    ret = write(fd, writebuf, strlen(writebuf));
    if (ret < 0)
    {
        printf("write失败.\n");
    }
    else
    {
        printf("write成功,写入了%d个字符\n", ret);
    }
/*  
    // 读文件
    ret = read(fd, buf, 5);
    if (ret < 0)
    {
        printf("read失败\n");
    }
    else
    {
        printf("实际读取了%d字节.\n", ret);
        printf("文件内容是:[%s].\n", buf);
    }
*/  
    // 关闭文件
    close(fd);
    return 0;
}

二、open函数等的flag

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

1、读写权限

O_RDONLY :只读方式
O_WRONLY :只写方式
O_RDWR :读写方式
附带权限后只能按照这种权限去操作。

2、打开存在并有内容的文件

O_APPEND: 接续
O_TRUNC: 截断

当我们打开一个已经存在并且内部有内容的文件时会怎么样?

1)只有O_TRUNC:本来是有内容的,则内容会被丢弃
2)只有O_APPEND:本来是有内容的,则新写入的内容会接续到原来内容的后面
3)默认不使用O_APPENDO_TRUNC:不读不写的时候,原来的文件中的内容保持不变
4)O_APPENDO_TRUNC同时出现:O_TRUNCO_APPEND给屏蔽了,即本来是有内容的,则内容会被丢弃

3、打开不存在的文件

O_CREAT: 为了应对这种打开一个并不存在的文件,我们去创建它。
O_EXCL: 与O_CREAT结合使用,则没有文件时创建文件,有这个文件时会报错提醒我们。
1)open使用O_CREAT打开存在的文件,则原来存在的文件会被删除。(类似先删除,再创建新的)

2)mode

当我们使用O_CREAT标志时候,可以使用第三个参数mode开指定创建的权限。
例如创建一个可读可写不可执行的文件:open("a.txt", O_RDWR | O_CREAT | O_EXCL, 0666);

4、O_NONBLOCK(非阻塞)

1)阻塞:一个函数是阻塞的,被调用时,当前进程可能被卡住(函数内部等待的条件没有达到,需要等待条件),不能立刻返回。结果有保障,时间没保障
2)非阻塞:调用这个函数,一定能立刻返回,但是函数的任务不一定完成。时间有保障,结果没保障
3)操作系统给的一些API很多是被设计成阻塞式的ope就是,所以我们希望以非阻塞式打开就需要加O_NONBLOCK的标志。

4)阻塞与非阻塞只用于设备文件,不适用于普通文件。

5、write的同步

O_SYNC(synchronize:同步)
1)没有O_SYNC这个标志:write只将内容写到底层缓冲区即可返回,然后在合适的时间啊in将buf同步到硬盘。这种设计为了提高硬件的操作和性能。
2)有O_SYNC:当我们希望硬件不等待时,直接写入硬盘中。

linux文件基础-1_文件读写_open的flag_第1张图片

注:笔记整理,参考于朱有鹏老师的嵌入式核心课程

你可能感兴趣的:(#,linux应用)