2012-11-26 19 views
7

C++の低レベルディスク操作のためにLinuxにはどのような方法がありますか?私は自分のデータマネージャーをディスクに書き込もうとしています。例えば、ディスク上に一定量(連続)を割り当てたC++プログラムをLinux環境で作成し、そのチャンクに自由に読み書きできるようにしたいと考えています。私は標準fstream::openを使用したいとは思っていません。なぜならファイルはOSによって管理されていて、ディスク上で連続したセクションが得られないかもしれないからです。C++での低レベルディスク操作

ありがとうございました。

+1

http://bit.ly/V2ruze – soulseekah

答えて

4

一般に、Linuxのユーザプログラムからの "ローレベル"ディスク操作には、ディスク特殊デバイスを開く必要があります。私のコンピュータでは、これらは "/ dev/sda"や "/ dev/sda4"や "/ dev/disk/by-uuid/2a5150b4-71cb-11e1-b2fe-3b0d270b4e16"のような名前です。

デバイスファイルの選択には細心の注意が必要です。これを使ってシステムパーティションに書き込むことは良い考えではありません。また、デバイスファイルを開くには、ほとんどの場合、ルートアクセスが必要です(明白な理由から)。

fstreamを使用するかどうかの問題は直交しています。 std::fstreamfopen、またはopenを使用してデバイスを開くことができます。次に、あなたが行ったオープンに一致する読み取り操作を使用します。

具体的な例として、この機能が必要かどうか再考することがあります。今度はLinux System Administrator Guideを引用され、Wikipediaを引用:

しかし、Linuxのシステム管理者ガイドは、近代的なLinuxファイルシステム(s)が近くに一緒にファイル内のすべてのブロックを保つことによって最小限に断片化を維持する」、と述べてext3のようなファイルシステムの中には、ファイル内の他のブロックに最も近い空きブロックを効果的に割り当てるものがあるため、Linuxシステムでの断片化を心配する必要はありません。


あなたがC++に言及しているので、私はあなたがユーザプログラムではなく、デバイスドライバを書いていると仮定します。本当に「低レベル」のディスク操作は、カーネル内でのみ使用できます。実際に、デバイスドライバを書いてみたいと思っているなら、それを明確にするためにあなたの質問を再提示してください。

+2

これが正しいデバイスであることを確認してください。これを使用してシステムパーティションに書き込むことはお勧めできません。また、ほとんどの場合、ルートアクセスが必要です(明らかな理由により)。 – josefx

+0

@josefx - ありがとう。盗難。 –

+1

Thanks @Robᵩ、私はデータベース管理システム(DBMS)を作成しようとしていますので、デバイスドライバではなくソフトウェアの一部です。素晴らしい情報をありがとう! – Matthew

1

標準のLinuxファイルシステムを使用してこれを行う方法は知られていません。別のパーティションを用意して、そのdev疑似ファイル(例:/dev/sda2)でI/Oを直接行う必要があると思います。

-2

システムコールを使用する必要があります。 linux system calls

+0

私は彼がそのページが2.2カーネルを参照しているので、彼はdownvotedと思われますか?それとも別のものだったのでしょうか... –

+0

サンプルとして書きましたが、彼が使っているカーネルのバージョンを知るにはどうすればいいですか?ほとんどのシステムコールは、Linuxカーネルでは同じです。 –

+0

私の会社は「危険な\tの不正なページや脅威のソースを確認しました」という理由でそのウェブサイトをブロックしていますが、システムコールのリストは役に立たない回答かもしれません。 –