我正在尝试对文件进行统计,
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内核。
答案 0 :(得分:4)
vfs_stat()
是defined as:
int vfs_stat(const char __user *name, struct kstat *stat);
且__user
为defined as:
# define __user __attribute__((noderef, address_space(1)))
换句话说,vfs_stat()
仅支持使用指向用户空间的文件名,不应在内核空间内取消引用。请注意,"/bin/ls"
不指向用户空间,而是指向内核空间,因此不能在此处使用。
实际上,错误消息14(错误的地址)会直接告诉您这个问题:)
答案 1 :(得分:1)
使用以下代码:
#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);
...