Linux C开发-I/O技术
- Linux文件类型分类
- :普通文件
- d:目录文件
- l:链接文件
- c:字符设备文件(键盘、串口)
- b:块设备文件(硬盘、CDROM)
- p:管道文件(pipe,缓冲文件)
- f:堆栈文件
- s:共享文件
- 文件描述符:
- 动态分配:只要当操作这个文件时,系统才会给你分配文件描述符
- 知道一个文件的id,操作这个id,等于操作这个文件
- 非负整数:存在0 1 2这三个文件描述符,所以动态分配文件描述符从3开始
- 程序开始运行时,有三个文件被自动打开:
- /dev/stdin:标准输入文件:STDIN_FILENO
- /dev/stdout:标准输出文件:STDOUT_FILENO
- /dev/stderr:标准出错输出文件:STDERR_FILENO(无缓冲)
3. 无缓冲访问文件(系统调用)
- 头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
- creat
- 函数原型:int creat(const char * pathname, mode_tmode);
实例:creat(fd, S_IRUSR | S_IWUSR |
S_IRWXG | S_IRWXO); - 参数pathname指向欲建立的文件路径字符串
- 返回值:成功时返回新文件的描述符,失败返回-1
- open
- 函数原型:int open( const char * pathname, int flags);
int open( const char * pathname, int flags, mode_t mode);
实例:open(argv[1], O_RDWR | O_CREAT | O_APPEND, 0655) - 参数pathname指向欲打开的文件路径字符串,下列是参数flags所常用的旗标:
- O_RDONLY:只读方式打
- O_WRONLY:只写方式打开
- O_RDWR:可读写方式打开
- O_CREAT:若欲打开的文件不存在,则自动建立该文件
- O_EXCL:检查文件是否存在。不存在则建立该文件,否则将导致打开文件错误
- O_TRUNC:若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,并清空文件内资料
- O_APPEND:读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面
- 返回值:成功时返回0值,失败返回-1
- 功能覆盖creat,所以一般直接使用open函数
- 注意事项:多次open同一文件,实现共享操作时,指定O_APPEND可以防止数据相互覆盖的发生
- write
- 函数原型:ssize_t write (int fd, const void * buf, size_t count);
实例:write(fd, “hello\n”, 6); - write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内,文件读写位置也会随之移动
- 返回值:成功时返回实际写入的字节数,失败返回-1
- read
- 函数原型:ssize_t read(int fd,void * buf ,size_t count);
实例:read(fd, &temp, 1) - 把参数fd所指的文件传送count个字节到buf指针所指的内存中,此外文件读写位置会随读取到的字节移动
- 返回值:成功时返回实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,有错误发生时则返回-1
- lseek
- lseek(int fildes,off_t offset ,int whence);
实例:lseek(fd, 0, SEEK_END); - 用来控制文件的读写位置。参数fildes为已打开的文件描述词;参数offset为根据参数whence来移动读写位置的位移数,参数whence为下列其中一种
- SEEK_SET:参数offset即为新的读写位置
- SEEK_CUR:以目前的读写位置往后增加offset个位移量
- SEEK_END:将读写位置指向文件尾后再增加offset个位移
- 返回值:成功时返回目前的读写位置,也就是距离文件开头多少个字节;否则返回-1
- close
- 函数原型:int close(int fd);
- close()用来关闭open()打开的文件
- 返回值:成功时返回0,有错误发生时则返回EOF
- 注:有open()就要有close()释放空间
- fcntl
- 函数原型:int fcntl(int fd, int cmd, … /* arg */ );
- fd指向打开的文件,cmd代表控制命令,通过指定不同的宏来修改fd所指向文件的性质,通过fcntl可以设置、或者修改已打开的文件性质
- F_DUPFD
- F_GETFL、F_SETFL
- F_GETFD、F_SETFD
- F_GETOWN、F_SETOWN
- F_GETLK或F_SETLK或F_SETLKW
- 返回值:成功时返回值视具体参数而定,失败则返回-1
- ioctl
- 函数原型:int ioctl(int fd, ind cmd, …);
- fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,ioctl是设备驱动程序中对设备的I/O通道进行管理的函数,设备的一些特性进行控制