sys 函数调用 "stat" 会更改我的文件吗?
Does sys function call "stat" change my file?
我目前正在努力使 "C" 更适合我自己的脚本语言。我在 *.so 文件中编写我的程序特定代码在 运行 时间重新加载此文件并执行我编写的新代码。
我面临的问题是函数 "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;
知道为什么会发生这种情况
您使用的代码:
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
的错误状态,但如果缓冲区已清零,它只会 return 0 这可能没问题。
我目前正在努力使 "C" 更适合我自己的脚本语言。我在 *.so 文件中编写我的程序特定代码在 运行 时间重新加载此文件并执行我编写的新代码。
我面临的问题是函数 "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;
知道为什么会发生这种情况
您使用的代码:
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
的错误状态,但如果缓冲区已清零,它只会 return 0 这可能没问题。