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 FORM ACTION 無法解決動態賦值?StructORM賦值
- 升級react-native至0.45.0後Redefinition of 'RCTMethodInfo'解決方法React
- Linux struct itimerval用法LinuxStruct
- struct的匿名用法詳解Struct
- Python中struct.pack()和struct.unpack()用法詳解PythonStruct
- Go Struct超詳細講解GoStruct
- Master Note:Online Redefinition of Tables (DBMS_REDEFINITION)_1357825.1AST
- 結構體定義:struct與typedef struct 用法詳解和用法小結結構體Struct
- Online Redefinition
- Hibernate中@Struct註解型別Struct型別
- Shrink a SECUREFILE LOB Using Online Redefinition (DBMS_REDEFINITION)?1394613.1
- 【dbms包】dbms_redefinition
- linux記憶體管理(六)- 核心新struct - folioLinux記憶體Struct
- struct和typedef struct 有什麼不同呢?Struct
- PostgreSQL 原始碼解讀(221)- Locks(PROCLOCK Struct)SQL原始碼Struct
- 使用DBMS_REDEFINITION包執行線上重定義表(ONLINE TABLE REDEFINITION)
- Ruby Struct EqualStruct
- 結構 STRUCTStruct
- linux 中文不支援解決Linux
- 解決Linux中文亂碼Linux
- xmanager之linux 解決方法Linux
- unpv2中:struct ipc_perm沒有名為seq的成員 的解決辦法Struct
- PostgreSQL 原始碼解讀(220)- Locks(LOCK Struct)SQL原始碼Struct
- 【REDEFINITION】使用線上重定義dbms_redefinition完成主鍵列型別的調整型別
- Oracle DBMS_REDEFINITION Version 10.2Oracle
- linux inode已滿解決方法Linux
- 解決linux埠被佔用Linux
- linux解決xhost: unable to open displayLinux
- linux解決xhost unable to open display‘’Linux
- Linux 6.4 網路卡 not active 解決Linux
- Linux下錯誤解決方案Linux
- struct轉map (反射)Struct反射
- 結構體struct結構體Struct
- Struct與Class辨析Struct
- webservice中呼叫structWebStruct
- c#之structC#Struct
- 【REDEFINITION】不可使用dbms_redefinition完成列型別的調整(ORA-42016)型別
- dbms_redefinition線上重定義表