不带缓存的文件I/O操作

2019-07-13 07:11发布

我们知道在嵌入式Linux中一切皆为文件,主要有这几种文件:-表示的普通文件;d表示的目录文件;l表示的链接文件;c表示的字符设备;b表示的块设备;p表示的管道文件,如FIFO文件;f表示的堆栈文件,如LIFO        不带缓存的文件I/O操作主要用到6个函数creatopenreadwritelseekclose。这里的不带缓存是指每一个函数都只调用系统中的一个函数,这些函数虽然不是ANSI C的组成部分,但是是POSIX的组成部分。下面分说一下6个函数:         creat函数:                       表头文件为:#include
                                         #include
                                         #include                         函数定义为:int creat(const char * pathname, mode_tmode);(当一个文件已存在,重新创建一个文件会被覆盖,但不报错;当新建文件名与文件重名时会报错。)                         参数pathname指向欲建立的文件路径字符串。creat( )相当于使用下列的调用方式调用open( )                         creat( )会返回新的文件描述词,若有错误发生则会返回-1,并把错误代码设给errno                                    open函数:                          表头文件为:#include
                                         #include
                                         #include                          函数定义为: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                         函数定义:ssize_t write (int fd,const void * buf,size_t count);                         说明:write( )会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置也会随之移动。                         返回值:如果顺利,write( )会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。             read函数: 表头文件:#include                          函数定义:ssize_t read(int fd,void * buf ,size_t count);                          说明:read( )会把参数fd所指的文件传送count个字节到buf指针所指的内存中。若参数count0,则read( )不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。                           返回值:如果顺利,read( )会返回实际读到的字节数,最好能将返回值与参数count作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read( )被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。            lseek函数:                          表头文件:#include
                                         #include                          函数定义: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_CURSEEK_END时,参数offet允许负值的出现。下列是较特别的使用方式:
                             欲将读写位置移到文件开头时,lseekint fildes,0,SEEK_SET)。
                        欲将读写位置移到文件尾时,lseekint fildes0,SEEK_END)。
                  想要取得目前文件位置时,lseekint fildes0,SEEK_CUR                          返回值:当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节;若有错误则返回-1errno会存放错误代码。             close函数:                          表头文件:#include                          函数定义:int close(int fd);                          说明:close( )用来关闭open( )打开的文件。                          返回值:若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno             代码示例:文件的(创建、打开、写入、读取、关闭)







编译结果