我目前正在尝试制作" C"比我自己更多的脚本语言。我在* .so文件中编写我的程序特定代码,在运行时重新加载这个文件并执行我写的新代码。
我面临的问题是功能" stat"的结果。我每次询问是否通过" stat(filename,statbuf)"修改了SO文件。结果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 :(得分: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,这可能没问题。