-1

こんにちは、ファイルを開いてコンテンツを書き込みます。以下のコード:

class file_worker
{
public:
    file_worker(const std::string &path):path_(path),stop_(false)
    {
        umask(0);
        file_descriptor_ = open(path_.c_str(),O_WRONLY|O_CREAT, 0666);
    }
    void operator()()
    {
        if(file_descriptor_!=-1)
        {
             clear_file();
            //write something
        }
    }
    void clear_file()
    {

    }
    ~file_worker()
    {
        if(file_descriptor_!=-1)
        {
            close(file_descriptor_);
        }
    }
private:
    const std::string path_;
    int file_descriptor_;
    bool stop_;
};

clear_file(); をどのように実装できますか? ファイル記述子を閉じずにクリア(すべてのファイルコンテンツを削除)できる機能はありますか? ファイルへの書き込みを高速化する方法はどれですか? ファイルの異なる部分で同時にいくつかのスレッドのファイルに書き込むことは可能ですか (lseek を使用することもできます)?

4

1 に答える 1

1

ファイルのクリアが何を意味するかを定義していません。

ファイルを 0 サイズに縮小できます。そのためにはftruncate(2)を使用します。

ファイル内のすべてのバイトをゼロにすることができます。次に、lseek(2)write(2)pwrite (2 ) と一緒に使用します。

他のプロセスが同時にファイルを書き込んでいると、問題が発生する可能性があります (これは悪い習慣です)。

マルチスレッドを使用すると、すべてのバイトのゼロ化が実際に高速化されるかどうかはわかりません。(これを行うと、システム ファイル キャッシュがヒットしない限りディスクを集中的に使用し、マルチスレッドはディスクの速度を上げません)、最初にベンチマークを行います。

于 2013-03-21T06:36:04.997 に答える