【问题标题】:Port setrlimit RLIMIT_CPU to windows端口 setrlimit RLIMIT_CPU 到 windows
【发布时间】:2021-03-28 19:13:17
【问题描述】:

我今天花了很大一部分时间尝试将 expresso 逻辑启发式移植到 Windows/Visual Studio 中,以便我可以将其链接为静态库。 Github Link(我昨天花了很大一部分时间试图找到一个可以在 Windows 上运行的版本,而不仅仅是一个 exe,所以我可以在放弃并尝试自己实现它之前将它链接到我的 c++ 代码)

我的大部分工作是修复所有链接错误并为其编辑 NodeJS 桥,以便我可以(稍微轻松地)将其链接为具有“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(/TC/Za 在 VS 中)但是因为我的最终环境将它链接到 C++ 一个 C++ 方法,我可以 extern "C" 到 c 代码中正常工作也是。 (我知道标记 c 和 c++ 是不受欢迎的)

我找到的最接近的相关问题是about stack size using strlimit

编辑:就我而言,这不是问题。为未来留下一个潜在的解决方案

【问题讨论】:

  • 我不完全同意删除 c++ 标签。一个可以链接到 c 代码的 c++ 解决方案可以解决这个问题,我的最终环境是链接到几个 c++17 项目

标签: c porting


【解决方案1】:

在我的具体情况下,set_time_limit 函数不会在 expresso 的任何部分中调用。 (禁用它不会改变程序的功能) 所以删除它很好,我可以继续验证其他部分。

对于未来的读者,在尝试移植我收到的信息时,setrlimitRLIMIT_CPU 在 Windows 上的功能可以通过来自 windows.hhttps://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

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多