C getrlimit-1返回值

C getrlimit-1返回值,c,stack,libc,errno,C,Stack,Libc,Errno,在创建不同的基准测试时,我通常以最佳延迟为目标。众所周知,访问堆中的内存比访问堆栈中的内存要昂贵得多。我们现在是在2021年,当我尝试ulimit-s时,我发现我有8192kbs可用。不能再高一点吗 我想知道如何使用c代码进行设置,并发现: getrlimit()和setrlimit()系统分别调用get和set资源限制。每个资源都有一个相关的软限制和硬限制,由rlimit结构定义[…] 我发现了,而且,虽然它们都很有趣,但仍有一些小东西我没有得到: 定义GNU源 #定义_文件_偏移量_位64

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

我想知道如何使用c代码进行设置,并发现:

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

我发现了,而且,虽然它们都很有趣,但仍有一些小东西我没有得到:

定义GNU源
#定义_文件_偏移量_位64
#包括
#包括
#包括
#包括
#包括
#包括
#定义errExit(msg)do{perror(msg);exit(exit_FAILURE);}while(0)
int main(int argc,char*argv[])
{
结构限制旧的、新的;
结构rlimit*newp;
pid_t pid;
如果(!(argc==2 | | argc==4)){
fprintf(标准,“用法:%s[”
“]\n”,argv[0]);
退出(退出失败);
}
pid=atoi(argv[1]);/*目标进程的pid*/
newp=NULL;
如果(argc==4){
new.rlim_cur=atoi(argv[2]);
new.rlim_max=atoi(argv[3]);
//newp=&new;//我对这一行进行注释,以避免过多地干扰进程;)
}
/*设置目标进程的CPU时间限制;检索并显示以前的限制*/
if(prlimit(pid、RLIMIT_CPU、newp和old)=-1)
errExit(“prlimit-1”);
;
printf(“以前的限制:软=%lld;硬=%lld\n”,(长-长)old.rlim\u cur,(长-长)old.rlim\u max);
/*检索并显示新的CPU时间限制*/
if(prlimit(pid、RLIMIT_CPU、NULL和old)=-1)
errExit(“prlimit-2”);
printf(“新限制:软=%lld;硬=%lld\n”,(长-长)old.rlim\u cur,(长-长)old.rlim\u max);
//佩罗尔(“错误:”);
退出(退出失败);
}
如果我尝试任何进程,我会看到,至少在Ubuntu 18.04和使用gcc编译时,当它尝试检索当前和最大限制时,它将返回-1这个-1返回值到底是什么?它是指“设置为默认系统值”还是“检索失败”,如果是“检索失败”,原因是什么?为什么
if(prlimit(pid、RLIMIT\U CPU、newp和old)=-1)
未触发

Previous limits: soft=-1; hard=-1
但是,如果我取消注释
newp=&new
(故意注释),然后我可以为流程设置一个新值,包括current和max,这没有问题,而且非常令人惊讶理论上我可以设置的最大值是多少?我尝试了
sudo gcc raise_stack.c&&/a.out 9194 8192 16384
,但我太害怕烧坏我的cpu,不敢亲自尝试;)

非常感谢您帮助我更好地理解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、RLIMIT\u CPU、newp和old);
佩罗尔(“错误:”);

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

这个-1值是RLIM_无穷大,这意味着没有强加的限制。

这个-1返回值到底是什么。读这本书。在Linux中,通常的做法是成功返回0,错误返回非零。然后设置
errno
,以指示更精确的错误代码。如果出现错误,请调用
perror
以获取
errno
值的字符串描述。这就是我所做的(正如您可以看到它的注释)并且我得到了
error:success
所以我真的不明白。您能提供准确的输入和输出吗?@kaylum感谢您花时间帮助!请参阅我的编辑
//perror(“错误:”)peror
。在本例中,
printf
是最后一个调用,它很可能将
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