【发布时间】:2018-05-15 11:40:51
【问题描述】:
回答者
解决了!!感谢@IanAbbott
标题应该是:
#include <linux/ktime.h>
#include <linux/timekeeping.h>
而不是<linux/time.h>。
更多细节见讨论。
原始问题
我正在编写一个系统调用名称sys_my_time.c,它将使用getnstimeofday()。我已经导入了<linux/time.h>。代码如下:
#include <linux/kernel.h>
#include <linux/linkage.h>
#include <linux/time.h>
asmlinkage int sys_my_time() {
struct timespec t;
getnstimeofday(&t);
// ...
return 0;
}
但是在编译的时候,报错:
CC kernel/sys_my_time.o
kernel/sys_my_time.c: In function ‘sys_my_time’:
kernel/sys_my_time.c:8:3: error: implicit declaration of function ‘getnstimeofday’ [-Werror=implicit-function-declaration]
getnstimeofday(&t);
^
cc1: some warnings being treated as errors
scripts/Makefile.build:320: recipe for target 'kernel/sys_my_time.o' failed
make[1]: *** [kernel/sys_my_time.o] Error 1
Makefile:1029: recipe for target 'kernel' failed
make: *** [kernel] Error 2
我不知道为什么会发生错误。
附:在 Ubuntu 16.04 中编译内核 V4.14.25
【问题讨论】:
-
自 v3.17.x 起,
getnstimeofday由#include <linux/timekeeping.h>声明。 -
@Abbott 谢谢,但是当我更改为
<linux/timekeeping.h>和其他相同时:In file included from kernel/sys_my_time.c:3:0: ./include/linux/timekeeping.h:19:36: warning: ‘struct timeval’ declared inside parameter list extern void do_gettimeofday(struct timeval *tv); ^ // ...... ./include/linux/timekeeping.h:330:4: error: expected ‘;’, ‘,’ or ‘)’ before ‘ kernel/sys_my_time.c: In function ‘sys_my_time’: kernel/sys_my_time.c:7:18: error: storage size of ‘t’ isn’t known struct timespec t; -
好像不能直接使用
<linux/timekeeping.h>?错误信息不可能是我的代码造成的? -
它可能取决于其他一些标题。尝试使用
#include <linux/ktime.h>,因为这将执行<linux/timekeeping.h>和其他与时间相关的标题的嵌套#include。 -
@IanAbbott 谢谢!!添加
#include <linux/ktime.h> #include <linux/timekeeping.h>后,就可以了。 :)
标签: c linux-kernel system-calls gettimeofday