我们知道在嵌入式Linux中一切皆为文件,主要有这几种文件:-表示的普通文件;d表示的目录文件;l表示的链接文件;c表示的字符设备;b表示的块设备;p表示的管道文件,如FIFO文件;f表示的堆栈文件,如LIFO。
不带缓存的文件I/O操作主要用到6个函数creat、open、read、write、lseek和close。这里的不带缓存是指每一个函数都只调用系统中的一个函数,这些函数虽然不是ANSI C的组成部分,但是是POSIX的组成部分。下面分说一下6个函数:
creat函数:
表头文件为:#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
函数定义为:int creat(const char * pathname, mode_tmode);(当一个文件已存在,重新创建一个文件会被覆盖,但不报错;当新建文件名与文件重名时会报错。)
参数pathname指向欲建立的文件路径字符串。creat( )相当于使用下列的调用方式调用open( ):
creat( )会返回新的文件描述词,若有错误发生则会返回-1,并把错误代码设给errno。
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);(使用access( )作为用户认证的判断要特别小心,例如,在access( )后再进行open( )空文件操作可能会造成系统安全上的问题)。
参数pathname指向欲打开的文件路径字符串,下列是参数flags所能使用的旗标,比较常用的有:
O_RDONLY:以只读方式打开文件。
O_WRONLY:以只写方式打开文件。
O_RDWR:以可读写方式打开文件。
上述三种旗标是互斥的,也就是说它们不可同时使用,但可与下列的旗标利用OR(|)运算符组合。
O_CREAT:若欲打开的文件不存在则自动建立该文件。
O_APPEND:当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
write函数:
表头文件:#include<unistd.h>
函数定义:ssize_t write (int fd,const void * buf,size_t count);
说明:write( )会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。
返回值:如果顺利,write( )会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。
read函数:
表头文件:#include<unistd.h>
函数定义:ssize_t read(int fd,void * buf ,size_t count);
说明:read( )会把参数fd所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read( )不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
返回值:如果顺利,read( )会返回实际读到的字节数,最好能将返回值与参数count作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read( )被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。
lseek函数:
表头文件:#include<sys/types.h>
#include<unistd.h>
函数定义:off_t lseek(int fildes,off_t offset ,int whence);
说明:每一个已打开的文件都有一个读写位置,在打开文件时通常其读写位置指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read( ) 或write( )时,读写位置会随之增加,lseek( )便是用来控制该文件的读写位置的。参数fildes为已打开的文件描述词;参数offset为根据参数whence来移动读写位置的位移数,参数whence为下列其中一种。
SEEK_SET:参数offset即为新的读写位置。
SEEK_CUR:以目前的读写位置往后增加offset个位移量。
SEEK_END:将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR或SEEK_END时,参数offet允许负值的出现。下列是较特别的使用方式:
欲将读写位置移到文件开头时,lseek(int fildes,0,SEEK_SET)。
欲将读写位置移到文件尾时,lseek(int fildes,0,SEEK_END)。
想要取得目前文件位置时,lseek(int fildes,0,SEEK_CUR)
返回值:当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节;若有错误则返回-1,errno会存放错误代码。
close函数:
表头文件:#include<stdio.h>
函数定义:int close(int fd);
说明:close( )用来关闭open( )打开的文件。
返回值:若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。
代码示例:文件的(创建、打开、写入、读取、关闭)
编译结果