我试图在Linux中添加一些绑定到ARP表,在C.我用“a”打开一个文件(追加,对吗?)然后尝试写一些地址,但我总是得到分段错误。我认为ARP_table[i].IPaddr, ARP_table[i].MACaddr, ARP_table[i].ARPstatus
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 :(得分:2)
您没有检查fopen
的返回值。我非常确定您不能写入该文件。
FILE *file = fopen(filename, "a");
if (NULL == file) {
perror("fopen");
/* return / exit */
}
这是我系统上的/proc/net/arp
[cnicutar@aiur ~]$ ls -l /proc/net/arp
-r--r--r-- 1 root root 0 Jun 8 16:29 /proc/net/arp
答案 1 :(得分:1)
一方面,i<i+j
永远都是真的,只要j
(你没有显示)是正面的。
然后,您尝试使用%c
显示字符串,该字符串应为%s
。
至于细分错误,您的ARP_table
很可能是0
或垃圾,但由于您实际上并没有显示它是如何创建的,所以祝你好运。
顺便说一句,我觉得我需要指出这是一些看起来很糟糕的代码。基本问题,如“这些变量是什么?”永远不应该询问您是否具有完整的功能代码和类型定义。它们不应该是全局变量,而应该作为参数传递给更好地处理它们的函数。
答案 2 :(得分:0)
j
在哪里?
如果j
是一个严格的正常数,你将遇到一个无限循环,
因为i
总是小于i + [someting positive]
。这可能会导致错误,因为您的数组只有有限数量的元素。
如果j
是可变的并且变为负数,则不会遇到无限循环,但是会产生比i
中元素数量大ARP_table
的{{1}}。< / p>
答案 3 :(得分:0)
ip
或arp
命令。i > i+j
看起来很奇怪,你确定这是正确的条件,你不应该只在i < j
时停止吗?"%c %c %c"
会出错。 %c打印单个字符。听起来两个首先应该是字符串,所以使用“%s%s%c”