APUE——文件IO
2013-08-18 10:52
405 查看
1.文件描述符
文件描述符(fd)是一个无符号整数,Unix使用中文件描述符0、1、2分别对应标准输入、标准输出、标准错误。在unistd中分别定义了STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO来表示0、1、2。2.open函数
#include <fcntl.h> //注意open定义在这个头文件中 int open( const char * pathname,int flags, …/*mode_t mode*/); //成功返回文件描述符,出错返回-1
函数说明参数pathname指向欲打开的文件路径字符串。下列是参数flags所能使用的旗标:
O_RDONLY以只读方式打开文件
O_WRONLY以只写方式打开文件
O_RDWR以可读写方式打开文件。
上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。
O_CREAT若欲打开的文件不存在则自动建立该文件。
O_EXCL如果O_CREAT也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若
O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。
O_TRUNC若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。
O_APPEND当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
也可以调用create函数来创建一个文件,但是create创建的文件是只写的,如果要读的话,就要先关闭文件然后再open,所以不如直接用带O_CREATE的open函数。
注意:第三个参数是文件权限参数,在用O_CREAT标志打开文件的时候,如果不默认是需要至指定权限的,最为宽松的权限就是0x777。
3. close函数
#include <unistd.h> int close(int filedes); //filedescriptor //成功为0,出错为-1
4. lessk函数
#include <unistd.h> off_t lseek(int filedes, off_t offset, int whence); //成功返回新的文件偏移量,出错返回-1
whence可以取的值有三种:SEEK_SET、SEEK_CUR、SEEK_END,代表的数字分别问0、1、2,表示文件开始、当前位置、文件末尾。
问题:如果使用添加标志(O_APPEND)打开一个文件读写,能否用lseek在任意位置开始读?能否用lseek在任意位置输入?
答:可以在任意位置读,但是调用write写是,自动调至文件尾进行添加,且是原子操作。
代码示例:
//创建一个具有空洞的文件 #include <fcntl.h> #include <unistd.h> #include <stdio.h> char str1[]=”Hello”; char str2[]=”World”; int fd; int main() { if((fd=open(“file.hole”,O_CREATE|O_RDWR))==-1) { printf(“open file error!\n”); return 0; } write(fd,str1,5); lseek(fd,10000,SEEK_SET); write(fd,str2,5); return 0; }
5.read&write函数
#include <unistd.h> ssize_t read(int filedes, void *buf, size_t nbytes); //成功返回读入的字节数,文件结尾返回0,出错返回-1 ssizet write(int filedes, void *buf, size_t nbytes); //成功返回已写字节数,出错返回-1 //这两个函数的参数是一样的,注意其中的缓冲区
6.dup&dup2函数
dup和dup2都是用来复制一个现存文件描述符的。#include <unistd.h> int dup(int filedes); int dup2(int filedes, int filedes2); //成功返回新的文件描述符,出错返回-1
由dup返回的文件描述符一定是当前未用文件描述符中最小的,而dup2是可以指定复制到哪个文件描述符(第二个参数),如果filedes2已经打开,那么就先关闭,然后再复制。
7.sync、fsync和fdatasync函数
sync就是冲洗缓冲区,就像C++中用的cin.sync()操作。理解这几个函数首先要有内核的缓冲区和写队列的概念。#include <unistd.h> int fsync(int filedes); int fdatasync(int filedes); //成功返回0,出错返回-2 void sync(void); /*说明:sync是对所有文件起作用,将所有修改过的块缓冲,排入写队列,但是不等待写完成即返回;fsync只对文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束;fdatasync类似于fsync,但它只影响文件的数据部分,fsync还会同步更新文件的属性*/
相关文章推荐
- APUE_Chapter03_文件IO_笔记总结
- APUE文件IO
- 文件IO --APUE第三章原创练习代码
- 【APUE】文件IO
- APUE-CH3 文件IO(1)
- apue笔记第三章文件IO
- APUE第三章 文件IO
- APUE-1文件IO
- APUE笔记—C语言标准IO库之文件IO
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
- APUE第三章 文件IO
- apue之文件IO
- apue学习笔记--第三章-- 文件IO
- APUE-CH3 文件IO(2)
- APUE_chapter3 文件IO
- APUE学习笔记-文件IO
- apue- chapter 3 文件IO
- APUE文件IO总结,文件描述符、原子操作
- apue第三章 文件IO 笔记
- java IO系统--文件I/O