我有一個while循環,通過讀取一個CSV文件,獲取第一個和第二個條目,並將其添加到C中實現的散列表。我已經測試了與約40條目的小文件,並且它工作正常,但是當我嘗試傳入大於此的任何文件時,WHILE部分會導致無限循環。lowlevellock和無限雖然循環
處理該添加的代碼如下所示:
void populateTable(Table *table, char *name) {
FILE *file = fopen(name, "r");
if(file != NULL) {
while(!feof(file)) {
char line[128];
fgets(line, sizeof line, file);
char key[64];
int value;
sscanf(line, "%[^','],%d", key, &value);
addEntry(table, key, value);
}
}
fclose(file);
return;
}
我用GDB調試程序審理。當我有42個條目時,所有條目都可以正確輸入,並且可以正確打印和訪問它們。當有更多的時候,代碼變得沒有反應。當我用GDB逐步完成,它說
#0 __lll_lock_wait_private() at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:97
#1 0x00007ffff763f518 in _L_lock_28() from /lib/x96_64-linux-gnu/libc.so.6
#2 0x00007ffff763f4b1 in _IO_feof (fp=0x60c070) at feof.c:37
#3 0x0000000000402e78 in populateTable (table=0x604250, name=0x40310b "data/census.csv") at Table.c:193
#4 0x00000000004016aa in main (argc=2, argv=0x7fffffffeae8) at server.c:189
'nptl' _is原生POSIX線程Library_。所以你的代碼在一些深層嵌套庫中是死鎖的。嘗試使用gdb命令'where'或'backtrace'顯示完整的堆棧跟蹤(如果可用)。 – rodrigo
'#0 __lll_lock_wait_private() at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:97 #1 0x00007ffff763f518 in _L_lock_28()from /lib/x96_64-linux-gnu/libc.so 0.6 #2 0x00007ffff763f4b1在_IO_feof(FP = 0x60c070)在feof.c:37 #3 0x0000000000402e78在populateTable(表= 0x604250, 名稱= 0x40310b 「數據/ census.csv」)在Table.c:193 # 4在主服務器上的main(argc = 2,argv = 0x7fffffffeae8)0x00000000004016aa server:189' – anarian
好的,所以你在調用'feof()'時遇到了一個死鎖。由於你的'文件'不能在任何地方共享,最可能的原因是內存損壞。也就是說,你的'addEntry()'在某處損壞了堆棧的內存,可能是因爲某些本地緩衝區溢出或類似的... – rodrigo