1.lseek 函数
① 获取文件大小
② 移动文件指针
③ 文件拓展---空洞文件
空洞文件就是类似于迅雷下载文件时,任务一旦存在,就会在磁盘相应的位置存在一个与源文件大小一样的文件,但是此文件大小并不占据磁盘存储区。
文件偏移量可以大于文件当前长度,在这种情况下,对该文件的下一次写将加长该文件并在文件中构成一个空洞。位于文件中但没有写过的字节都将被读为0.
起初编译产生错误,后来经过csdnhttp://blog.csdn.net/zhanglei0107/article/details/8309439
得知,FILE_MODE在经过宏定义的并且存在与apue.h头文件中。
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
FILE_MODE是在apue.h中定义的宏变量
文件所有者(owner)有读、写全新;文件组成员只读权限和其他用户只读
S_IRUSR等的header file为 sys/stat.h
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
/*************************************************************************
> File Name: lseek空洞文件.c
> Author:
> Mail:
> Created Time: 2017年07月14日 星期五 14时48分50秒
************************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
char buf1[]="abcdefghij";
char buf2[]="ABCDEFGHIJ";
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main()
{
int fd;
if((fd = creat("file.hole",FILE_MODE))<0)
{
perror("creat error!\n");
exit(1);
}
if(write(fd,buf1,10)!=10)
{
perror("buf1 write error!\n");
exit(1);
}
//offset now = 10
if(lseek(fd,16384,SEEK_SET)==-1)
{
perror("lseek error!\n");
exit(1);
}
/*offset now = 16384*/
if(write(fd,buf2,10)!=10)
{
perror("buf2 write error!\n");
exit(1);
}
/*offset now = 16394*/
return 0;
}
虽说文件的长度是16394,但是文件占有磁盘的大小只有20个字符。
使用od 命令可以观察该文件实际内容,-c表示以字符方式打印文件内容,文件中30个未被写入的内存全是0.每一行开始的一个7位数是以8进制数形式表示的字节偏移量。