getrlimit -1 返回值

问题描述

在创建不同的基准测试时,我经常以最佳延迟为目标。众所周知,访问堆中的内存比访问堆栈中的内存要昂贵得多。现在是 2021 年,当我尝试 ulimit -s 时,我发现我有 8192kbs 可用。不能设置得更高吗?

我想知道如何使用 c 代码设置它并发现 setrlimitgetrlimit

getrlimit() 和 setrlimit() 系统分别调用 get 和 set 资源限制。每个资源都有一个相关的软限制和硬限制,由 rlimit 结构定义 [...]

我发现了 this answerthis one,虽然它们都很有趣,但仍有一些小东西我不明白:

#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>
#include <errno.h>

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(int argc,char *argv[])
{
    struct rlimit old,new;
    struct rlimit *newp;
    pid_t pid;

    if (!(argc == 2 || argc == 4)) {
        fprintf(stderr,"Usage: %s <pid> [<new-soft-limit> "
        "<new-hard-limit>]\n",argv[0]);
        exit(EXIT_FAILURE);
    }

    pid = atoi(argv[1]); /* PID of target process */

    newp = NULL;
    if (argc == 4) {
        new.rlim_cur = atoi(argv[2]);
        new.rlim_max = atoi(argv[3]);
     //   newp = &new; // I comment this line to avoid messing up with the processes too much;)
    }

/* Set CPU time limit of target process; retrieve and display previous limit */

    if (prlimit(pid,RLIMIT_CPU,newp,&old) == -1)
        errExit("prlimit-1");

      ;
    printf("Previous limits: soft=%lld; hard=%lld\n",(long long) old.rlim_cur,(long long) old.rlim_max);

/* Retrieve and display new CPU time limit */

    if (prlimit(pid,NULL,&old) == -1)
        errExit("prlimit-2");
    printf("New limits: soft=%lld; hard=%lld\n",(long long) old.rlim_max);

    //perror("error:");
    exit(EXIT_FAILURE);
}

如果我尝试任何进程,我会看到,至少在 Ubuntu 18.04 上并使用 gcc 进行编译,当它尝试检索当前和最大限制时,它将返回 -1。 这个 -1 返回值究竟是什么?是“设置为默认系统值”还是“检索失败”,如果是“检索失败”,原因是什么?为什么if (prlimit(pid,&old) == -1)没有触发?

Previous limits: soft=-1; hard=-1

但是如果我取消注释newp = &new;(故意注释),那么我可以为进程设置一个新值,当前和最大值,这没有问题,而且非常神奇。 理论上我可以设置的最大值是多少?我尝试过 sudo gcc raise_stack.c && ./a.out 9194 8192 16384 但我太害怕烧毁我的 CPU 无法自己尝试 ;)

New limits: soft=8192; hard=16384

非常感谢您帮助我更好地理解 getrlimit。

注意:避免“如果您必须提高堆栈内存,那么您就做错了”。这不是意见问题。

编辑:无法弄清楚在哪里设置 errno 以获得正确的结果

error:: Success
error:: Success
error:: Success
error:: Success
error:: Success
error:: Success
Previous limits: soft=-1; hard=-1
error:: Success
New limits: soft=-1; hard=-1
error:: Success

我在之后设置

long long a = prlimit(pid,&old);
perror("error:");

但仍然不是我正在寻找的 ERRNO。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)