С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
1

В родительском каталоге посчитать количество каталогов и вывести имена каталогов, используя суперблок

26.05.2015, 11:52. Показов 3115. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Собственно часть моего задания написано в шапке темы. Полностью же мое задание звучит так:
В родительском каталоге подсчитать количество каталогов, вывести их имена и номера блоков. В задании меня смущает фраза, в которой говорится о работе с супер блоком для выполнения этого задания.
Нашел несколько тем, которые максимально похожи на то, что нужно сделать мне, но не вижу связи с супер блоками:
https://www.cyberforum.ru/c-li... 13663.html
https://www.cyberforum.ru/c-li... 95986.html
https://www.cyberforum.ru/c-li... ost7526469

В книге "Операционные системы unix и программирование на Си" описана несколько другая структура супер блока.
Собственно мой вопрос: в каком направлении, так сказать, идти, чтобы решить эту задачу. Что лучше почитать об этом? Или те ссылки, которые я нашел, и есть решение моей задачи?

Заранее спасибо за помощь!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2015, 11:52
Ответы с готовыми решениями:

Подсчитать число каталогов в родительском каталоге, затем напечатать их имена и номера индексных дескрипторов
Есть задача подсчитать число каталогов в родительском каталоге, затем напечатать их имена и номера...

Подсчитать число каталогов в родительском каталоге. Напечатать их имена и номера блоков, соответствующих файлам
Здравствуйте! У меня есть задание звучит так "Подсчитать число каталогов в родительском каталоге....

Вывести на экран в текущем каталоге имена тех каталогов, которые в себе не содержат подкаталогов
Здравствуйте.. Выдали данное задание на С++ под linux Разработать программу, которая выводит на...

Вывести на экран в текущем каталоге имена тех каталогов, которые в себе не содержат подкаталогов
Здравствуйте.. Выдали данное задание на С++ под linux Разработать программу, которая выводит на...

12
594 / 416 / 136
Регистрация: 02.10.2008
Сообщений: 1,777
Записей в блоге: 1
26.05.2015, 14:49 2
Не совсем понятно зачем нужен именно суперблок - для данной задачи он не несёт никакой полезной информации.
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
26.05.2015, 15:27  [ТС] 3
drfaust, вот именно это я обнаружил после прочтения соответствующей главы в книге. Теперь я вообще не вижу связи суперблока и информации о каталогах. Он ведь содержит информацию о свободных блоках помимо еще какой-то служебной информации.

Может все-таки есть какая-то связь суперблока и задания?
0
594 / 416 / 136
Регистрация: 02.10.2008
Сообщений: 1,777
Записей в блоге: 1
26.05.2015, 15:34 4
Лучший ответ Сообщение было отмечено Gr1f0nn как решение

Решение

LinuxKernelDevelopment на русском, читать "глава 12" Экземпляр древний, структуры могут отличаться.
Может препод имел ввиду работу с inode и структурой каталогов. В суперблоке есть только ссылка на точку монтирования данной ФС.
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
26.05.2015, 15:56  [ТС] 5
drfaust, спасибо огромное за книгу! Вполне возможно, что это и имелось в виду. во всяком случае это уже больше похоже на правду.
Единственное, у меня остался один вопрос: нужны ли какие-то особые права пользователя для того, чтобы можно было считывать данные из этих структур? Как мне кажется, то нет, но пепдаватель сказал, что нужны. Так ли это?
0
594 / 416 / 136
Регистрация: 02.10.2008
Сообщений: 1,777
Записей в блоге: 1
26.05.2015, 21:13 6
Если работать с /dev/sdX то да, права нужны, если работать только с родительским каталогом и ниже - то права самого каталога (если это / то права нужны, если это к-то тестовый каталог в хомяке и всё что в нём принадлежит юзеру, то нет). В общем случае права рута на запуск проги (suid бит например и т.п.)
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
26.05.2015, 23:12  [ТС] 7
drfaust, Ага, теперь понял, о чем он говорил.
Еще раз спасибо!
0
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
28.05.2015, 14:26  [ТС] 8
Снова здравствуйте!

