我正在试图做一个文件统计,
struct kstat stat; int error = vfs_stat ("/bin/ls", &stat); // /bin/ls exists if (error) { printk (KERN_INFO "error code %d\n", error); } else { printk (KERN_INFO "mode of ls: %o\n", stat.mode); printk (KERN_INFO "owner of ls: %o\n", stat.uid); } return error;
但错误总是设置为14
(坏地址),代码有什么问题?
我正在运行3.9内核。
vfs_stat()
被定义为 :
int vfs_stat(const char __user *name, struct kstat *stat);
和__user
被定义为 :
# define __user __attribute__((noderef, address_space(1)))
换句话说, vfs_stat()
只支持使用指向用户空间的指针的文件名,而不应该在内核空间内解除引用。 请注意, "/bin/ls"
不会指向用户空间,而是指向内核空间,因此不能在此处使用。
其实,错误信息14(坏地址)把这个问题告诉你的脸:)
使用下面的代码:
#include <linux/uaccess.h> int error; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); error = vfs_stat ("/bin/ls", &stat); set_fs(old_fs); ...