函数类型:open、 write、 read、 lseek、 close函数属于文件的系统调用。
包含有文件:<sys/stat.h>,<sys/types.h>,<fcntl.h>
文件描述符:实质就是一个整数,当做是文件的ID,在系统中唯一标识文件。对文件read、write、lseek、close操作时就会用到文件描述符。系统开始运行时,一般会有三个已经打开的文件描述符:
- 0:标准输入
- 1:标准输出
- 2:标准错误
1,open函数
Linux中open的函数原型有两个:
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode );
参数说明。
@path:准备打开的文件或设备名字。如:path="/home/work/text.txt"
@oflags:指出要打开文件的访问模式,三种访问模式如下:O_RDONLY: 只读方式打开文件
O_WRONLY: 只写方式打开文件
O_RDWR: 读写方式打开文件
注意:
1,O_RDONLY、O_WRONLY、O_RDWR三个标志只能使用任意的一个。
2,open调用还可以在oflags参数中包括下列可选模式进行组合(用按位或"|"操作),部分可选模式如下:
O_APPEND: 以追加的方式打开文件
O_CREAT 创建一个文件
O_EXCL如果使用了O_CREAT而且文件已经存在,就会发生一个错误
O_NOBLOCK 以非阻塞的方式打开一个文件
O_TRUNC 如果文件已经存在,则删除文件的内容
@mode:如果flags中使用了O_CREAT标志,则调用open函数的时候不仅需要加上打开文件的模式(oflags),还需要设置文件的用户权限(mode)。
常见的mode如下:
S_IRWXU 用户可以读、写、执行
S_IRUSR 用户可以读
S_IWUSR 用户可以写
S_IXUSR 用户可以执行
S_IRWXG 组可以读、写、执行
S_IRGRP 组可以读
S_IWGRP 组可以写
S_IXGRP 组可以执行
S_IRWXO 其他用户可以读、写、执行
S_IROTH 其他用户可以读
S_IWOTH 其他用户可以写
S_IXOTH 其他用户可以执行
S_ISUID 设置用户执行ID
S_ISGID 设置组的执行ID
注意:1,mode也可以用数字表示,和chmod 777 /usr/a.out用法类似。从最高位开始分别对应的权限是:当前用户权限,组权限,其他用户权限。
2,每一位是一个八进制数,{r,w,x}=第一位表示读权限,第二位表示写权限,第三位表示可执行权限。有权限则设为1,没有则设为0.建议使用数字表示权限,用起来方便简洁。
eg,
int fd;
fd = open("../test/myfile", O_RDWR | O_CREAT, 0644); //mode也可以用S_IRWXU| S_IRGRP| S_IROTH表示
or
fd=open(/home/test/text.c,O_RDWR);
@返回值:成功返回的fd>0,失败返回的fd<0(fd=-1).
2,read函数
Linux中read的函数原型:
size_t read(int fildes, void *buf, size_t nbytes);
参数说明:
fildes:文件描述符,标识要读取的文件。如果为0,则从标准输入读数据。类似于scanf()的功能。
*buf:缓冲区,用来存储读入的数据。
nbytes:要读取的字符数。
返回值:size_t返回成功读取的字符数,它可能会小于请求的字节数。
3,write 函数
Linux 中write()的函数原型:
size_t write(int fildes, const void *buf, size_t nbytes);
参数说明:
fildes:文件描述符,标识了要写入的目标文件。例如:fildes的值为1,就像标准输出写数据,也就是在显示屏上显示数据;如果为 2 ,则想标注错误写数据。
*buf:待写入的文件,是一个字符串指针。
nbytes:要写入的字符数。
函数返回值:size_t 返回成功写入文件的字符数。需要指出的是,write可能会报告说他写入的字节比你所要求的少。这并不一定是个错误。在程序中,你需要检查error已发现错误,然后再次调用write写入剩余的数据。
4,lseek函数Linux 中lseek()的函数原型:
off_t lseek(int fd, off_t offset, int whence);
fd是打开的文件描述符,offset是与参考偏移的位置,whence是文件参考的位置,它一共有三个位置,
SEEK_SET 文件开始,如果使用此偏移,那么文件定位到offset的位置
SEEK_CUR 文件读写指针的当前位置
SEEK_END 文件结尾
lseek返回值是文件读写指针移动之后的位置,-1表示失败
a,取得文件当前偏移位置可以如下: f_offset = lseek(fd, 0, SEEK_CUR);
b,文件大小可以通过下面: f_len = lseek(fd, 0, SEEK_END);
c,使用lseek函数移动好读写指针之后,使用read,write即可往文件里面读写数据。
5,close函数
Linux 中close()的函数原型:
int close(int fildes);
作用:close系统调用用于“关闭”一个文件,close调用终止一个文件描述符fildes以其文件之间的关联。文件描述符被释放,并能够重新使用。
返回值:close成功返回1,出错返回-1.
参考:1,http://www.cnblogs.com/yanlingyin/archive/2012/08/04/2617209.html
2,http://blog.csdn.net/yao_guet/article/details/6460900