2016-02-26 49 views
0

我正在對我的文件描述符執行fstat並將其轉儲到struct stat。我閱讀了fstat的文檔(下面的鏈接),它聲稱有成員st_atimest_mtimefstat:st_atime和st_mtime不是會員?

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/stat.h.html

GCC讓我編的,而是通過GDB步進,我不能打印出這些成員(即我可以打印所有其他成員)。 GDB聲稱他們不存在。

實際上,當我打印出struct stat,st_atime拼寫st_atim(即與st_mtime相同的東西)。然後它看起來像是一個元組或東西,因爲它包含兩個值,tv_sectv_nsec

有誰知道爲什麼GDB聲稱他們不存在?

另外,有誰知道如何將它傳遞給memcpy?我正在使用C90

這是它所抱怨的代碼行,說我不能在這裏通過time_t。我將如何施展才能使這條線路起作用?

memcpy(&temp.otar_adate, file_statistics.st_atime, OTAR_DATE_SIZE); 

MY OS:CentOS的

+2

我不確定我理解使用'memcpy'的意義。如果類型兼容,則使用分配。如果它們不兼容,'memcpy'可能是錯誤的方法。但是,您可能打算傳入'&file_statistics.st_atime'。 – jxh

+2

對於* GDB聲稱它們不存在*,您沒有指定您的操作系統平臺,以及它是否應該符合POSIX標準。 – jxh

+0

剛剛更新@jxh。 – MrPickles

回答

1

在Linux上,至少某些版本,st_atimestruct stat一些其他的時間字段內struct timespec並且包含全納秒精度正確時間戳。在這些系統上st_atime是對其他內容的定義。在我的CentOS機器上,它被定義爲st_atim.tv_sec

要把你的代碼到預處理,看看它是你的系統是什麼:

$ cat foo.c 
#include <sys/stat.h> 

void 
foo(void) 
{ 
    struct stat st; 

    (void)st.st_atime; 
} 
$ cc -E foo.c | tail -7 
void 
foo(void) 
{ 
struct stat st; 

(void)st.st_atim.tv_sec; 
} 

GDB不知道預處理器定義,所以它無法知道你的代碼是怎麼預處理。它只知道結構的真實定義。