10-不确定的限制
11.4 不确定的限制
有时,系统实现并未将一些系统限制定义为限制常量(比如:PATH_MAX),并且sysconf()或pathconf()在返回相应限制(比如_PC_PATH_MAX)时会将其归为不确定。对此,可采用如下策略之一。
- 当编写一个可在多个UNIX实现间移植的应用程序时,可选择使用SUSv3所规定的最低限制值。此类以POSIX*_MAX形式命名的常量,具体参见11.1节。此方法有时并不可行,因为该限制之低已经超乎实际情况,正如_POSIX_PATH_MAX和_POSIX_OPEN_MAX的情况。
- 在某些情况下,切实可行的解决方法是省去对限制的检查,取而代之以执行相关的系统调用或库函数。(类似观点也适用于11.5节中所描述的一些SUSv3选项。)如果调用失败,且errno表明出错是由于超出了系统限制时,那么可以根据需要调整应用的行为,并再次尝试调用。例如,对于可发送给进程的实时信号队列长度,大多数UNIX实现都进行了强制限制。一旦达到限额,试图进一步发送信号(使用sigqueue()函数)将以失败告终,且会将错误号errorno置为EAGAIN。这时,发送进程只需简单重试即可,或许是在等待片刻之后。与之相类似,试图打开一个文件时,若文件命名过长,将会产生ENAMETOOLONG错误,之后应用程序可以一个更加简短的命名进行重试。
- 自行编写程序或函数,以推断或估算限制值。无论在哪一种情况下,都会调用相关的sysconf()或pathconf(),若限制不确定,则函数将返回一合理估值。虽然有欠完美,但这种解决方案往往在实践中是可行的。
- 也可以利用诸如GNU Autoconf之类的扩展工具,该工具能够确定各种系统特性及限制存在与否、如何设置。Autoconf程序可基于其收集到的信息而生成头文件,并能在C程序中将其包含①在内。关于Autoconf的更多信息,请参考http://www.gnu.org/software/ autoconf/中的内容。