c - 如何知道分区?

标签 c linux kernel system-calls

我使用的是 Linux (Ubuntu 11.10)。 好吧,当我打开系统调用时,例如在 C 程序中:

size_t filedesc = open("testfile.txt",O_CREAT | O_WRONLY,0640);

我如何访问分区,我的意思是有没有办法返回使用的分区?

系统调用open就是上面定义的:

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)

如果需要,我可以输入 printk("%s",filename) 并查看路径。但是我如何访问分区?

例如:我在两个不同的分区(例如/dev/sda1 和/dev/sda2)中有两个存档 example.txt。

然后我打开系统调用:假设我在分区/dev/sda2 中调用了 example.txt。 有没有办法使用开放系统调用来访问分区(例如,printk(KERN_ALERT "%s",partition))?

最佳答案

没有事情像您希望的那么简单。

do_sys_open() 函数中,紧接在 return fd; 之前,struct file *f 指向一个合法的、打开的、结构文件

struct file 包含一个struct path f_path

struct path 包含一个struct vfsmount *mntstruct vfsmount 表示系统上每个已安装的文件系统。

struct vfsmount 包含一个struct super_block *mnt_sb

struct super_block 包含一个struct block_device *s_bdev

struct block_device 包含一个struct hd_struct *bd_part

struct hd_struct 包含一个struct device __dev 和一个int partno。这两个共同定义了您的文件所在的分区。

更新

当我找到设备和分区编号引用时,我最初停止寻找,因为我认为这就是将人类友好的字符串组合在一起所需的全部内容。但当用新的眼光再次审视时,我发现还有更多:

struct hd_struct 包含一个struct partition_meta_info *info

struct partition_meta_info 包含一个字段:

    u8 volname[PARTITION_META_INFO_VOLNAMELTH];

此字段是您要查找的设备的名称。

关于c - 如何知道分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8193716/

相关文章:

c++ - 组织跨平台的C/C++项目

GPS 数据包的字符数组操作

带有度数符号的linux鞭尾

makefile - 编译错误: Kernel module

kernel - 如何解决 cpufreqset 错误

x86 - 为什么我们在初始化 PIC(8259) 时将 ICW 1 分配给端口 0x20,而将其他 ICWS 分配给端口 0x21?

c++ - uint8 使用 SIMD Neon 内在函数 float

c - 为什么 "+="在 SSE 内在函数中给了我意想不到的结果

c++ - 为什么 lint 会针对以下代码提示 "Warning 446: side effect in initilizer"和 lint e446?

linux - 了解 vi 编辑器的内部结构