2013-06-20 75 views
2

我的目的是減少對內核的文件寫操作,因此在POSIX上尋找緩存/緩衝機制。我相信標準C庫setbuf可以做到這一點,但在POSIX中有沒有類似的調用?如何在寫操作之前緩存/緩衝數據

E.g.我想設置一個1KB的緩衝區大小,並且不希望我的程序在超過緩衝區大小之前啓動對磁盤的實際寫入操作。

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()。這對你不好嗎?