Прямой доступ к файлам в C ?

#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