2011-06-08 61 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