ページ 11

Unix ファイルシステムについて

Posted: 2011年11月17日(木) 17:46
by 心はいつもHelloWorld
UNIXのファイルシステムの簡易版をc言語で作成しようと思ったのですが、
調べていた所、一つのFILEがスーパーブロック、inodeブロック、データブロックなどに分けられているのは理解できました。
が、しかし、そのスーパーブロックなどの構造体はどのようにしてデータブロックなどと一緒にディスクに確保されたのかが、分かりません。。。

たとえば、
creat で データサイズ+inodeブロックサイズ(構造体) + スーパーブロックサイズ(構造体)で個々のブロックのサイズ分のディスクを確保したのはいいのですが、 スーパーブロックなどの構造体をどのように確保したブロックに割り当てアクセスするのがわかりません。

どうかよろしくお願いします。

Re: Unix ファイルシステムについて

Posted: 2011年11月17日(木) 19:25
by beatle
「どのように」というのは、具体的にはデータ構造(構造体の構造)を聞いているのでしょうか?
だとすると、お手本にしたいUNIXのソースコードを入手して調べる、という感じになると思います。

または、「どのように」というのは、どうやってデータ構造をファイルに書きだすのか、という質問のようにも取れます。
その場合はwriteを使えば良いと思います。

Re: Unix ファイルシステムについて

Posted: 2011年11月17日(木) 20:30
by 心はいつもHelloWorld
返信ありがとうございます。
質問が分かりづらく申し訳ありません。

問題はどうやってデータ構造をファイルに書きだすのか、の方です。

beatleさんの助言どうりwriteを使用するとして、

構造体をbufferに格納し書きたいブロックに書き込む。
その書き込んだ構造体に int num; があったとします。
このintに数値を与えたい場合(例えば、num = 5 )は、read、lseekで構造体があるブロックを再びbuffer読み込む.
この時、上記(num = 5 の状態)の用にするにはどうすればよろしいのでしょうか。

考えたのは、再び構造体を作成し数値を与え、上書きする様に同じブロックに書き込む方法ですが、この方法だとあまり効率がよくないので迷っている所です。

Re: Unix ファイルシステムについて

Posted: 2011年11月17日(木) 20:37
by beatle
書き込み時と読み込み時にエンディアンが違う可能性を考えなければ簡単です。
struct Hoge hoge;
という構造体(中身の構造はどうでもいい)を読み書きする場合

コード:

write(fd, (const void*)&hoge, sizeof(struct Hoge));
read(fd, (void*)&hoge, sizeof(struct Hoge));
のようにすれば出来ると思いますよ。

Re: Unix ファイルシステムについて

Posted: 2011年11月17日(木) 21:38
by 心はいつもHelloWorld
なるほど、無理にバッファーに入れる必要なかったのですね。

試してみた所うまくできました。
beatleさん、どうもありがとうございました。