2012-02-14 4 views
3

Я использую statfs, чтобы получить общее пространство, доступное на моем жестком диске. Он возвращает правильные значения большую часть времени, но иногда он просто возвращает ошибку без видимых причин. Я хочу узнать, почему он генерирует ошибку в кажущиеся случайными временами.Отладка 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; 
    } 

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

+0

Как вы определяете, что 'statfs'" возвращает ошибку "? Покажите нам фрагмент кода. –

+0

@R .. Я добавил код в свой вопрос. – fdh

ответ

2

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

 
char *path = "/"; 
statfs(path, ...) 
+0

Хорошая работа, поймав это, +1. –

+0

Спасибо. Хорошо поймал! – fdh

0

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

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