linux 读文件返回-1,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_APPEND和O_TRUNC:不读不写的时候,原来的文件中的内容保持不变

4)O_APPEND和O_TRUNC同时出现:O_TRUNC把O_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:当我们希望硬件不等待时,直接写入硬盘中。

42cdbca24ef63863ca7c47bc2012cf26.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值