2013-06-20 2 views
2

Моя цель - уменьшить операции записи файлов в ядро, поэтому ищет механизм кэширования/буферизации на POSIX. Я считаю, что стандартная библиотека C setbuf делает это, но есть ли аналогичный вызов в POSIX?Как кэшировать/буферизовать данные перед операцией записи

E.g. Я хотел бы установить размер буфера 1 Кбайт и не хочу, чтобы моя программа начала фактическую операцию записи на диск до превышения размера буфера.

fdpipe= open(PIPE_NAME,O_RDONLY); 
...... 

fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE,S_IREAD|S_IWRITE); 
.... 

while((len = read(fdpipe,buffer,sizeof(buffer))) > 0) { 
    .... 
    ret = write(fd,buffer,length = strlen(buffer)); 
} 

ответ

3

Почему бы не просто использовать устройство stdio? Вы можете использовать fdopen, чтобы создать FILE*, который будет читать/записывать в указанный файловый дескриптор, а затем задавать нужный размер буфера с помощью setvbuf.

fdpipe = open(PIPE_NAME,O_RDONLY); 
...... 

fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE,S_IREAD|S_IWRITE); 
FILE* outf = fdopen(fd, "wb"); 
char obuffer[1024]; 
setvbuf(outf, obuffer, _IOFBF, sizeof(obuffer)); 
.... 

while((len = read(fdpipe,buffer,sizeof(buffer))) > 0) { 
    .... 
    ret = fwrite(buffer,1,length = strlen(buffer),outf); 
} 
+1

Правильно, но пользователь запрашивает другой метод, отличный от setbuf, как я понимаю, как в вопросе. – Koray

+1

@KorayAlkan oops - Я имел в виду 'setvbuf'. Никогда не следует отвечать перед кофе. – Casey

0

Вы просто держите данные в своем собственном программном буфере. Не вызывайте вызовы write(), пока ваш собственный буфер не достигнет 1K. Затем вызовите write() и flush(). Разве это не хорошо для вас?

Смежные вопросы