我正在编写内核模块,我需要使用 errno
变量。
我添加了 <linux/errno.h>
没有问题,并添加了 extern int errno;
,
到我的代码。
我以下列方式使用变量:errno = ENOENT;
。
当我编译程序时,我收到以下警告,并且无法加载模块:
WARNING: "errno" [module path] undefined!
为什么会这样?
我使用的是 Ubuntu 12.0.4 的虚拟机
编辑: 我上钩的打开系统调用如下所示:
asmlinkage int hooked_open(char* path, int flags){
if(strstr(path, file_to_hide) != NULL){
return -ENOENT;
}
return original_open(path, flags);
}
在加载模块时运行strace cat file_to_hide 返回值为4294967294,没有错误。
在不存在的文件上运行 strace 时,返回值为 -1 并引发 ENOENT。我希望能够模仿。
答案 0 :(得分:1)
来自 errno: 的手册页
errno 由 ISO C 标准定义为 int 类型的可修改左值,并且不得显式声明;
在一些古老的系统上,
无需显式声明 errno
。