read some disk a sector

I write an c program , please read it. 
---------------------------------------- 
/* by hugang at 6/8 9:40 */ 
/* read some disk a sector */ 
#include <stdio.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

#include <linux/fs.h> 

int 
get_disk_sector(int fd){ 
int sectorsize; 

ioctl(fd, BLKSSZGET, &sectorsize) ; 

return sectorsize; 

/** 
* read_disk_sector: 
* @dev: raw disk FILE * 
* @sector: 

* return is the disk sectorsize 





* */ 
extern int errno; 
int 
read_disk_sector(int fd, unsigned long sector, char **p){ 
int sectorsize; 
FILE *fp; 

/* get disk sector size */ 
sectorsize = get_disk_sector(fd); 
if (sectorsize == 0){ 
fprintf(stderr, "get disk sector size failed\n"); 
return (-1); 


/* seek it */ 
lseek(fd, 0 ,SEEK_SET); 
if (lseek(fd, (sectorsize * sector), SEEK_CUR) == -1 ){ 
fprintf(stderr, "seek to %d failed\n" 
, sectorsize * sector); 
return (-1); 

/* read it */ 
*p = (char *)malloc(sectorsize); 
if (*p == NULL){ 
fprintf(stderr, "malloc memory failed\n"); 
return (-1); 


return read(fd, *p, sectorsize); 

/* dump data for display */ 
void 
dump_disk_sector(char *p, int size){ 
int i; 
for (i = 0; i< size; i++){ 
if (i % 8 == 0 && i != 0) 
printf("\n"); 
printf("0x%x,", (unsigned int )p  & 0xff); 


printf("\n"); 
return ; 


int 
main(){ 
char *d; 
int size; 
int fd; 
char *dev = "/dev/hda"; 

/* open it */ 
fd = open(dev, O_RDONLY); 
if (fd == -1){ 
fprintf(stderr, "open %s failed %s\n", dev, strerror(errno)); 
return (-1); 


size = read_disk_sector(fd, 0, &d); 

close(fd); 

if (size <= 0) return (0); 

dump_disk_sector(d, size); 

free(d); 

return (0); 

}


/* use mmap by hugang 6/8 10:03 */ 
/* $Id$ */ 
/* read some disk a sector */ 
#include <stdio.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <linux/fs.h> 

int 
get_disk_sector(int fd){ 
int sectorsize; 

ioctl(fd, BLKSSZGET, &sectorsize) ; 

return sectorsize; 


long 
get_disk_size(int fd){ 
long size; 
ioctl (fd, BLKGETSIZE, &size); 
return size; 

long blk_size; 
char *m; 

/** 
* read_disk_sector: 
* @dev: raw disk FILE * 
* @sector: 
* return is the disk sectorsize 
* */ 
extern int errno; 
int 
read_disk_sector(int fd, unsigned long sector, char **p){ 
int sectorsize; 
struct stat buf; 

/* get disk sector size */ 
sectorsize = get_disk_sector(fd); 
if (sectorsize == 0){ 
fprintf(stderr, "get disk sector size failed\n"); 
return (-1); 

/* map it to memory */ 
m = mmap(NULL, blk_size, PROT_READ, MAP_SHARED, fd, 0); 

if ( m == NULL ){ 
fprintf(stderr, "mmap failed\n"); 
return (-1); 

printf("map @0x%p length 0x%x\n",m , blk_size); 
if ( sector * sectorsize > blk_size ) { 
fprintf(stderr, "too large\n"); 
return -1; 


*p = m + sector * sectorsize; 

return sectorsize; 

/* dump data for display */ 
void 
dump_disk_sector(char *p, int size){ 
int i; 
for (i = 0; i< size; i++){ 
if (i % 8 == 0 && i != 0) 
printf("\n"); 
printf("0x%x,", (unsigned int )p & 0xff); 


printf("\n"); 
return ; 


int 
main(){ 
char *d; 
int size; 
int fd; 
char *dev = "/dev/hda"; 

/* open it */ 
fd = open(dev, O_RDONLY); 
if (fd == -1){ 
fprintf(stderr, "open %s failed %s\n", dev, strerror(errno)); 
return (-1); 


size = read_disk_sector(fd, 0, &d); 

close(fd); 

if (size <= 0) return (0); 

dump_disk_sector(d, size); 

munmap(m, blk_size); 

return (0); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值