2011-06-08 47 views
0

我試圖在Linux中添加一些綁定到Linux的表,在C.我打開一個文件「a」(追加,對吧?),然後試圖寫一些地址,但我總是得到分段錯誤。我相信有什麼毛病ARP_table[i].IPaddr, ARP_table[i].MACaddr, ARP_table[i].ARPstatus寫入文件(fprintf)

struct ARP_entry 
{ 
    char IPaddr[16]; 
    char MACaddr[18]; 
    char ARPstatus; 
    int timec; 
}; 

static struct ARP_entry ARP_table[ARP_table_vel]; 

void copyZIS() 
{ 
    int i=0; 
    const char filename[] = "/proc/net/arp"; 
    FILE *file = fopen(filename, "a"); 


    for (i; i< i+j; i++) 
    { 
    fprintf(file, "%c %c %c", ARP_table[i].IPaddr, ARP_table[i].MACaddr, ARP_table[i].ARPstatus); 
    } 

} 
+0

誰是'ARP_table'? – Alexandru 2011-06-08 13:29:09

+0

爲什麼不啓動像gdb這樣的調試器並從那裏運行它來查看錯誤是什麼? 'j'的範圍是什麼?這是一個全局變量嗎?如果> 0,那麼你有一個無限的循環 – 2011-06-08 13:29:16

+1

你的意思是'fprintf(file,「%s%s%s」,...)'? – Alexandru 2011-06-08 13:29:22

回答

2

你是不是檢查fopen返回值。我很確定你不允許寫入該文件

FILE *file = fopen(filename, "a"); 
if (NULL == file) { 
    perror("fopen"); 
    /* return/exit */ 
} 

這裏是/proc/net/arp我的系統上

[[email protected] ~]$ ls -l /proc/net/arp 
-r--r--r-- 1 root root 0 Jun 8 16:29 /proc/net/arp 
+0

@downvoter:啓示我:-)這是錯誤的/無益的? – cnicutar 2011-06-08 13:31:34

+0

這就是如此真實,我的系統上一樣。我以前可以檢查過。無論如何,有沒有任何選項可以將文件添加到該文件中? – shaggy 2011-06-08 13:36:14

+0

@shaggy不,沒有辦法。這不是一個真正的文件。我的猜測是你試圖添加'ARP'條目 - 問一個具體的問題如何做到這一點。 – cnicutar 2011-06-08 13:37:32

0

哪裏j

如果j是一個嚴格的正數,你會遇到一個無限循環,
因爲i始終是小然後i + [someting positive]。這可能會導致錯誤,因爲你的數組只有有限數量的元素。

如果j爲可變並且爲負值,則不會遇到無限循環,但會產生大於數組ARP_table中元素數量的i

1

一件事,i<i+j將永遠是真的,只要j(你沒有顯示)是積極的。

然後,您嘗試顯示%c(應該是%s)的字符串。

至於分段錯誤,你ARP_table是最有可能0或垃圾,但因爲你沒有真正展示它是如何創建的,好運與。

另外,我覺得我需要指出的是,這是一些可怕的代碼。基本問題如「這些變量是什麼?」如果你有完整的功能代碼和類型定義,永遠不應該被問到。他們不應該成爲全局變量,而應該將其作爲更好地處理它們的函數的參數傳遞。

0
  1. 您不能寫入/ proc/net/arp,它僅用於讀取。 (否則改變ARP表是不平凡的,你最好不要運行與正確的參數外iparp命令。
  2. 檢查的FOPEN返回值,它可能會失敗。
  3. 哪裏的ARP_table和j定義?也許有一些不對勁的地方。
  4. 條件i > i+j看起來奇怪,你確定這是正確的狀態,你不應該只停留在i < j
  5. 不ARP_table [I] .IPaddr包含一些明智?
  6. "%c %c %c"會出錯。%c print是一個單獨的角色。這聽起來像兩個第一應該是字符串,所以使用「%s%s%c」
+0

所以有辦法如何將某物添加到arp表中,但不是我試圖做到這一點的方式?我知道我可以使用'arp'或'ip'命令,但是我需要在C中完成。 – shaggy 2011-06-08 13:38:58

+0

您可以從C運行arp命令。除此之外,請參閱arp命令的源代碼,位於http:/ /www.tazenda.demon.co.uk/phil/net-tools/。不幸的是沒有真正的文件可以做到這一點。 – Habalusa 2011-06-08 13:48:43