linux文件IO
目录
一、文件描述符
二、打开文件: open
三、读取:read
四、写入:write
五、 关闭: close
不带缓冲
不带缓冲指的是每个read和write都调用内核中的相应系统调用
不带缓冲的I/O函数不是ANSI C的组成部分,但是是POSIX和XPG3的组成部分
通过文件描述符来访问文件
一、文件描述符
对于内核而言,所有打开文件都由文件描述符引用。
文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。
当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
在posiX.1应用程序中,幻数0、1、2应被代换成符号常数STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。
这些常数都定义在头文件<unistd.h>中。
由shell默认打开,分别为0/1/2
标准文件 文件描述符 介绍
标准输入 0(stdin) 从键盘输入
标准输出 1(stdout) 从屏幕输出
标准错误输出 2(stderr) 从屏幕输出(错误信息)
hello.txt 3 hello.txt
二、打开文件: open
man open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:
打开文件
参数:
pathname:文件名
flags:打开的方式
O_RDONLY:只读的方式打开文件
O_WRONLY:只写的方式打开文件 这三个参数互斥
O_RDWR:读写的方式打开文件
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。
O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。
O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据
(清空模式)
O_APPEND:以添加方式打开文件,所以对文件的写操作都在文件的末尾进行
(追加模式)
mode:模式:被打开文件的存取权限,为8进制表示法。
如果以0777创建,会设置权限为0775
返回: 成功返回文件描述符、
失败返回-1,并返回错误码
标准IO和文件IO的权限
标准IO 文件IO
fopen open
r O_RDONLY
r+ O_RDWR
w O_WRONLY|O_CREAT|O_TRUNC,0664
w+ O_RDWR|O_CREAT|O_TRUNC,0664
a O_WRONLY|O_CREAT|O_APPEND,0664
a+ O_RDWR|O_CREAT|O_APPEND,0664
三、读取:read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:
根据文件描述符,读取相应的文件中的数据
参数:
fd:文件描述符
buf:读取出来的数据存放的位置
count:读取数据的字节大小
返回值:
成功返回读取的字节数,读到末尾成功返回0
失败返回-1,并设置错误码
四、写入:write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:
根据文件描述符,写入数据到相应的文件中
参数:
fd:文件描述符
buf:写入的数据存放的位置
count:写入数据的字节大小
返回值:
成功返回写入的字节数
失败返回-1,并设置错误码
五、 关闭: close
#include <unistd.h>
int close(int fd);
功能:
关闭文件描述符对应的文件
参数:
fd:文件描述符
返回值:
成功返回0
失败返回-1,并设置错误码