- 締切済み
物理ブロック番号でのブロック読み出し方法
ユーザプロセスから、物理ブロック番号によるファイルのブロック読み出し/書き出しする方法を知りたいのですが。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
回答No.2
OSによるので、OSのカテゴリで質問してください。 Unix/Linuxだと、ディスク全体とか、あるパーティション全体とかが、仮想ファイルとして扱えるので多分楽。バイト位置でのアクセスになるので、物理ブロックサイズを調べて、ブロック番号をバイト位置に変換して、root権限でlseekしてreadすればいい。
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
回答No.1
意味が分からない。 本当にC言語の質問なのだろうか? 特殊な環境に依存する読み書きに関する事項なのか?
質問者
お礼
ネットできない環境にいてお礼遅くなりました。確かに言葉足らずでした。linux環境下でのことなのですが・・・。
お礼
ネットできない環境にいてお礼遅くなりました。確かに言葉足らずでした。 ファイルシステムの勉強かねて、ext2/3のext_inodeの論理ブロック(?)から物理ブロックはioctlでなんか取得できそうで、そのファイルシステム上のブロック番号を直接readすることで、ファイルの読み込みを実現できないものか。と思ったしだいです。 int get_blocks(int fd, int nr) { ioctl (fd, FIBMAP, &nr); return nr; } int get_nr_blocks (int fd) { struct stat buf; fstat (fd, &buf); return buf.st_blocks*512/buf.st_blksize; } void disp_blocks(int fd, int nr) { int i, phys_block; for (i = 0; i < nr; i++) { phys_block = get_blocks(fd, i); printf("%d,%d\n", i, phys_block); if (!phys_block) { nr++; } } } int main (int argc, char *argv[]) { int fd, nr; fd = open (argv[1], O_RDONLY); nr = get_nr_blocks (fd); disp_blocks(fd, nr); }