`sysconf()`和`getrlimit()`之间有什么关系和区别?

时间:2018-05-30 03:55:57

标签: c linux limit ulimit

sysconf()getrlimit()之间的关系和区别是什么?

他们是否提供两种不同的方式来报告相同资源的限制?

我们何时使用哪个?

感谢。

我发现这两个函数有两个相互矛盾的评论:

来自http://forums.devshed.com/programming-42/whats-difference-sysconf-rlimit-955656.html

  

如果我没记错的话,sysconf()的东西不能被a改变   进程(即)它们在内核级别配置并需要a   重新编译要更改的操作系统内核和/或C库   他们。您只能读取这些值,但不能在运行时更改它们。

     

使用setrlimit()/ getrlimit(),您可以读取和更改值   (在合理范围内)运行时的某些资源。例如,你可以   调用setrlimit()来设置最大值。核心转储大小的进程,即   如果一个进程经常崩溃并且你不想填补你的努力,那就很有用   磁盘放大文件。

     

您可以使用rlimit读取/设置的参数与   您可以使用sysconfig()读取的参数。他们处理   不同的系统旋钮。

     

sysconf()和getrlimit()返回不同资源设置的值(不重叠),因此您可以根据程序搜索的信息调用相应的值。

但是来自APUE:

  

例如,我们可以再次使用Bourne中内置的 ulimit 命令   shell可以更改我们的进程可以打开的最大文件数   在一次。这通常需要特殊(超级用户)   如果限制要有效无限制,则享有特权。但   一旦设置为有效, sysconf 将报告LONG_MAX作为限制   对于OPEN_MAX。一个依赖于此值作为上限的程序   关闭文件描述符,如图2.17所示,将浪费很多   时间试图关闭2,147,483,647文件描述符,其中大部分   甚至没有使用。

     

支持Single中XSI选项的系统   UNIX规范将提供 getrlimit (2)函数(Section   7.11)。它可用于返回进程可以打开的最大描述符数。有了它,我们可以检测到它   我们的开放文件数没有配置上限   流程可以打开,所以我们可以避免这个问题。

1 个答案:

答案 0 :(得分:2)

sysconf是一个通用函数,用于获取许多不同系统配置变量的值,而不仅仅是资源限制。有些代表了系统范围的限制。 sysconf没有对应的设置函数(其中一些值不是动态的)。所有这些值在同一过程中的两次调用中不得更改(请参阅下面的例外)。

getrlimit是获取资源限制值的函数。它的设置对应是setrlimit(可以有一些限制)。

两者都是由POSIX定义的,标准没有说明除了OPEN_MAX之外的重叠,这可能会在过程生命周期中发生变化。