C 尝试刷新缓存时出现分段错误(内核转储)错误

C 尝试刷新缓存时出现分段错误(内核转储)错误,c,caching,tlb,C,Caching,Tlb,我正在尝试在我的机器上测量TLB大小的一些方法。我需要确保CPU不会缓存用于测量每页平均访问时间的数组元素。因此,我在我的循环中尝试了这段代码,使用上面的答案: 但是,我得到了分段错误(核心转储)错误。我不知道为什么会这样。我对C不是很好,如果有任何帮助,我将不胜感激。谢谢 一定要检查文件的打开是否成功,因为您正在写入系统文件,这当然需要您以特权模式运行 FILE *fp; fp = fopen("/proc/sys/vm/drop_caches", "w"); if (fp == NULL)

我正在尝试在我的机器上测量TLB大小的一些方法。我需要确保CPU不会缓存用于测量每页平均访问时间的数组元素。因此,我在我的循环中尝试了这段代码,使用上面的答案:


但是,我得到了
分段错误(核心转储)
错误。我不知道为什么会这样。我对C不是很好,如果有任何帮助,我将不胜感激。谢谢

一定要检查文件的打开是否成功,因为您正在写入系统文件,这当然需要您以特权模式运行

FILE *fp;
fp = fopen("/proc/sys/vm/drop_caches", "w");
if (fp == NULL) {
    printf("error %d: %s\n", errno, strerror(errno));
    // error handling, exit or return
}
fprintf(fp, "3"); 
fclose(fp);

确保检查文件的打开是否成功,因为您正在写入系统文件,这当然需要您在特权模式下运行

FILE *fp;
fp = fopen("/proc/sys/vm/drop_caches", "w");
if (fp == NULL) {
    printf("error %d: %s\n", errno, strerror(errno));
    // error handling, exit or return
}
fprintf(fp, "3"); 
fclose(fp);

非常感谢你的回答。我刚刚尝试了这个,它似乎给出了错误13(请您更正%s,我认为它应该是%d,否则它会给出数据类型错误)。所以在那之后,我试着做“sudosu”,并试着在root中运行.c文件。但现在它似乎永远持续下去。因为在终端上没有输出。或者在文件中。即使当我在root模式下运行命令时,它们似乎也能工作。或者至少没有错误。我还尝试使用system()调用运行这些命令。但这似乎也不起作用。errno 13是EACCESS,这意味着您没有文件的写入权限,因此您可以su到root,或使用sudo运行程序。你能更具体地说明你现在遇到了什么问题吗?基本上,现在当我尝试运行程序时(在特权模式下使用
sudo su
),它就在终端上运行,没有结束的迹象。我的代码似乎没有问题,因为在不尝试刷新缓存(或包含上述代码)的情况下,它似乎可以正常工作(即按预期在终端上输出时间)。所以你的意思是,当你运行
sudo./a.out
,你的程序挂起,而如果你su到root,然后运行
/a.out
就可以了吗,实际上,要么执行
sudo./a
(我正在使用make),要么对root执行su似乎会使它挂起。当我运行程序而不刷新缓存时,它似乎工作正常。在最终版本中不是很好,但是在没有刷新缓存的情况下运行的代码似乎没有问题。只包含上面的代码,然后用
sudo./a
susu-sudo
运行它似乎会让它挂起。非常感谢您的回答。我刚刚尝试了这个,它似乎给出了错误13(请您更正%s,我认为它应该是%d,否则它会给出数据类型错误)。所以在那之后,我试着做“sudosu”,并试着在root中运行.c文件。但现在它似乎永远持续下去。因为在终端上没有输出。或者在文件中。即使当我在root模式下运行命令时,它们似乎也能工作。或者至少没有错误。我还尝试使用system()调用运行这些命令。但这似乎也不起作用。errno 13是EACCESS,这意味着您没有文件的写入权限,因此您可以su到root,或使用sudo运行程序。你能更具体地说明你现在遇到了什么问题吗?基本上,现在当我尝试运行程序时(在特权模式下使用
sudo su
),它就在终端上运行,没有结束的迹象。我的代码似乎没有问题,因为在不尝试刷新缓存(或包含上述代码)的情况下,它似乎可以正常工作(即按预期在终端上输出时间)。所以你的意思是,当你运行
sudo./a.out
,你的程序挂起,而如果你su到root,然后运行
/a.out
就可以了吗,实际上,要么执行
sudo./a
(我正在使用make),要么对root执行su似乎会使它挂起。当我运行程序而不刷新缓存时,它似乎工作正常。在最终版本中不是很好,但是在没有刷新缓存的情况下运行的代码似乎没有问题。仅包含上面的代码,然后使用
sudo./a
su-sudo
运行它似乎会使其挂起。调用
fopen()
时,始终选中(!=NULL)以确保操作成功。最有可能的情况是,程序必须从
root
(管理员)模式运行,否则将打开写入失败。调用
fopen()
时,始终选中(!=NULL)以确保操作成功。最有可能的情况是,程序必须从
root
(管理员)模式运行,否则将打开以供写入,但失败。