在我的系统(Ubunut 13.10)上,值为FOPEN_MAX16,值为_POSIX_OPEN_MAX20,_SC_OPEN_MAX(我得到它sysconf())的值为4096.我知道这_POSIX_OPEN_MAX是POSIX.1标准OPEN_MAX定义的最小值.所以在这里,真正的价值在于.此外,value for 由ISO C定义.他们都称自己为同一个东西:进程支持的最大打开文件._SC_OPEN_MAXFOPEN_MAX
问:但是,为什么之间的差异FOPEN_MAX和_SC_OPEN_MAX,什么应该是我依赖的时候,我写我的一个Ç应用程序?
提前致谢!
您必须记住,在 POSIX 系统上,文件描述符实际上不必是文件。它也可以是套接字、管道或其他可以由例如read或所使用的东西write。因此将返回您可以拥有的“打开”描述符_SC_OPEN_MAX的最大数量,而不是文件的最大数量。
另外,FOPEN_MAX正如您所注意到的,它特定于 C 语言和 C 库,并且与库调用相关fopen,而不是较低的open系统调用。
差异是因为一个是动态的,一个是静态的。如果您为Ubuntu系统编写软件,则数字表明您将始终能够依赖20个打开的文件(此处的POSIX保证比普通C的16个限制更多)。因此,从理论上讲,您可以有条件地编译一些东西,以使疯狂的东西工作在一个低限附近,以确保该软件可以在具有相同头文件的所有系统上运行。
运行时限制_SC_OPEN_MAX是实际的fd限制。在某些系统上,它可能更低,但不低于20(对于任何POSIX OS)。
最后,OPEN_MAX是_SC_OPEN_MAX特定于操作系统的下限(也就是说,_POSIX_OPEN_MAX告诉您在任何POSIX系统上,OPEN_MAX至少必须为20)。Linux将OPEN_MAX定义为更高的值,因此您可以依靠拥有更多可用的fds,并防止_SC_OPEN_MAX低于实际的OPEN_MAX。