C 如何获取文件的设备/分区名称?

C 如何获取文件的设备/分区名称?,c,linux,filesystems,C,Linux,Filesystems,我有如下分区结构: $ 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

我有如下分区结构:

$ 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()从根目录调用,解析文件名并打印其大小。 like from device:/dev/sda6并列出该分区下的文件名。 当它从/home读取内容时-它应该显示从/dev/sda7读取的内容并列出文件名


请告诉我,如果您需要更多详细信息,struct 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实用程序没有额外的魔法。这是strace-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)的输出类似,只是它直接来自内核。某些发行版将/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。主/次编号应该是分区的可靠唯一标识符。

您可以这样做

df <file_name>
df

这将为您提供特定文件的设备和分区

如果您正在调用
readdir
,一定有人先调用了
opendir
。调用
opendir
时使用的路径是什么?实际上,opendir()将在/directory上被调用。它解析整个文件系统-在这里它面临着识别其是否交叉到不同分区的问题?谢谢,它与shell脚本一起工作,我在寻找C编程的解决方案。你不能从C调用shell命令并将输出流化为变量吗?我在寻找任何库/系统调用解决方案(因为当前的代码库不使用任何shell命令),如果它不可用,我同意你的建议。获取shell命令输出并对其进行分析以获得所需的结果。谢谢,我从stat获得了主/次(8,2)编号-如何获取其相应的分区名称(/dev/sda2)?编辑以解释到分区或设备名称的映射。感谢cdleonard的帮助,我可以使用/proc/partitions文件。