linux redefinition of 'struct timspec'解決
問題出處
要做一個linux kernel 應用層去測試rtc 和系統時間的功能和精度,寫的簡單應用遇到編譯錯誤。
問題現象
編譯linux 核心應用rtc 測試:
#include <stdio.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
#include <sys/time.h>
#include <linux/rtc.h>
#include <linux/time.h>
int main(int arg, char argv[])
{
int fid, status, count;
int data = 0x1234;
int lut[12] = { 0 };
int temp_0, temp_1;
int fd = -1;
int retval = 0;
int irqcount = 0;
struct rtc_time rtc_tm;
int alarm_time = 10;
struct timeval tv;
fid = open("/dev/fh_rtc_misc", O_RDWR);
if (fid < 0) {
printf("open fh rtc misc device failed\n");
return 0;
}
for (count = 0; count < 12; count++) {
lut[count] = 0x81000000; //負向最大的offset =0x81
}
status = ioctl(fid, RTC_SET_LUT, &lut[0]);
if (status < 0) {
printf("ioctl error\n");
}
lut[0] = 1;
lut[1] = 0xd; //設定index=3
status = ioctl(fid, SET_REG_VALUE, &lut[0]);
if (status < 0) {
printf("ioctl error\n");
}
sleep(1);
gettimeofday(&tv,NULL);
printf("rtc time is %x ,sys time is %x\n",lut[0],tv.tv_sec);
編譯報錯
問題排查
提示是timespec 結構體重複定義,最有可能就是include的幾個檔案中真的重複定義了:
#include <time.h>
#include <sys/time.h>
#include <linux/rtc.h>
#include <linux/time.h>
<time.h> 中沒有直接定義timespec,在他引用的 <bits/types/struct_timespec.h>
struct timespec
{
_time_t tv_sec;/*Seconds */
_syscall_slong_t tv_nsec;/*Nanoseconds. */
}
兩個成員:tv_sec 記錄系統元年距今的秒數,tv_nsec 納秒
#include <sys/time.h>
中沒有定義
#include <linux/rtc.h>
也沒有定義
#include <linux/time.h> 也就最有可能了
果然其中就直接定義了timespec 結構體
struct timespec
{
_kernel_time_t tv_sec;/*seconds */
long tv_nsec;/*nanoseconds. */
}
註釋內容一致,大小寫有點區別而已。應用的適用性考慮肯定選擇去掉#include <linux/time.h>
再次編譯
問題總結
這時一個系統中存在重複定義,應用中沒有明確應用範圍導致的錯。這種bug 估計也要一直存在下去了。
相關文章
- struct的匿名用法詳解Struct
- Go Struct超詳細講解GoStruct
- Hibernate中@Struct註解型別Struct型別
- linux記憶體管理(六)- 核心新struct - folioLinux記憶體Struct
- PostgreSQL 原始碼解讀(220)- Locks(LOCK Struct)SQL原始碼Struct
- PostgreSQL 原始碼解讀(221)- Locks(PROCLOCK Struct)SQL原始碼Struct
- linux inode已滿解決方法Linux
- Linux下錯誤解決方案Linux
- linux 故障解決方法彙總Linux
- struct和typedef struct 有什麼不同呢?Struct
- Ruby Struct EqualStruct
- Linux——ssh登入很慢解決方法Linux
- 解決linux rz傳輸失敗Linux
- linux解決“XXX is not in the sudoers file”錯誤Linux
- linux 安裝 jupyter報錯解決Linux
- C時間函式strftime、struct timespec 和 struct timeval函式Struct
- Linux-task_struct和檔案系統及管道的關係LinuxStruct
- Oracle 11G DBMS_REDEFINITION修改表資料型別Oracle資料型別
- 解決Kali Linux 2020.1亂碼問題Linux
- Linux提示crontab command not found的解決方法Linux
- LINUX 解決時間同步問題(NTP)Linux
- 用linux man命令,自己解決問題Linux
- struct轉map (反射)Struct反射
- golang-json, 原始碼解釋struct轉json時,struct對屬性欄位需要大寫才能轉譯成功GolangJSON原始碼Struct
- Linux中產生zombie的原因詳解及解決方法!Linux
- 徹底解決Linux下mongodb的安裝LinuxMongoDB
- linux mint 19解決 輸入法問題Linux
- Arch linux下安裝bochs失敗解決Linux
- File name too long window和linux排查,解決Linux
- 在Linux中,ansible可以解決哪些問題?Linux
- Jtti:linux中vboxmanage報錯怎麼解決JttiLinux
- Linux 出現 su: Authentication failure 解決辦法LinuxAI
- Solaris Linux SSH緩慢診斷與解決Linux
- Linux終端中文菱形亂碼解決方案Linux
- Linux 離奇磁碟爆滿解決辦法Linux
- linux mysql無法啟動怎麼解決?LinuxMySql
- linux sed 命令引起的^M問題解決Linux
- array+map+struct.hqlStruct