Отладка статов? - PullRequest
       19

Отладка статов?

3 голосов
/ 14 февраля 2012

Я использую statfs для получения всего свободного места на моем жестком диске.Он возвращает правильные значения большую часть времени, но иногда он просто возвращает ошибку без видимой причины.Я хочу выяснить, почему он генерирует ошибку в, казалось бы, случайное время.

Есть ли способ проверить, почему он генерирует ошибку?Если я печатаю strerror(errno), я просто получаю сообщение «Нет такого файла или каталога».Это говорит мне, в чем проблема, но не в чем ее причина.Я не вижу причин, по которым он может успешно найти каталог в определенный момент, но не сможет найти его в следующий момент.Могу ли я проверить, что это вызывает?Я сомневаюсь, что это проблема с моим кодом, потому что если бы это было так, если бы никогда не вернул правильные данные.

Я передаю '/' в качестве каталога.Я на OS X Snowleopard с использованием Xcode 3.2.6 с использованием Objective-C / C

  • Как я могу найти проблему, которая вызывает его не найти путь?
  • Какие общие причины могут привести к тому, что он сможет найти диск в один момент, а не в другой?

Код, используемый для получения информации:

    if (statfs(&path, &storageStats))
    {               
        NSLog(@"Total storage stats retrieval failed with errno: %s.\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    else
    {
        totalAmount = storageStats.f_blocks * storageStats.f_bsize;
        NSLog(@"Storage: %f\n", totalAmount);
        return self;
    }

Я получаю сообщение «Не удалось получить статистику общего хранилища ...», и сообщение об ошибке «Нет такого файла или каталога»

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Первый аргумент statfs - это char *. Поскольку вы передаете & путь, это будет означать, что путь является символом. Если это так, то вы передаете строку с нулевым символом в конце только иногда. (Если path равен '/' и следующий байт будет '\ 0', то вызов будет работать. Если память после path не '\ 0', то вы передаете очень странный путь к statfs.) Вы вероятно, хотел сделать:

char *path = "/";
statfs( path, ... )
0 голосов
/ 17 февраля 2012

Что касается правильного определения размера строковой переменной пути: вызовите pathconf(), чтобы получить значение PATH_MAX.Затем используйте это значение PATH_MAX, чтобы объявить строковую переменную для вашего пути.

PATH_MAX +1 гарантирует, что вы не найдете путь длиннее вашей строки.

...