端口 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