C 如何知道分区?
我正在使用Linux(Ubuntu11.10)。 当我调用系统调用open时,例如在C程序中:C 如何知道分区?,c,linux,kernel,system-calls,C,Linux,Kernel,System Calls,我正在使用Linux(Ubuntu11.10)。 当我调用系统调用open时,例如在C程序中: size_t filedesc = open("testfile.txt",O_CREAT | O_WRONLY,0640); 如何访问分区,我的意思是有没有方法返回所使用的分区 打开的系统调用是上面定义的: SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode) 如果需要,我可以放置一个printk(
size_t filedesc = open("testfile.txt",O_CREAT | O_WRONLY,0640);
如何访问分区,我的意思是有没有方法返回所使用的分区
打开的系统调用是上面定义的:
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
如果需要,我可以放置一个printk(“%s”,filename)
并查看路径。但是我怎样才能访问分区呢
例如:我在两个不同的分区(例如/dev/sda1和/dev/sda2)中有两个存档example.txt
然后我调用系统调用open:假设我调用了分区/dev/sda2中的example.txt。
是否有方法使用开放系统调用访问分区(例如,
printk(内核警报“%s”,分区)
没有什么事情像你希望的那么简单
在do\u sys\u open()
函数中,在返回fd之前
,结构文件*f指向合法的、打开的结构文件
struct文件
包含一个struct路径f\u路径
struct路径
包含一个struct vfsmount*mnt
struct vfsmount
表示系统上安装的每个文件系统
struct vfsmount
包含一个struct super\u块*mnt\u sb
struct super_块
包含一个struct block_设备*s_bdev
struct block_设备
包含一个struct hd_struct*bd_部件
struct hd\u struct
包含一个struct device\u dev
和一个int partno
。这两者一起定义了文件所在的分区
更新
当我找到设备和分区号引用时,我最初已经停止了查找,因为我假设这就是将人类友好字符串组合在一起所需的全部内容。但是,当我用新的眼光再次审视时,我看到了更多:
struct hd\u struct
包含一个struct分区\u meta\u info*info
struct partition\u meta\u info
包含一个字段:
u8 volname[PARTITION_META_INFO_VOLNAMELTH];
此字段是您要查找的设备的名称 没有什么事情像你希望的那么简单 在
do\u sys\u open()
函数中,在返回fd之前
,结构文件*f指向合法的、打开的结构文件
struct文件
包含一个struct路径f\u路径
struct路径
包含一个struct vfsmount*mnt
struct vfsmount
表示系统上安装的每个文件系统
struct vfsmount
包含一个struct super\u块*mnt\u sb
struct super_块
包含一个struct block_设备*s_bdev
struct block_设备
包含一个struct hd_struct*bd_部件
struct hd\u struct
包含一个struct device\u dev
和一个int partno
。这两者一起定义了文件所在的分区
更新
当我找到设备和分区号引用时,我最初已经停止了查找,因为我假设这就是将人类友好字符串组合在一起所需的全部内容。但是,当我用新的眼光再次审视时,我看到了更多:
struct hd\u struct
包含一个struct分区\u meta\u info*info
struct partition\u meta\u info
包含一个字段:
u8 volname[PARTITION_META_INFO_VOLNAMELTH];
此字段是您要查找的设备的名称 通过shell,
df/some/dir
为您提供所涉及的文件系统。通过编程,通过系统调用,您可以获得st\u dev
字段
(补充:)我不知道你到底想做什么,但也许使用更简单 通过shell,
df/some/dir
为您提供所涉及的文件系统。通过编程,通过系统调用,您可以获得st\u dev
字段
(补充:)我不知道你到底想做什么,但也许使用更简单 我不明白你说的是用户区还是内核区。我猜这是用户的地盘(从一个应用程序来看),但是为什么还要为
printk
操心呢?为什么要做这些事情呢?你的解释令人困惑@巴兹尔是对的,我对你想要实现的目标感到困惑。我想我们这里有一个问题-,你在问如何实现一个问题的解决方案,但是如果我们知道你试图解决的问题,我们可能会提出更好的建议。那么:你到底想解决什么问题?谢谢,我不明白你说的是用户区还是内核区。我猜这是用户的地盘(从一个应用程序来看),但是为什么还要为printk
操心呢?为什么要做这些事情呢?你的解释令人困惑@巴兹尔是对的,我对你想要实现的目标感到困惑。我想我们这里有一个问题-,你在问如何实现一个问题的解决方案,但是如果我们知道你试图解决的问题,我们可能会提出更好的建议。那么:你到底想解决什么问题?感谢以上可能是从内核内部看到的。在应用程序内部,只涉及系统调用。问题被标记。内核没有open
函数,它将其作为应用程序的系统调用提供。如果他在内核中编程,他最好快速学习:)如果你搞砸了,这不是很宽容。@UserJ内核有许多不同的层,系统调用或文件系统不知道或不关心分区,这通常由块层处理(在某些情况下,文件系统可以分布在多个分区和驱动器上)。要解决分区问题,您必须经历一些困难。看看statvf