Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何知道分区?_C_Linux_Kernel_System Calls - Fatal编程技术网

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(

我正在使用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(“%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