2016-04-25 85 views
0

我嘗試了一些方法來測量我的計算機上的TLB大小。我以某種方式需要確保CPU不緩存我用來測量每頁平均訪問時間的陣列元素。所以,我想的循環,我這裏面的代碼,使用應答超過here嘗試刷新緩存時發生分段錯誤(核心轉儲)錯誤

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

不過,我收到Segmentation Fault (core dumped)錯誤。我不知道爲什麼會發生這種情況。我對C不太好,任何幫助將不勝感激。謝謝。

+1

當調用'fopen()'時,總是檢查(!= NULL)以確保操作成功。很可能,程序必須從'root'(管理員)模式運行,否則打開寫入失敗。 – user3629249

回答

6

由於您正在寫入系統文件,務必檢查文件是否打開成功,當然需要以特權模式運行。

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); 
+0

非常感謝您的答覆。我只是嘗試了這一點,它似乎給錯誤13(請你糾正%s,我認爲它應該是%d,因爲否則它會給出數據類型錯誤)。所以在那之後,我嘗試做「sudo su」並試圖在root中運行.c文件。但現在它似乎永遠持續下去。因爲在終端輸出不出來。或者在一個文件中。即使當我真正在root模式下運行這些命令時,它們似乎也能工作。或者至少不要犯錯誤。我也嘗試使用system()調用來運行命令。但這似乎也不起作用。 – QPTR

+0

errno 13是EACCESS,這意味着您沒有對文件的寫入權限,因此您可以su啓動到root或使用sudo運行程序。你能更具體地說明你現在有什麼問題嗎? – fluter

+0

基本上,現在當我嘗試運行程序時(在'sudo su'的特權模式下),它就在終端上運行,沒有結束的跡象。它似乎沒有與我的代碼的問題,因爲沒有試圖刷新緩存(或包括上面的代碼),它似乎工作正常(這是輸出終端的時間,因爲它應該這樣做)。 – QPTR