Запись в файл (fprintf) - PullRequest
       15

Запись в файл (fprintf)

0 голосов
/ 08 июня 2011

Я пытаюсь добавить некоторые привязки к таблице ARP в Linux на 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);
  }

}

Ответы [ 4 ]

2 голосов
/ 08 июня 2011

Вы не проверяете возвращаемое значение 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 голос
/ 08 июня 2011

Ну, с одной стороны, i<i+j всегда будет истинным, если j (который вы не показали) положителен.

Затем вы пытаетесь отобразить строки с %c, который должен быть %s.

Что касается ошибки сегментации, ваш ARP_table, скорее всего, 0 или мусор, но поскольку вы на самом деле не показываете, как он создан, удачи вам с этим.

Кроме того, я чувствую, что должен указать, что это какой-то ужасно выглядящий код. Основные вопросы типа "что это за переменные?" Никогда не спрашивайте, есть ли у вас полный код функции и определение типа. Вместо того, чтобы быть глобальными, они должны передаваться как параметры из функций, лучше приспособленных для их обработки.

0 голосов
/ 08 июня 2011
  1. Вы не можете писать в / proc / net / arp, это только для чтения.(и изменение таблицы arp в противном случае не является тривиальным, лучше запустить внешнюю команду ip или arp с правильными аргументами.
  2. Проверьте возвращаемое значение fopen, оно может завершиться неудачей.
  3. Где определены ARP_table и j? Возможно, там что-то не так.
  4. Условие i > i+j выглядит странно, вы уверены, что это правильное условие, и что вы не должны просто останавливаться, когда i < j?
  5. Содержит ли ARP_table [i] .IPaddr что-нибудь разумное?
  6. "%c %c %c" было бы неправильно.% C печатает один символ. Звучит так, что первые два должны быть строками, поэтомуиспользуйте "% s% s% c"
0 голосов
/ 08 июня 2011

Где j?

Если j - строгая положительная константа, вы попадете в бесконечный цикл,
потому что i всегда меньше, чем i + [someting positive]. Это, вероятно, приведет к ошибке, потому что ваш массив имеет только конечное число элементов.

Если j является переменной и становится отрицательным, вы не попадете в бесконечный цикл, но вы получите i больше, чем количество элементов в вашем массиве ARP_table.

...