#c #c #cross-platform
#c #c #кроссплатформенный
Вопрос:
Есть ли способ записи непосредственно на диск без кеширования в c ? В настоящее время я использую:
int open(fileout, O_CREATE | O_WRONLY | O_DIRECT);
FILE *fh = fdopen(fileout_dev, "wb");
Существуют ли кроссплатформенные библиотеки, позволяющие это делать?
Спасибо, Арман.
Комментарии:
1. Вы спрашиваете об устранении кэширования в операционной системе или в C / C RTL?
2. Или в контроллере жесткого диска?
3. Я хотел бы записать в файл без кэширования…
4. И мы спрашиваем, какого рода кэширования вы хотите избежать. Существует много уровней. Некоторых из них можно избежать из-за языка, некоторые зависят от операционной системы, для некоторых требуется доступ к оборудованию. Или к сетевому серверу, если файл находится там.
5. Кстати, ввод-вывод через ваш,
FILE *fh
открытый с помощьюO_DIRECT
, как вы это сделали, также буферизуется внутри ФАЙЛОВОГО объекта — если вы не отмените буферизацию, как @RC, предложенный ниже.
Ответ №1:
Если вы говорите о буферизации, то вы можете использовать setbuf или setvbuf
/* setbuf example */
#include <stdio.h>
int main ()
{
char buffer[BUFSIZ];
FILE *pFile1, *pFile2;
pFile1=fopen ("myfile.txt","w");
pFile2=fopen ("myfile2.txt","a");
setbuf ( pFile1 , buffer );
fputs ("This is sent to a buffered stream",pFile1);
fflush (pFile1);
setbuf ( pFile2 , NULL );
fputs ("This is sent to an unbuffered stream",pFile2);
fclose (pFile1);
fclose (pFile2);
return 0;
}
/* setvbuf example */
#include <stdio.h>
int main ()
{
FILE *pFile;
pFile=fopen ("myfile.txt","w");
// _IONBF disables buffering
setvbuf (pFile , NULL , _IONBF, 0);
// File operations here
fclose (pFile);
return 0;
}
Комментарии:
1. Спасибо, это то же самое, что O_DIRECT?
2. @Arman: Кстати, O_DIRECT не гарантирует, что у вас нет кэширования. Он просто просит Unix-подобное ядро не кэшировать ввод-вывод через этот FD. Само оборудование может кэшироваться внутри.
3. Спасибо за объяснение. С моим RAIDS6 (LVM / STRIPED / с контроллерами 2RAID) Я получаю 1200 Мбит / с, когда я делаю dd oflag = direct, без того, чтобы я получал меньше 500, я вижу, что большие файлы перемещаются по кешу во время копирования, поэтому для ускорения ввода-вывода я пытался реализовать в своем коде DIRECT_IO