前言
linux系统中所有的I/O 操作都是通过读文件或者写文件的方式来完成的。linux系统中,把键盘、显示器和其他所有的外围设备都看成是文件系统中的文件。
(在linux系统中,一切皆文件。)
【直接IO】
数据直接在磁盘和应用程序地址空间之间进行传输。
【缓存IO】
磁盘和应用程序地址空间的数据传输需要经过系统内核缓存空间。
文件操作函数
打开文件
int open(const char *path, int oflags);
int open(const char *path, int oflags,mode_t mode);
- 参数path
路径名或者文件名。路径名为绝对路径名。 - 参数oflags
打开文件所采取的动作。
下面三个选项是必须选择其中之一:
O_RDONLY:文件只读
O_WRONLY :文件只写
O_RDWR :文件可读可写
下面是可以任意选择的:
O_APPEND :每次写操作都写入文件的末尾
O_CREAT :如果指定文件不存在,则创建这个文件
O_EXCL :如果要创建的文件已存在,则返回-1,并且修改errno 的值
O_TRUNC :如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
O_NOCTTY :如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK: 如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继续将I/O设置为非阻塞模式(nonblocking mode)
O_NDELAY :和O_NONBLOCK 功能类似,调用O_NDELAY 和使用的O_NONBLOCK: 功能是一样的。 - 参数mode
当文件不存在时,该函数有创建文件的概念,此参数用于设置创建文件的权限。
user权限:
S_IRWXU 00700 user (file owner) has read, write, and execute permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
组权限:
S_IRWXG 00070 group has read, write, and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
其他用户权限:
S_IRWXO 00007 others have read, write, and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
关闭文件
int close(int fd);
调用close 函数之后,会取消open 函数建立的映射关系,句柄将不再有效,占用的空间将被系统释放。
写入数据
ssize_t write(int fd,const void *buf,size_t count)
- 参数fd
使用open 函数打开文件之后返回的句柄。 - 参数*buf
需要写入的数据。 - 参数count
将参数*buf 中最多count 个字节写入文件中。 - 返回值
ssize 类型,出错会返回-1,其它数值表示实际写入的字节数。
读取数据
ssize_t read(int fd,void *buf,size_t len)
- 参数fd
使用open 函数打开文件之后返回的句柄。 - 参数*buf
读出的数据保存的位置。 - 参数len
每次最多读len 个字节。 - 返回值
ssize 类型,出错会返回-1,其它数值表示实际读出的字节数,返回值大于0 小于len 的数值都是正常的。