手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

第二章 Unix标准化及实现

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


mitsh>中定义,那么在编辑时间我们也就不能使用他们。但是,假如他们的值是

未确定的

,那么在运行时间,他们可能也是未定义的。让我们观察两个特别的例子〖CD2〗

为一个路

径名分配存储器,连同决定文档描述符数

路径名

很多程式需要为路径名分配存储器,典型地,在编辑时就为其分配了存储器,而且

使用了各

种幻数(其中很少值是正确的)作为数组长度:256,512,1024或标准I/O常数BUFS

IZ在头文

件<sys/paramh>中的43BSD常数MAXPATHLEN是正确值,但是很多43BSD应用程

序并未用

综。

POSIX1试图用PATH[CD#*2]MAX值来帮助我们,但是假如此值是不确定的,那么仍

是毫无帮

助的。程式22是个我们在全书中都将使用的为路径名动态地分配存储器的函数

。

如若在<limitsh>中定义了常数PATH[CD#*2]MAX,那么就没有任何问题,假如没有

,则需调

用pathconf。因为pathconf的返回值是把第一个参数视为基于工作目录的相对路径

名。所以

我们指定根为第一个参数,并将得到的返回值加1作为结果值。假如pathconf指明

PATH[CD#*

2]MAX是不确定的那么我们就只得猜测某个值,在调用malloc时 1,是为了在尾端

加字符串

结束符null字符(PATH[CD#*2]MAX没有考虑综)。

处理不确定结果情况的正确方法和如何使用分配到存储空间有关。例如,假如我们

为getcwd

调用分配空间,(返回当前工作目录的绝对路径名,见422节)而分配到的空间太

小,于是

返回一个出,errno配置为ERANGE。然后我们可调用realloc以增加分配空间(见7

8节和练

习418)并再试。我们能够不断这样做,直至getcwd调用成功执行。

程式22〓为路径名动态地分配空间

最大打开文档数

在精灵进程(是在后台运行,不和终端相连接的一种进程)中一个常见的代码序列是

关闭任何

打开文档。某些程式中有下列形式的代码序列:

#include <sys/paramh>

for(i=0;i<NOFILE;i )

close(i);

这段程式假定在<sys/parmh>头文档中定义了常数NOFILE。另外一些程式则使用

某些<stdi

oh>版本提供作为上限的常数[CD#*2]NFILE。某些程式则直接将其上限值定为20

。

我们希望用POSIX1的OPEN[CD#*2]MAX确定此值以提高可移植性,但是假如此值是

不确定的

,则仍然有问题,假如我们使用下列代码

#include <unistdh>

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)。如同

上面的路径名相同,这并不能确保在任何情况下都能正确工作,但这却是我们所能

选择的最

好方法。我们在程式23中使用了这种技术。

程式23〓确定文档描述符数

我们能够耐心地调用close,直至得到一个出错返回,但是从close出错返回(EBAD

F)并不区

分无效描述符和并未打开的描述符。假如我们试用此技术,而且描述符9未打开,

而描述符1

0打开了,我们将停止在9上,而不会关闭10。dup函数(312节)在超过了OPEN[CD

#*2]MAX时

会返回一个特定的出错值,但是用复制一个描述符一、二百次的方法来确定此值是

一种极端

的方法。

SVR4和43 BSD的getrlimit函数(711节)连同43 BSD的getdtablesize(2)函数

返回一个

进程能够打开的最大描述符数,但是调用这两个函数不是可移植的。

OPEN[CD#*2]MAX被POSIX称为运行时不变值,其意思是在一个进程的生命期其值不

应被改变

,但是在SVR4和43 BSD之下,我们能够调用setrlimit(2)函数更改一个运行进程

的这一值

(此值也可用C shell的limit命令改变,用Bourne shell和Kornshell的limit命令

更改)假如

我们的系统支持这种功能,则能够将程式23更改为每次调用此程式时就调用sys

conf,而

不只是第一次调用此程式时。

26〓功能测试宏

正如前述,在头文档中定义了很多POSIX1和XPG3的符号。但是除了POSIX1和X

PG3定义外

,大多数实现在这些头文档中也加上了他们自己的定义。假如在编辑一道程式时,

希望他只

使用POSIX定义而不使用任何实现定义的限制,那么我们就需定义常数[CD#*2]POS

IX[CD#*2]

SOURCE,任何POSIX1头文档中都使用此常数,当该常数定义时,就能排除任何实

现专有的

定义。

常数[CD#*2]POSIX[CD#*2]SOURCE及其对应的常数[CD#*2]XOPEN[CD#*2]SOURCE被称

之为功能

测试宏,任何功能测试宏都以下划线开始,当要使用他们时,通常在CC命令行中以

下列方式

定义他们:

CC -D[CD#*2]POSIX[CD#*2]SOURCE filec

这使得在C程式包括任何头文档之前,定义了功能测试宏。假如我们只要使用POSI

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!