端口 setrlimit RLIMIT_CPU 到 windows
Port setrlimit RLIMIT_CPU to windows
我今天花了很大一部分时间尝试将 expresso 逻辑启发式移植到 windows/visual 工作室,以便我可以 link 它作为静态库。 Github Link(我昨天花了很大一部分时间试图找到一个适用于 windows 的版本,它不仅仅是一个 exe,所以我可以 link 它到我的 c++ 代码,然后放弃并尝试自己实现)
我的大部分工作是修复所有 link 错误并为它编辑一个 NodeJS 桥,这样我就可以(稍微容易地)link 它作为一个带有“minimize_from_data" 功能,但是我的很多“移植”都非常笨拙,我只是禁用了一些仅 POSIX 的功能。
现在我已经编译好了,在我将它安全地用于一些个人项目之前,我正在尝试返回并确保它没有错误(我不完全相信我正确地移植了它) .我“禁用”的功能之一是 sys/resource 功能,它将 RLIMIT_CPU 设置为几秒钟的值,作为我可以理解的超时功能,如果花费的时间太长,该功能将终止程序。复制到这里
void set_time_limit(int seconds){
#ifndef _WIN32
struct rlimit rlp_st, *rlp = &rlp_st;
rlp->rlim_cur = seconds;
setrlimit(RLIMIT_CPU, rlp);
#endif
}
有什么方法可以替换 windows 中的这个功能吗?目前,我已经将所有 expresso 源代码设置为编译为 c(VS 中的 /TC
/Za
),但是因为我的最终环境是 link 将其编译为 C++,我可以使用 C++ 方法extern "C"
到 c 代码中也同样有效。 (我知道标记 c 和 c++ 是不受欢迎的)
我找到的最相关的问题是 about stack size using strlimit
编辑:对我来说不是问题。为未来留下一个潜在的解决方案
在我的具体案例中,set_time_limit
函数在 expresso 的任何部分都没有被调用。 (禁用它不会改变程序的功能)
所以删除它很好,我可以继续验证其他部分。
对于未来的读者,在尝试移植我收到的信息时,setrlimit
RLIMIT_CPU
在 windows 上的功能可以通过 windows.h
https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information
//roughly/adding validation and error checking
// create job then
JOBOBJECT_BASIC_LIMIT_INFORMATION job_object_basic_limit_information = {
.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_TIME,
.PerProcessUserTimeLimit = {
.QuadPart = (long long) seconds * 10ll * 1000000ll
}
};
// set information job object then
// assign getCurrentProcess to job object
我今天花了很大一部分时间尝试将 expresso 逻辑启发式移植到 windows/visual 工作室,以便我可以 link 它作为静态库。 Github Link(我昨天花了很大一部分时间试图找到一个适用于 windows 的版本,它不仅仅是一个 exe,所以我可以 link 它到我的 c++ 代码,然后放弃并尝试自己实现)
我的大部分工作是修复所有 link 错误并为它编辑一个 NodeJS 桥,这样我就可以(稍微容易地)link 它作为一个带有“minimize_from_data" 功能,但是我的很多“移植”都非常笨拙,我只是禁用了一些仅 POSIX 的功能。
现在我已经编译好了,在我将它安全地用于一些个人项目之前,我正在尝试返回并确保它没有错误(我不完全相信我正确地移植了它) .我“禁用”的功能之一是 sys/resource 功能,它将 RLIMIT_CPU 设置为几秒钟的值,作为我可以理解的超时功能,如果花费的时间太长,该功能将终止程序。复制到这里
void set_time_limit(int seconds){
#ifndef _WIN32
struct rlimit rlp_st, *rlp = &rlp_st;
rlp->rlim_cur = seconds;
setrlimit(RLIMIT_CPU, rlp);
#endif
}
有什么方法可以替换 windows 中的这个功能吗?目前,我已经将所有 expresso 源代码设置为编译为 c(VS 中的 /TC
/Za
),但是因为我的最终环境是 link 将其编译为 C++,我可以使用 C++ 方法extern "C"
到 c 代码中也同样有效。 (我知道标记 c 和 c++ 是不受欢迎的)
我找到的最相关的问题是 about stack size using strlimit
编辑:对我来说不是问题。为未来留下一个潜在的解决方案
在我的具体案例中,set_time_limit
函数在 expresso 的任何部分都没有被调用。 (禁用它不会改变程序的功能)
所以删除它很好,我可以继续验证其他部分。
对于未来的读者,在尝试移植我收到的信息时,setrlimit
RLIMIT_CPU
在 windows 上的功能可以通过 windows.h
https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information
//roughly/adding validation and error checking
// create job then
JOBOBJECT_BASIC_LIMIT_INFORMATION job_object_basic_limit_information = {
.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_TIME,
.PerProcessUserTimeLimit = {
.QuadPart = (long long) seconds * 10ll * 1000000ll
}
};
// set information job object then
// assign getCurrentProcess to job object