В прошлой теме я задал вопрос : https://www.cyberforum.ru/c-li... 58504.html
Теперь возник другой вопрос: правильно ли я сделал?
Суть в том, что по тому, как объявлена структура stat, то она больше похожа как раз-таки на inode. В этой структуре должен быть указатель на структуру суперблока. В книгах, да и в гугле пишут, что нужно подключить sys/filsys.h или linux/fs.h . Ни тот, ни другой инклюд не помогает. Вполне возможно, что то, что написано, уже отвечает поставленной задаче (лично меня уже все устраивает ^_^), но мне как-то надо получить еще суперблок, который связан с этими каталогами. Так как я проверяю это в своем подкаталоге, в котором еще куча каталогов, то, как я понимаю, суперблок будет для них один и тот же, но не уверен в этом.

Теперь, собственно, суть вопроса кратко: правильно ли я сделал и, если нет, то как мне получить доступ к структуре суперблока через структуру inode (она же stat(???) здесь)?

Я unix подобные ОС (надеюсь, что правильно написал), откровенно говоря, никогда не использовал, поэтому опыта работы в них нет.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <limits.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <sys/fcntl.h>
#include <sys/file.h>
 
char buf[PATH_MAX];
int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        fprintf(stderr, "Usage: %s DIR\n", argv[0]);
        exit(1);
    }
    DIR* dp;
    struct stat st;
    struct dirent* dirp;
    int count = 0;
 
    size_t len = strlen(argv[1]);
 
    if((dp = opendir(argv[1])) == NULL)
    {
        perror(argv[1]);
        return 1;
    }
 
    strncpy(buf, argv[1], len);
 
    while((dirp = readdir(dp)) != NULL)
    {
        if(strcmp(dirp->d_name, ".") == 0 ||
                strcmp(dirp->d_name, "..") == 0)
            continue;
 
        buf[len] = '/';
        buf[len+1] = '\0';
 
        strcat(buf, dirp->d_name);
 
        if(lstat(buf, &st) == -1)
        {
            perror(dirp->d_name);
            break;
        }
 
        if(S_ISDIR(st.st_mode))
        {
            ++count;
            printf("directory : %s\n", buf);
 
            printf("I-node number: %ld\n", (long) st.st_ino);
 
            printf("Mode: %lo (octal)\n",
                   (unsigned long) st.st_mode);
 
            printf("Link count: %ld\n", (long) st.st_nlink);
            printf("Ownership: UID=%ld GID=%ld\n",
                   (long) st.st_uid, (long) st.st_gid);
 
            printf("Preferred I/O block size: %ld bytes\n",
                   (long) st.st_blksize);
            printf("File size: %lld bytes\n",
                   (long long) st.st_size);
            printf("Blocks allocated: %lld\n",
                   (long long) st.st_blocks);
            printf("Number of block: %lld\n", // Не нашел описания переменной и решил, что пусть это будет номером блока
                   (long long) st.st_dev);
            printf("Linked device: %lld\n", // Судя по описанию, это связанное устройство
                   (long long) st.st_rdev);
 
            printf("Last status change: %s", ctime(&st.st_ctime));
            printf("Last file access: %s", ctime(&st.st_atime));
            printf("Last file modification: %s", ctime(&st.st_mtime));
        }
    }
 
    printf("\n\nAmount of catalog: %d", count);
    closedir(dp);
    return 1;
}
Всем заранее спасибо за помощь!

Добавлено через 1 минуту
Да, забыл написать, что работаю в FreeBSD 10.0

Добавлено через 12 часов 44 минуты
Немного перефразирую вопрос: правильно ли я понял, что структура stat в данном случае и есть структура inode и как мне из этой структуры вытащить указатель на структуру суперблока? К сожалению, структура суперблока имеет неизвестное мне название и вариант
C++
1
struct super_stract
не проходит
0
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
30.05.2015, 14:20  [ТС] 9
Нашел структуру суперблока конкретно для freebsd 10.1
https://www.freebsd.org/cgi/ma... ormat=html
Но все равно никак не могу понять, как же мне получить информацию из нее. Какую нужно вызвать функцию, чтобы я мог потом прочитать ту информацию, которая мне нужна? Для конкретного родительского каталога.
По идее я должен как-то сначала получить структуру inode, а оттуда получить указатель на нужный мне суперблок. Тогда, как получить эту структуру с нужной мне информацией?

