linux redefinition of 'struct timspec'解決

迷霧綠洲發表於2019-02-03

問題出處

要做一個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 估計也要一直存在下去了。

相關文章