Добрый день, я открываю файл для записи в него некоторого контента. Код ниже:
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)?
Вы не определили, что для вас означает очистка файла.
Вы можете сжать файл до 0, используйте ftruncate (2) для этого.
Вы можете обнулить все байты в файле. Затем используйте lseek (2) с write(2)
или возможно pwrite (2)
Могут быть проблемы, если какой-то другой процесс пишет файл одновременно (что является плохой практикой).
Я не уверен, что использование многопоточности действительно ускорит обнуление всех байтов. (это занимает много места на диске, если системный файловый кэш не поврежден, а многопоточность не увеличивает скорость работы с диском), поэтому я бы сначала проверил.
Других решений пока нет …