Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Количество ссылк на файл (struct stat и поле st_nlink)  (Прочитано 2877 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Проблема возникла с определением количества ссылок на файл

Осуществляю пробег по указанной директории и если это файл или ссылка мне надо вывести количество ссылок на файл
В структуре stat поле st_nlink содержит кол-во жестких ссылок на файл Вывожу его и мне выдается одно и то же число для всех файлов имеющик две ссылки и не имеющей жесткой ссылки вообще Число это равно 134514693 Я не понимаю в чем проблема

Жесткую ссылку создаю команой link имя_реального_файл имя_жесткой_ссылки
Еще вопрос как создать символическую ссылку в системе Команда ln -s почему то не работает
И еще вопрос можно ли программно узнать у файла количество символических ссылок

В общем программа выдает одно и то же значение для файлов имеющих разное кол-во ссылок
Почему происходит так? В чем может быть проблема?
« Последнее редактирование: 03 Декабря 2009, 17:59:04 от solyr »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #1 : 03 Декабря 2009, 11:21:47 »
Может, проблема в формате printf, а не в количестве ссылок?

Символическая ссылка создается командой ln, а не ls
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #2 : 03 Декабря 2009, 11:47:22 »
Ну дык код в студию!

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #3 : 03 Декабря 2009, 12:05:24 »
Еще вопрос как создать символическую ссылку в системе Команда ls -s почему то не работает
ln -s,
а жесткая без -s

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #4 : 03 Декабря 2009, 16:50:31 »
синтаксис ошибку сделал с командой создания символической ссылки.

Выдаю исходный код проги:

void printdir(char *dir, int depth){
   DIR *dp;
   struct dirent *entry;
   struct stat statbuf;
   if((dp = opendir(dir)) == NULL){
      fprintf(stderr,"Cannot open directory: %s\n",dir);
      return;
   }
   chdir(dir);
   while((entry = readdir(dp)) != NULL){
      lstat(entry->d_name,&statbuf);
      if(S_ISDIR(statbuf.st_mode)){
         if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0)
            continue;
         printf("%*s%s\n",depth,"",entry->d_name);
         printdir(entry->d_name,depth+4);
      } else {
                        //Вот здесь вот выдается заоблачное число вместа числа реально существующих ссылок
         printf("%*s%s - is file have %d link\n",depth," ",entry->d_name," ",statbuf.st_nlink);
                        //незнаю вроде все нормально должно работать. С командо printf кажется все в порядке с форматом вывода
      }
   }
   chdir("..");
   closedir(dp);
}

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #5 : 03 Декабря 2009, 18:42:30 »
По мне так тоже все в порядке.
Можно попробовать поиграть с модификаторами, поставить %ld или %u вместо %d.
Можно попробовать обнулять структуру memset ом перед каждым вызовом lstat.

А еще очень любопытно взглянуть в дебагере - там, в этом поле, вообще, что записано-то?

Помнится, у функций stat были какие-то особенности - вроде бы, там не все поля структуры заполнялись, или еще какие-то грабли.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #6 : 03 Декабря 2009, 19:05:53 »
А я вообще не понял, что за ересь в printf. Может это имелось ввиду:
printf("%d %s - is file have %d link\n", depth, entry->d_name, statbuf.st_nlink);

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #7 : 03 Декабря 2009, 19:07:02 »
memset(&statbuf,0,sizeof(statbuf));
обнулил структуру перд командой lstst так вместо 134514693 стало выдавать  134514757 и поять же таки для всех файлов с разным количестивом жестких ссылок

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #8 : 03 Декабря 2009, 19:09:24 »
Ну и эта, за ворнингами следить тоже надо. В твоем оригинале такое проскакивает:
warning: format ‘%d’ expects type ‘int’, but argument 5 has type ‘char *’

Оффлайн solyr

  • Автор темы
  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #9 : 03 Декабря 2009, 19:09:49 »
спсибо ) И вправду после исправления ереси все нормально выдается

Пользователь решил продолжить мысль 03 Декабря 2009, 19:11:50:
нет я gcc компилятором работаю Никаких предупреждений не было Но все равно сенкс Заработала прожка
« Последнее редактирование: 03 Декабря 2009, 19:11:50 от solyr »

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: Количество ссылк на файл (struct stat и поле st_nlink)
« Ответ #10 : 03 Декабря 2009, 20:33:20 »
Тот же gcc:
(Нажмите, чтобы показать/скрыть)

 

Страница сгенерирована за 0.017 секунд. Запросов: 21.