Linux---lseek函数

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进制数形式表示的字节偏移量。




























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值