文件内容操作相关的调用
open()/read()/write()/close()/lseek()
open()
函数原型:
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, int perms)
Flags:打开方式
返回值:
成功:返回文件描述符
失败:返回 -1
举例:
int fd;
fd = open(“test”, O_RDWR);
fd = open(“test”, O_RDWR | O_CREAT, 0640);
STDIN_FILENO(0),STDOUT_FILENO(1),STDERR_FILENO(2)
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR:以读写方式打开文件
O_CREAT:如果文件不存在,就创建一个新文件,并用第三个参数为其设置权限。
O_EXCL:如果使用O_CREAT时文件存在,则返回错误消息。这一参数可测试文件
是否存在。此时open是原子操作,防止多个进程同时创建同一文件
O_TRUNC:若文件已经存在,那么会删除文件中全部原有数据,并且设置文件大小为0。
O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,
即将写入的数据添加到文件末尾
O_NONBLOCK:如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,
则此选项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。
O_SYNC:使每次write都等到物理I/O操作完成。
O_RSYNC:read 等待所有写入同一区域的写操作完成后再进行。
O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的
那个进程的控制终端。
close()
函数原型:int close(int fd)
参数:
fd:将要关闭的文件描述符。
返回值:
0(成功);
-1(出错)。
举例:
close(fd)
read()
函数原型:ssize_t read(int fd, void *buf, size_t count);
参数:
fd:将要数据的文件描述符。
buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。
count:表示调用一次read操作,应该读多少数量的字符。
返回值:
返回所读取的字节数;
0(读到EOF);
-1(出错)。
思考题:什么情况会导致读取到的字节数小于count?
write()
函数原型: ssize_t write(int fd, void *buf, size_t count);
返回值:
写入文件的字节数(成功);
-1(出错)。
lseek()
函数原型: off_t write(int fd, off_t offset, int whence);
参数:
fd:文件描述符。发布发布发布
offset:偏移量,每一个读写操作所需要移动的距离,单位是字节,可正可负(向前移,向后移)
whence:
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR:当前位置为指针的位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件大小加上偏移量的大小
返回值:
返回当前位移(成功);
-1(出错)。
获得描述符的几种方式
open()
获得一个当前进程未用的最小数值的描述符
socket(),epoll_create()类似open()
fcntl(),cmd=F_DUPFD
获得一个不小于给定参数的未用的最小值的描述符
dup()
获得一个当前进程未用的最小数值的描述符
dup2()
获得一个指定的描述符
fork()
会造成文件打开文件的继承,描述符值相同
影响文件读写指针位置的系统调用
open()
文件指针设置为文件开头位置(绝对偏移为0的位置)
注意:即使打开文件时设置O_APPEND标志,仍然在开头位置
close()
close()调用与文件指针偏移无关
read()
成功时,文件指针位置向文件末尾方向移动实际读取的字节数
write()
成功时,文件指针位置向文件末尾方向移动实际写的字节数
如果打开文件时设置了O_APPEND标志,则在写之前文件指针会自动
的移动到文件末尾处
lseek()
根据需要显示的移动文件读写指针的位置。
SEEK_SET, SEEK_CUR, SEEK_END。
文件描述符的复制
使用fcntl(F_DUPFD)
得到的描述符不小于传入的arg参数值(结果是大于或者
等于arg参数的可用的最小描述符)
使用dup()和dup2()
dup()得到的描述符是顺序分配的可用的最小的描述符,
跟open()调用得到的描述符的分配机制是相同的
dup2()得到的是指定的描述符
通过fork()实现描述符的复制
在子进程中,得到的与父进程值相等的描述符
文件IO和文件系统
文件内容操作相关的调用
open()/read()/write()/close()/lseek()
理解描述符的作用
沟通用户进程和内核的媒介
STDIN_FILENO(0),STDOUT_FILENO(1),STDERR_FILENO(2)
了解内核中的struct file
了解获得描述符的几种方式
文件描述符控制:fcntl()/ioctl()
以上是linux的系统级的文件操作
下面推荐一些扩展
c标准文件io与文件系统的介绍
c标准文件操作与系统级的一些区别
标准IO与文件IO 的区别