这里说的的文件I/O指的是不带缓存的;
1.关于带缓存的IO操作和不带缓存的IO操作,参见另一篇文章:
Linux中的文件IO(不带缓存的IO)通常用的有以下几个:
open read write lseek close
2.open的参数
int fd(filename, mode);
mode 通常可以是O_RDONLY(只读) O_WRONLY(只写) O_RDWR(读写) 必须指定且只能指定一个!
其他的可供选择,可通过或运算添加:O_APPEND O_CREAT O_EXCL O_TRUNC
3.read与write在读取网络数据时,可能由于网络的缓冲机制等造成实际读到的数据小于应读数据。
4.用lseek实现获取文件大小的功能:
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <fcntl.h> 4 #include <stdlib.h> 5 6 int main(int argc, char ** argv) 7 { 8 off_t size; 9 int nFd; 10 11 if(argc < 2) 12 { 13 printf("Usage: ./size xxx\n"); 14 exit(-1); 15 } 16 17 nFd = open(argv[1], O_RDONLY); 18 if(-1 == nFd) 19 { 20 perror("Open file error"); 21 exit(-1); 22 } 23 size = lseek(nFd, 0, SEEK_END); 24 printf("The file size is : %d\n", size); 25 26 return 0; 27 }
5.dup与dup2函数,都用来复制一个现存的文件描述符
int dup(int fd);
int dup2(int fd1,int fd2);//若 fd2已经打开,则先关闭
6.sync fsync fdatasync函数都可以用来将缓冲区中的数据刷新到物理磁盘
sync函数并不等待实际的写磁盘操作结束后返回。
fsync函数等待写磁盘操作结束后返回,可以用于数据库这样的应用程序。
7.fcntl函数——可以改变已经打开的我文件的性质
#include <fcntl.h>
int fcntl(int fd, int cmd, int arg);
fcntl函数有五种功能:
1.复制一个现有的文件描述符(cmd=F_DUPFD)
2.获取/设置文件描述符(cmd=F_GETFD / cmd=F_SETFD
3.获取/设置文件状态(cmd=F_GETFL / cmd =F_SETFL)
4.获取/设置异步IO所有权(cmd=F_GETOWN / cmd=F_SETOWN)
5.获取/设置文件记录锁(cmd=F_GETLK / cmd=F_SETLK/F_SETLKW)
Linux系统编程_2_文件I/O