Linux文件io编程实验心得,Linux文件IO编程学习笔记

本文档详细介绍了Linux文件IO编程的基础操作,包括文件的打开、读写、创建、权限设置、同步以及高级技巧如使用umask、O_DIRECT和lseek。深入探讨了文件权限的管理,如chmod和umask的用法,以及如何通过O_CREAT、O_TRUNC等标志控制文件行为。
摘要由CSDN通过智能技术生成

Linux文件IO编程学习笔记

文件的基本操作

int fd;

d = open (filename,flags,mode);

write (fd, buf, write_len);

sync ();

fsync (fd);

lseek (fd, 0, SEEK_SET);

read (fd, buf, read_len);

close (fd);

文件的打开open

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

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

执行成功时:

返回一个文件描述符

将文件的读写位置偏移设置为0

根据flags标志位给出的模式打开文件

执行失败时

返回-1

设置errno

主参数

只读模式:O_RDONLY

只写模式:O_WRONLY

读写模式:O_RDWR

副参数

O_CREAT:当文件不存在时创建该文件,文件存在时该位无效

O_EXCL:与O_CREAT组合使用,当文件存在时,open调用失败,防止创建文件时出现竞争。

O_DIRECT:直接I/O

O_SYNC:同步I/O

O_ASYNC:用于终端或套接字、指定文件读写时产生一个信号

O_APPEND:追加模式

O_NOFOLLOW:若文件是一个软链接,则open调用失败

O_NOBLOCK:非阻塞模式打开

O_TRUNC:若文件存在,将文件长度截断为0,(FIFO、终端设备无效)

Create:O_WRONLY|O_CREAT|O_TRUNC组合封装

文件的关闭close

int close (int fd);

成功:返回0

失败:返回-1,并设置errno

TIPS

文件关闭并不意味该文件的数据已经被写到磁盘

一个进程运行结束,会自动关系其打开的文件描述符

显式关闭文件、尤其是对于对大量文件进行读写的后台程序

文件的创建

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

创建文件要指定文件的权限,默认为未定义

文件的读写权限

创建文件:open

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

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

所有者 群组 其它人

R W X R W X R W X

读: 4

写: 2

执行:1

未定义: 0/-

修改读写权限

$ chmod o+w hello.c

$ chmod a-x hello.c

+:增加权限

- :删除权限

=:重新赋值,使之成为唯一的权限

u:所有者

g:所有者所在群主(group)

o:其他人(others)

a:所有人

系统调用

int chmod (const char *pathname, mode_t mode);

int fchmod (int fd, mode_t mode);

pathname:可以是文件名、硬链接、软链接

mode:新设置的权限为,可以是8进制,也可以是掩码形式

– 0777、0666

– S_IRUSR | S_IWUSR | S_IRGRP

– S_IRUSR:用户读权限 (Permits the file’s owner to read it)

– S_IWUSR:用户写权限 (Permits the file’s owner to write to it)

– S_IXUSR:用户执行权限 (Permits the file’s owner to execute it)

– S_IRGRP:用户组读权限 (Permits the file’s group to read it)

– S_IWGRP:用户组写权限 (Permits the file’s group to write to it)

– S_IROTH:其他组读权限 (Permits others to read it)

– S_IWOTH:其他组写权限 (Permits others to write to it)

问题

使用open打开并创建一个新文件,打开模式mode参数设置为0777。

创建出来的文件权限为-rwxr-xr-x。

进程会使用umask命令屏蔽用户组和其他用户的写权限,可能是为了安全起见。

文件的读写函数

基本函数

ssize_t read (int fd, void *buf, size_t count);

从fd指向的文件读取count个字节数据到缓冲区buf中

读取成功:返回读取数据的长度、移动文件位置指针

读取失败:返回-1,并设置errno值

ssize_t write (int fd, const void *buf, size_t count);

将缓冲区buf中的数据写入fd指向的文件中

写入成功:返回写入的字节数,并更新文件位置指针

写入失败:返回-1,并设置errno值

写入零个字节:返回0

read函数解析

read的返回值

ssize_t read (int fd, void *buf, size_t count);

返回值为count:成功读取count个字节

返回值为(0,count)

文件位置指针到了文件末尾

读取的文件长度小于count

系统调用被信号打断

管道可能被破坏

返回值为0:文件位置指针到了文件末尾(EOF)

返回值为-1:读写错误,并设置errno值

write函数调用

write函数调用成功,数据不一定写到磁盘上

void sync (void);

int syncfs (int fd);

文件读写位置与定位

改变文件位置指针

成功的read

成功的write

主动的lseek

f07817c4ac163f6ab233f5dbf3929611.png

改变文件偏移量

lseek函数

off_t lseek( int fd, off_t offset, int whence);

参数offset:可以为正、可以为负、可以为0

参数whence

SEEK_SET:文件开头

SEEK_CUR:文件当前偏移位置

SEEK_END:文件尾部

42df874d3527087932065c1023c1201f.png

文件空洞

文件结束标志EOF

文件存储数据最后一个字节的下一个位置

当文件指针到了EOF,继续读写,会发生怎么情况?

read:返回 0

write:可以在任意位置写

文件空洞:从文件结尾到新写入数据之间的空间

d2259efdb853c02b2e6f84d91992c3c3.png

TIPS

字符设备、Socket、终端设备等流式设备不支持lseek

管道、FIFO不支持lseek

获取文件的属性信息

文件数据的存储

纯数据:存储在data block中

元数据:存储在inode table中

文件名:存储在目录文件的目录项中

元数据

文件时间戳

文件权限

文件所有权

文件存储地址

链接数

标签:文件,int,编程,read,fd,mode,IO,Linux,权限

来源: https://blog.csdn.net/m0_38139533/article/details/115408793

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值