И, как я понял, я ошибочно думал, что структура stat - это нечто похожее на inode.

Буду благодарен за любую помощь!
0
594 / 416 / 136
Регистрация: 02.10.2008
Сообщений: 1,777
Записей в блоге: 1
31.05.2015, 19:08 10
Если не изменяет склероз место(и места его возможных копий) суперблока и его содержимое (или отсутствие как такового как в FAT) в ФС зависит от типа ФС. Для фряхи надо ковырять UFS/ZFS, т.к FFS давно погибла. Где именно на диске он находится - не подскажу, с файловыми системами юникс-лайк я тесно не работал, но подозреваю, что получить к нему доступ надо работать с /dev/sd*.
1
244 / 164 / 133
Регистрация: 30.09.2012
Сообщений: 690
01.06.2015, 17:31  [ТС] 11
drfaust, Да вроде нашел, в каком заголовочном файле находится структура блока, но теперь нужно понять, как сначала получить доступ к inode структуре , а потом оттуда вытащить указатель на суперблок и произвести нужные с ним операции.

Еще раз перечитал ссылку (точнее содержимое страницы ^_^), которую я скинул выше, и вроде как понял, что и где искать (в каких заголовочных файлах), но вот остался вопрос: допустим я объявил переменную типа inode. Как мне считать в эту структуру нужную мне информацию конкретного каталога?

Добавлено через 1 минуту
Еще раз перечитал главу в книге, которую вы мне подсказали, и увидел, что мне нужно для этого подняться на уровень "вверх". то есть сначала считать структуру dentry, затем оттуда вытащить указатель на inode, а затем уже вытащить указатель на структуру суперблока.
Осталось только понять, как считать структуру dentry ><

Добавлено через 19 часов 38 минут
В общем, еще раз (третий) перечитал главу. Осознал следующее:
Структура file имеет в себе указатель на структуру dentry. Структура dentry имеет в себе указатель на структуру суперблока. Все бы ничего, но не могу найти, какой заголовочный файл надо подключить, чтобы использовать структуру dentry. С суперблоком вроде все понятно стало.
Это
C
1
#include <ufs/ffs/fs.h>
В моем случае. Структура file - с ней у меня есть некоторые проблемы. Как мне кажется, то она очень похожа на структуру DIR, но в то же время и не похожа, так как DIR описывает директории, а file все файлы в целом, независимо от их типа. Или я не прав?

Не по теме:

P.S.
Может уже проще будет поставить себе на виртуалку linux чистый и пользоваться готовыми мануалами и книгами?

0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 2
28.04.2016, 11:44 12
Ребят, дали такое же задание в вузе, как и в заголовке. Сделал сначала просто через opendir. Сказали, что слишком высокоуровнево. Сделал с помощью getdents. Снова не то.
Затем специально уточнили, что нужно использовать именно суперблок. Уже и поисковик мучал, пытаясь как-то связать супеблок и вывод структуры директории, и какие-то древние книжки по unix, рекомендованные преподавателем нашел-полистал. Толком ничего нет. Максимум - что такое суперблок.
Если у кого-то есть информация по теме или кто-то что-то подобное делал - поделитесь информацией, пожалуйста.
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 2
20.05.2016, 02:41 13
Просмотрел несколько книг разной степени давности, поискал на английском - ниаких успехов.
0
20.05.2016, 02:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2016, 02:41
Помогаю со студенческими работами здесь

Как вывести имена каталогов, в которых есть каталоги?
Задание : Shell-программа выводит имена тех каталогов в каталоге, которые в себе содержат ...

Копирование всех каталогов с одним заданным именем из множества неизвестных каталогов
Всем добрый день. Сложилась необходимость создания бекапа определенной папки в пользовательских...

Архивирование определённых файлов из разных каталогов с сохранением структуры этих каталогов
Здравствуйте. Суть задачи. Есть определенный каталог (C:\X), в котором в разных подкаталогах лежат...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru