Как получить имя устройства / раздела файла?

У меня есть структура разделов, как:

$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda6       51606140 16939248  34142692  34% /
/dev/sda5         495844    72969    397275  16% /boot
/dev/sda7      113022648 57515608  49765728  50% /home
/dev/sda8     113022648 57515608  49765728  4% /mnt

при анализе содержимого каталогов с помощью readdir () - как узнать, какой файл находится на каком устройстве?

readdir () вызывается из корневого каталога, анализирует имя файла и печатает его размер. как с устройства: / dev / sda6 и список имен файлов в этом разделе. Когда он читает содержимое из / home - он должен отображать содержимое чтения из / dev / sda7 и перечислять имена файлов

Пожалуйста, дайте мне знать, если вам нужно больше деталей / информация

 William Pursell15 нояб. 2012 г., 19:42
Если вы звонитеreaddirкто-то должен был позвонитьopendir первый. Какой путь использовался в вызове?opendir
 webminal.org16 нояб. 2012 г., 03:20
на самом деле, opendir () будет вызываться в / directory.It анализирует всю файловую систему - где он сталкивается с проблемой определения того, пересекается ли она с другим разделом или нет?

Ответы на вопрос(2)

Решение Вопроса

В структуре stat есть член st_dev, он должен однозначно идентифицировать один раздел.

Пример в bash:

stat ~/.vimrc
  File: `/home2//leonard/.vimrc' -> `local-priv/vimrc'
  Size: 16              Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d      Inode: 6818899     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1024/ leonard)   Gid: ( 1024/ leonard)
Access: 2012-06-22 16:36:45.341371003 +0300
Modify: 2012-06-22 16:36:45.341371003 +0300
Change: 2012-06-22 16:36:45.341371003 +0300

Утилита stat не делает никакой дополнительной магии. Вот следующий вывод: -vvv:

lstat64("/home2//leonard/.vimrc", {st_dev=makedev(8, 2), st_ino=6818899, st_mode=S_IFLNK|0777, st_nlink=1, st_uid=1024, st_gid=1024, st_blksize=4096, st_blocks=0, st_size=16, st_atime=2012/06/22-16:36:45, st_mtime=2012/06/22-16:36:45, st_ctime=2012/06/22-16:36:45}) = 0

0x0802 это основной 8 (sd) раздел 2, поэтому / dev / sda2

Чтобы сопоставить это с реальными разделами, вы можете выполнить итерацию / proc / mounts и указать все устройства (первый столбец). Содержимое / proc / mounts аналогично выводу mount (1), за исключением того, что оно приходит непосредственно из ядра. Некоторые дистрибутивы symlink / etc / mtab в / proc / mounts.

Или вы можете разобрать / proc / partitions:

$ cat /proc/partitions
major minor  #blocks  name

   8        0  976762584 sda
   8        1    3998720 sda1
   8        2  972762112 sda2

Конечно, / dev / sda на самом деле может не существовать, устройство может использовать длинное имя udev, например / dev / disk / by-uuid / c4181217-a753-4cf3-b61d-190ee3981a3f. Старшие / младшие номера должны быть надежным уникальным идентификатором раздела.

 webminal.org17 нояб. 2012 г., 03:58
Спасибо cdleonard за помощь, я могу использовать файл / proc / partitions.
 cdleonard16 нояб. 2012 г., 11:42
Отредактировано для объяснения сопоставления имен разделов или устройств.
 webminal.org16 нояб. 2012 г., 03:18
спасибо, я получил главный / младший (8,2) номер от stat - как получить имя соответствующего раздела (/ dev / sda2)?

ты можешь просто сделать

df 

который даст вам устройство и раздел для конкретного файла

 webminal.org16 нояб. 2012 г., 03:38
m ищет любые решения библиотечных / системных вызовов (поскольку текущая база кода нене использовать команду оболочки), если она недоступна, яПойдем со своим предложением. Возьмем вывод команды оболочки и проанализируем его, чтобы получить желаемые результаты.
 webminal.org16 нояб. 2012 г., 03:17
спасибо, он работает со сценарием оболочки, я искал решения для программирования на Си.
 amphibient16 нояб. 2012 г., 03:22
Можно'Вы просто вызываете команду оболочки из C и выводите поток в переменную?

Ваш ответ на вопрос