mitsh>中定义,那么在编辑时间我们也就不能使用他们。但是,假如他们的值是
未确定的
,那么在运行时间,他们可能也是未定义的。让我们观察两个特别的例子〖CD2〗
为一个路
径名分配存储器,连同决定文档描述符数
路径名
很多程式需要为路径名分配存储器,典型地,在编辑时就为其分配了存储器,而且
使用了各
种幻数(其中很少值是正确的)作为数组长度:256,512,1024或标准I/O常数BUFS
IZ在头文
件<sys/paramh>中的43BSD常数MAXPATHLEN是正确值,但是很多43BSD应用程
序并未用
综。
POSIX1试图用PATH[CD#*2]MAX值来帮助我们,但是假如此值是不确定的,那么仍
是毫无帮
助的。程式22是个我们在全书中都将使用的为路径名动态地分配存储器的函数
。
如若在<limitsh>中定义了常数PATH[CD#*2]MAX,那么就没有任何问题,假如没有
,则需调
用pathconf。因为pathconf的返回值是把第一个参数视为基于工作目录的相对路径
名。所以
我们指定根为第一个参数,并将得到的返回值加1作为结果值。假如pathconf指明
PATH[CD#*
2]MAX是不确定的那么我们就只得猜测某个值,在调用malloc时 1,是为了在尾端
加字符串
结束符null字符(PATH[CD#*2]MAX没有考虑综)。
处理不确定结果情况的正确方法和如何使用分配到存储空间有关。例如,假如我们
为getcwd
调用分配空间,(返回当前工作目录的绝对路径名,见422节)而分配到的空间太
小,于是
返回一个出,errno配置为ERANGE。然后我们可调用realloc以增加分配空间(见7
8节和练
习418)并再试。我们能够不断这样做,直至getcwd调用成功执行。
程式22〓为路径名动态地分配空间
最大打开文档数
在精灵进程(是在后台运行,不和终端相连接的一种进程)中一个常见的代码序列是
关闭任何
打开文档。某些程式中有下列形式的代码序列:
#include <sys/paramh>
for(i=0;i<NOFILE;i )
close(i);
这段程式假定在<sys/parmh>头文档中定义了常数NOFILE。另外一些程式则使用
某些<stdi
oh>版本提供作为上限的常数[CD#*2]NFILE。某些程式则直接将其上限值定为20
。
我们希望用POSIX1的OPEN[CD#*2]MAX确定此值以提高可移植性,但是假如此值是
不确定的
,则仍然有问题,假如我们使用下列代码
#include <unistdh>
for(i=0;i<sysconf([CD#*2]SC[CD#*2]OPEN[CD#*2]MAX);i )
close(i);
而且假如OPEN[CD#*2]MAX是不确定的,那么sysconf将返回-1,于是,for循环根本
不会执行
。在这种情况下,最好的选择就是关闭任何描述符直至某个任意的限制值(例如25
6)。如同
上面的路径名相同,这并不能确保在任何情况下都能正确工作,但这却是我们所能
选择的最
好方法。我们在程式23中使用了这种技术。
程式23〓确定文档描述符数
我们能够耐心地调用close,直至得到一个出错返回,但是从close出错返回(EBAD
F)并不区
分无效描述符和并未打开的描述符。假如我们试用此技术,而且描述符9未打开,
而描述符1
0打开了,我们将停止在9上,而不会关闭10。dup函数(312节)在超过了OPEN[CD
#*2]MAX时
会返回一个特定的出错值,但是用复制一个描述符一、二百次的方法来确定此值是
一种极端
的方法。
SVR4和43 BSD的getrlimit函数(711节)连同43 BSD的getdtablesize(2)函数
返回一个
进程能够打开的最大描述符数,但是调用这两个函数不是可移植的。
OPEN[CD#*2]MAX被POSIX称为运行时不变值,其意思是在一个进程的生命期其值不
应被改变
,但是在SVR4和43 BSD之下,我们能够调用setrlimit(2)函数更改一个运行进程
的这一值
(此值也可用C shell的limit命令改变,用Bourne shell和Kornshell的limit命令
更改)假如
我们的系统支持这种功能,则能够将程式23更改为每次调用此程式时就调用sys
conf,而
不只是第一次调用此程式时。
26〓功能测试宏
正如前述,在头文档中定义了很多POSIX1和XPG3的符号。但是除了POSIX1和X
PG3定义外
,大多数实现在这些头文档中也加上了他们自己的定义。假如在编辑一道程式时,
希望他只
使用POSIX定义而不使用任何实现定义的限制,那么我们就需定义常数[CD#*2]POS
IX[CD#*2]
SOURCE,任何POSIX1头文档中都使用此常数,当该常数定义时,就能排除任何实
现专有的
定义。
常数[CD#*2]POSIX[CD#*2]SOURCE及其对应的常数[CD#*2]XOPEN[CD#*2]SOURCE被称
之为功能
测试宏,任何功能测试宏都以下划线开始,当要使用他们时,通常在CC命令行中以
下列方式
定义他们:
CC -D[CD#*2]POSIX[CD#*2]SOURCE filec
这使得在C程式包括任何头文档之前,定义了功能测试宏。假如我们只要使用POSI
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




