2015-12-05 51 views
0

我目前正在嘗試使「C」多一點的腳本語言像我自己一樣。我將程序特定的代碼寫入* .so文件,在運行時重新加載此文件並執行我編寫的新代碼。sys函數調用「stat」更改我的文件嗎?

我面臨的問題是函數「stat」的結果。每次我詢問SO文件是否已經通過「stat(filename,statbuf)」修改時,結果stat-> mtim似乎總是被改變。因此,我不斷在每次循環運行中重新加載我的代碼。

我假設如果沒有文件更改爲文件發生st_mtime必須始終相同。我錯了嗎?

在這裏,我如何檢索值st_mtime功能:

inline timespec LinuxGetLastWriteTime(const std::string& filename) { 
    struct stat *buf; 

    stat(filename.c_str(), buf); 

    return buf->st_mtim; 
} 

而且在這兒,我檢查,如果我需要重新加載:

timespec NewSOWriteTime = LinuxGetLastWriteTime(SoSource); 
if (Game.last_modification != NewSOWriteTime) { 
     LinuxUnloadGameCode(&Game); 
     Game = LinuxLoadGameCode(SoSource, "libCode_temp.so"); 
} 

和我的兩個重載=和<!

bool operator<(const timespec& lhs, const timespec& rhs) { 
    if (lhs.tv_sec == rhs.tv_sec) 
     return lhs.tv_nsec < rhs.tv_nsec; 
    else 
     return lhs.tv_sec < rhs.tv_sec; 
} 

bool operator!=(const timespec& lhs, const timespec& rhs) { 
    if (lhs.tv_sec == rhs.tv_sec) 
     return lhs.tv_nsec != rhs.tv_nsec; 
    else 
     return lhs.tv_sec != rhs.tv_sec; 

任何想法,爲什麼這可能會發生

+0

'st_mtim'的時間是'time_t',而不是'timespec'。從顯示的代碼中遺漏的是'timepec'是如何從'time_t'構造的。你初始化了所有的成員嗎? 'time_t'給你秒。如果那些是平等的,但是一些'tv_nsec'成員是垃圾? – Kaz

+1

作爲一般建議,在Linux上,您可以在'valgrind'下運行程序並跟蹤錯誤。 – Kaz

+0

jupp在過去st_mtim是時間time_t,但至少在我的平臺ubuntu 14.04現在是timespec [見圖](http://imgur.com/BkAxkPv)。所以它不是由time_t構造的,而是從函數調用「stat」中「初始化」的。 – ExOfDe

回答

2

的代碼使用:

struct stat *buf; 

stat(filename.c_str(), buf); 

return buf->st_mtim; 

奇怪,至少可以這樣說。你很不幸,它並沒有立即崩潰,但沒有人真正知道它在哪裏寫結果;在途中可能會浪費一些其他重要數據。你應該自己分配buf,並將其地址傳遞給stat,例如:

struct stat buf = {0}; // or memset(0) 
stat(filename.c_str(), &buf); 
return buf.st_mtim; 

你或許還應該檢查的stat錯誤狀態,但如果緩衝區歸零它只是返回0,這可能是罰款。

+1

而且,正如Kaz在評論中所說的那樣,「valgrind」通常會在瞬間發現類似的錯誤。 – keltar

相關問題