这些例程与系统C库中的对应例程相同。在列表上下文中,各种get例程的返回值如下所示:
# 0 1 2 3 4my($name,$passwd,$gid,$members)=获取*my($name,$aliases,$addrtype,$net)=getnet*my($name,$aliases,$port,$proto)=获取服务*my($name,$aliases,$proto)=获取原型*my($name,$aliases,$addrtype,$length,@addrs)=获取主机*我的($name,$passwd,$uid,$gid,$quota,$comment、$gcos、$dir、$shell、$expire)=获取密码*# 5 6 7 8 9
(如果条目不存在,则返回值为一个无意义的真值。)
$gcos字段的确切含义各不相同,但它通常包含用户的真实姓名(与登录名相反)和与用户相关的其他信息。然而,请注意,在许多系统中,用户可以更改此信息,因此它不可信,因此$gcos受到了污染(请参阅珀尔sec). 出于同样的原因,用户的加密密码和登录shell$passwd和$shell也受到了污染。
在标量上下文中,您可以获得名称,除非函数是按名称查找的,在这种情况下,您可以获取其他内容,无论它是什么。(如果条目不存在,则会获得未定义的值。)例如:
我的$uid=getpwnam($name);我的$名称=getpwuid($num);我的$名称=getpwent();我的$gid=getgrnam($name);我的$名称=getgrgid($num);我的$名称=getgrent();#等。
在获取密码*()字段$quota、$comment和$expire是特殊的,因为它们在许多系统上不受支持。如果$quota不受支持,则它是空标量。如果支持,它通常会对磁盘配额进行编码。如果$comment字段不受支持,则它是一个空标量。如果支持,它通常会对用户的一些管理注释进行编码。在某些系统中,$quota字段可能是$change或$age,这些字段与密码老化有关。在某些系统中,$comment字段可能是$class。$expire字段(如果存在)对帐户或密码的有效期进行编码。有关系统中这些字段的可用性和确切含义,请咨询getpwnam(3)和您的系统密码。小时文件。您还可以通过使用配置
模块和值d_pw配额
,d_页面
,d_pw更改
,d_pw注释
、和d_pweire(_P)到期
只有当您的供应商以直观的方式实现了卷影密码文件,即如果您在特权下运行,或者如果存在阴影(3)System V中的功能(包括Solaris和Linux)。不太可能支持那些实现专用影子密码功能的系统。
返回的$members值获取gr*()是以空格分隔的组成员登录名列表。
对于获取主机*()函数,如果h错误号
变量在C中受支持,它将通过返回给您$?
如果函数调用失败。这个@地址
成功调用返回的值是相应库调用返回的原始地址列表。在Internet域中,每个地址都是四个字节长;你可以这样说:
my($w,$x,$y,$z)=解压缩('W4',$addr[0]);
Socket库使这一点稍微容易:
使用插座;my$iaddr=inet_aton(“127.1”);#或其他地址my$name=gethostbyaddr($iaddr,AF_INET);#或者走另一条路我的$straddr=inet_ntoa($iaddr);
相反,要将主机名解析为IP地址,可以这样写:
使用插座;my$packed_ip=gethostbyname(“www.perl.org”);我的$ip_address;if(定义$packed\ip){$ip_address=inet_ntoa($packed_ip);}
确保获取主机名
在SCALAR上下文中调用,并检查其返回值的定义。
这个获取原型编号
函数,即使它只需要一个参数,也具有列表运算符的优先级,所以要小心:
getprotobynumber$number eq'icmp'#错误getprotobynumber($number eq'icmp')#实际上是指getprotobynumber($number)eq“icmp”#这样更好
如果您厌倦了记住返回列表中的哪个元素包含哪个返回值,则在标准模块中提供了按名称命名的接口:文件::stat
,Net::招待
,网络::netent
,网络::协议
,网络::servent
,时间::gmtime
,时间::本地时间
、和用户::grent
。它们覆盖了普通的内置程序,提供了为每个字段返回具有适当名称的对象的版本。例如:
使用文件::stat;使用用户::pwent;我的$is_theirs=(stat($filename)->uid==getpwnam($wherever)->uid);
尽管看起来它们是相同的方法调用(uid),但实际上不是,因为文件::stat
对象不同于用户::pwent
对象。
在多线程环境中,其中许多函数都不安全,因为多线程可以使用它们。特别是,功能如下获取()
迭代每个进程而不是每个线程,因此如果两个线程同时迭代,两个线程都不会得到所有记录。
某些系统具有某些功能的线程安全版本,例如获取pwnam_r()
而不是获取pwnam()
在那里,Perl会自动、无形地替代线程安全版本,恕不另行通知。这意味着在某些系统上安全运行的代码可能会在其他缺少线程安全版本的系统上失败。
便携性问题:perlport中的“getpwnam”到perlport中的“endservent”.