如何在C中打开和读取文件而不进行缓冲?

时间:2016-09-03 03:37:04

标签: c io

我想对运行在文件上的算法进行基准测试。该算法迭代N轮,并且在每一轮中,它读取一个数据块,做一些神奇的东西并设置下一个块的偏移量。

这是伪代码:

int run_algorithm(int offset) {

    char *fname = "database.dat";
    fd = open(fname, O_RDONLY);

    // read the desired block to memory
    block_size = 1024 * 1024;
    char *buf = malloc(block_size);
    lseek(fd, offset, SEEK_SET);
    read(fd, &buf, block_size);

    int new_offset;
    // do magic stuff with buf
    // and set a new offset

    close(fd);
    return new_offset;
}

int main() {

    int i;

    //init offset
    int offset = 0;

    // iterate N times
    for (i = 0; i < N; i++) {
        offset = run_algorithm(offset);
    }

    return 0;
}

我知道操作系统有热缓存和冷缓存。我想实现冷缓存案例。在每次run_algorithm()调用中,文件打开时都不应该有缓冲。换句话说,我不希望操作系统将文件的一部分存储在内存中以加速open()和seek()。

有没有办法专门设置open()和seek()而不进行缓冲?

1 个答案:

答案 0 :(得分:3)

您无法在硬盘和操作系统中禁用alll缓存。

但如果您接受对程序之外的所有内容进行基准测试,那么您可以在C运行时库中禁用缓冲:

package facecomponent;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;

/**
 *
 * @author HelenPeng
*/
public class FaceComponent extends JComponent {

  public static void main(Graphics g) {
    Graphics2D g2= (Graphics2D)g;
    Ellipse2D.Double interestingEmoji = new Ellipse2D.Double(0,0,100,100);
    g2.draw(interestingEmoji);
    Ellipse2D .Double eye1 = new Ellipse2D.Double(25,25,10,10);
    Ellipse2D .Double eye2 = new Ellipse2D.Double(50,25,10,10);
    g2.draw(eye2);
    g2.draw(eye1);
    Line2D.Double mouth = new Line2D.Double(35,75,75,75)  ;
    g2.draw(mouth);
  }

}

您必须在fopen操作后立即调用该函数。请参阅cpp reference page

中的详细信息