linux c lseek (空洞文件) 分析和处理

首先测试标准输入是否可以进行lseek操作

[[email protected] 03]# cat ex03-lseek-01.c

/*文件ex03-lseek-01.c,

使用lseek函数测试标准输入是否可以进行seek操作*/

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

int main(void)

{

off_t offset = -1;

/*将标准输入文件描述符的文件偏移量设为当前值*/

offset = lseek(stdin, 0, SEEK_CUR);

if(-1 == offset){

/*设置失败,标准输入不能进行seek操作*/

printf("STDIN can‘t seek\n");

return -1;

}else{

/*设置成功,标准输入可以进行seek操作*/

printf("STDIN CAN seek\n");

};

return 0;

}

[[email protected] 03]# ./ex03-lseek-01

STDIN can‘t seek

----------------------------------------------------------------------------

[[email protected] 03]# cat ex03-lseek-02.c

/*文件ex03-lseek-02.c,

使用lseek函数构建空洞文件*/

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

int main(void)

{

int fd = -1,i;

ssize_t size = -1;

off_t offset = -1;

/*存放数据的缓冲区*/

char buf1[]="01234567";

char buf2[]="ABCDEFGH";

/*文件名*/

char filename[] = "hole.txt";

int len = 8;

/*创建文件hole.txt*/

fd = open(filename,O_RDWR|O_CREAT,S_IRWXU);

if(-1 == fd){

/*创建文件失败*/

return -1;

}

/*将buf1中的数据写入到文件Hole.txt中*/

size = write(fd, buf1,len);

if(size != len){

/*写入数据失败*/

return -1;

}

/*设置文件偏移量为绝对值的32*/

offset = lseek(fd, 32, SEEK_SET);

if(-1 == offset){

/*设置失败*/

return -1;

}

/*将buf2中的数据写入到文件hole.txt中*/

size = write(fd, buf2,len);

if(size != len){

/*写入数据失败*/

return -1;

}

/*关闭文件*/

close(fd);

return 0;

}

[[email protected] 03]# cat hole.txt

01234567ABCDEFGH

[[email protected] 03]# od -c hole.txt              #16进制工具od查看

0000000   0   1   2   3   4   5   6   7  \0  \0  \0  \0  \0  \0  \0  \0

0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

0000040   A   B   C   D   E   F   G   H

0000050

linux c lseek (空洞文件) 分析和处理

时间: 2024-08-25 03:57:19

linux c lseek (空洞文件) 分析和处理的相关文章

linux实践之ELF文件分析

linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf.o文件. 查看scn15elf.o中各个段和符号表的信息. 各个段的详细信息如下. 符号表的信息如下: 使用readelf命令查看各个段的详细信息: 段表信息如下: 符号表信息如下: 下面让我们开始分析文件头吧! 由于我的虚拟机是32位的,我下面就主要以32位的系统进行分析,就不比较32位机和64

Unix - 文件里构成一个空洞的分析

lseek函数显示地为一个打开文件设置偏移量,文件偏移量能够大于文件的当前长度,在这样的情况下.对该文件的下一次写将加长该文件.并在文件里构成一个空洞,这一点是同意的. 位于文件里但没有写过的字节都被读为0. eg: holeFile.c函数创建了一个具有空洞的文件,执行观察: 能够看到,文件里的30个未写入字节都被设置读为0.每一行開始的一个7位数是以八进制形式表示的字节偏移量. 将刚创建的文件与相同长度但舞空洞的文件进行比較 尽管两个文件的长度同样,但无空洞文件占用了20个磁盘块,而具有空洞

Linux系统开发 2 文件IO open() close() read() write() perror() lseek() fcntl() ioctl()

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 大纲 Linux系统开发 man 文档的使用 文件IO open() 创建文件,指定权限位 open() 接收参数 创建文件 open() 传两个参数 第三个参数从内存取垃圾值 write()函数 向文件写数据 write()函数的覆盖操作 open()函数文件的追加 open() 创建文件,如果文件已经存在,就报错 测试一个程序最多能创建1021个文件,3个STDIN STDOUT STDERR已经存在了

Unix - 文件中构成一个空洞的分析

lseek函数显示地为一个打开文件设置偏移量,文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这一点是允许的.位于文件中但没有写过的字节都被读为0. eg: holeFile.c函数创建了一个具有空洞的文件,运行观察: 可以看到,文件中的30个未写入字节都被设置读为0.每一行开始的一个7位数是以八进制形式表示的字节偏移量. 将刚创建的文件与同样长度但舞空洞的文件进行比较 虽然两个文件的长度相同,但无空洞文件占用了20个磁盘块,而具有空洞的文

Linux常用命令(十二)日志文件分析

? ? ? ? ? ? ? ? ? ? ? ? Linux常用命令(十二)日志文件分析 日志文件是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的"日记".不同的日志文件记载了不同类型的信息,如Linux内核消息.用户登录事件.程序错误等. 一.主要日志文件 ???? ? ? ? 在Linux系统中,日志数据主要包括以下三种类型. ■ 内核及系统日志: 这种日志数据由系统服务rslslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消

Linux根文件皇冠体育平台开发系统:/etc/init.d/rcS文件分析

rcS文件的作用皇冠体育平台开发论坛:haozbbs.com Q1446595067 rcS是一个脚本文件,在inittab文件中本解析调用,用于配置Linux系统.2.rcS文件分析 #! /bin/sh #指定系统使用的shell PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: #初始化环境变量PATH,操作系统执行程序默认到PATH指定的目录下寻找该程序 runlevel=S #设置系统运行级别为S,即单用户模式,只有一个控制台终端,供

Linux C高级编程——文件操作之系统调用

Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神的无限的! 库函数是一些完成特定功能的函数,一般由某个标准组织制作发布,并形成一定的标准.使用库函数编写的函数一般可以应用于不同的平台而不需要做任何修改,具有很好的可移植性. 系统调用函数与操作系统直接相关,不同的操作系统所使用的系统调用可能不太一样,因此,如果两个操作系统差异很大,系统调用函数的可移植性就不高.例如windows采用的系统调用的应用程序不能直接在Linux下编译运行. 之所以使用系统调用是因为系统资源

Linux环境编程之文件I/O(三):文件的读写

(一) 当我们打开了一个文件后,一般对文件的操作就是读写.读写函数分别是read.write. #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: fd:利用open.creat得到的文件描述符. buf:buf是void *类型,用于表示通用指针,此处指所读取到的数据的内存缓冲. count:需要读取的数据量. 返回值:成功执行时,返回所读取的数据的字节数,一般等于或小于所请求读取的数据字节数.若已到文

Linux服务器挂死案例分析

问题现象: 在linux服务器上运行一个指定的脚本时,就会出现无数个相同进程的,而且不停的产生,杀也杀不掉,最后系统就陷入死循环,无法登陆,只能人工去按机器的电源键才可以.这够崩溃的吧? 问题分析过程: 在分析过程中发现这个特定的脚本有些特别,和系统中已有的命令的名字是相同的. 以free命令为例: 这个脚本名字就叫做free(后面没有带.sh),而且这个脚本文件里又去调用了free命令. 这个脚本的本意应该是要去调用free命令来完成一个任务. 那是否就是因为这样就会导致问题呢? 其实光这样是