Я использую флаг O_DIRECT
для записи на диск непосредственно из пользовательского буфера. Но насколько я понимаю, линукс не гарантирует, что после этого вызова данные запишутся. Он просто пишет напрямую из пользовательского буфера на физическое устройство, используя DMA или что-то еще... Поэтому я не понимаю, могу ли я писать в пользовательский буфер после вызова функции «запись».
Я уверен, что пример кода поможет понять мой вопрос:
char *user_buff = malloc(...); /* assume it is aligned as needed */
fd = open(..., O_DIRECT);
write(fd, ...)
memset(user_buff, 0, ...)
Законна ли последняя строка (memset)? Допустима ли запись в пользовательский буфер, который может использоваться DMA для передачи данных на устройство?
write()
не является частью стандартной библиотеки C, это системный вызов Unix более низкого уровня. 01.12.2012O_DIRECT
DMA
, как это предусмотрено контроллерами жестких дисков. Я бы сказал, что он просто обходит использование внутренних буферов библиотеки. По-прежнему может происходить кэширование на аппаратном уровне или при использовании распределенных файловых систем. Чтобы убедиться, что последние также были сброшены, следует использоватьO_SYNC
, поэтому данные гарантировано, что они были сохранены физически. 02.12.2012