【问题标题】:Segmentation fault (core dumped) error while trying to flush cache尝试刷新缓存时出现分段错误(核心转储)错误
【发布时间】:2016-08-18 07:05:56
【问题描述】:

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

FILE *fp;
fp = fopen("/proc/sys/vm/drop_caches", "w"); 
fprintf(fp, "3"); 
fclose(fp);

但是,我收到了 Segmentation Fault (core dumped) 错误。我不知道为什么会发生这种情况。我对 C 不是很好,任何帮助都将不胜感激。谢谢。

【问题讨论】:

  • 在调用fopen() 时,始终检查 (!=NULL) 以确保操作成功。最有可能的是,程序必须从root(管理员)模式运行,否则打开写入失败。

标签: c caching tlb


【解决方案1】:

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

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,否则它会给出数据类型错误)。所以在那之后我尝试做“sudo su”并尝试在root中运行.c文件。但现在它似乎永远持续下去。正如输出不会出现在终端上一样。或者在一个文件中。即使当我实际以 root 模式运行命令时,它们似乎也可以工作。或者至少没有给出错误。我还尝试使用 system() 调用运行命令。但这似乎也不起作用。
  • errno 13 是 EACCESS,这意味着你没有文件的写权限,所以你可以 su 到 root,或者用 sudo 运行程序。您能具体说明一下您现在遇到的问题吗?
  • 基本上,现在当我尝试运行程序时(在特权模式下使用sudo su ),它就在终端上运行,没有结束的迹象。我的代码似乎没有问题,因为在不尝试刷新缓存(或包含上述代码)的情况下,它似乎可以正常工作(即按照预期在终端上输出时间)。跨度>
  • 所以你的意思是当你运行sudo ./a.out时,你的程序挂起,而如果你su到root,然后运行./a.out就可以了吗?
  • 不,实际上要么做sudo ./a(我正在使用make)要么做su to root似乎使它挂起。当我在不刷新缓存的情况下运行程序时,它似乎可以正常工作。不如最终还可以,但还可以,因为在不刷新缓存的情况下运行的代码似乎没有问题。只包括上面的代码,然后用sudo ./asu sudo 运行它似乎使它挂起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多