![Linux程序设计(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/825/26211825/b_26211825.jpg)
4.6 主机信息
正如程序可以查找用户信息一样,程序也可以获得运行它的计算机的有关细节。uname命令就提供这类信息。我们还可以通过同名的系统调用在C语言程序中提供同样的信息——请使用man 2 uname命令在手册页的系统调用部分(第2部分)查找它的用法。
主机信息在许多情况下都是很有用的。你可能希望根据程序运行的机器在网络上的名字来定制程序的行为,比如说,这台机器是学生用的还是管理员用的。从许可证的角度考虑,你可能希望限制程序只能在一台机器上运行。所有这些都意味着你需要一个方法来确定程序运行在哪台机器上。
如果系统安装了网络组件,你可以通过gethostname函数很容易地获取它的网络名:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0153_0001.jpg?sign=1738975260-ILg6B11z9iIDQoChucKJrJ9MRnjj9VrX-0-9d9c37c40c6cb61e7afc54ea9c388087)
gethostname函数把机器的网络名写入name字符串。该字符串至少有namelen个字符长。成功时,gethostname返回0,否则返回-1。
你可以通过uname系统调用获得关于主机的更多详细信息:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0153_0002.jpg?sign=1738975260-n1SB6KR6li7z3PdVjmCUcgpLcqVzTB2h-0-120ebc860a6641d4cf8ac85227d21c7f)
uname函数把主机信息写入name参数指向的结构。utsname结构定义在头文件sys/utsname.h中,它至少包含表4-5所示的成员。
表4-5
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0153_0003.jpg?sign=1738975260-VFVhdqs4naoDrs1JuK8dJrvLCXPPinXq-0-e028e8c5477079170740e7b33a678bb5)
uname在成功时返回一个非负整数,否则返回-1并设置errno来指出错误。
实验 主机信息
下面的程序hostget.c能够提取出一些主机信息:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0153_0004.jpg?sign=1738975260-TNZZ5bVfLNUYvLp1E0bWEtf3PoCVS5hg-0-3e967ec3dac74eed59c13c4954ad0774)
它给出如下所示的Linux特有的输出。如果你的机器联网了,你可能会看到一个包含网络名在内的扩展主机名。
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0154_0002.jpg?sign=1738975260-iUs4crse8gt3TgSxrKomTaCbpPjzl9Hd-0-e665cf6cc3fedcc2a568fa48683d6b88)
实验解析
这个程序调用gethostname来获得主机的网络名。在上面的例子中,它获得名字suse103。有关这台基于Intel Pentium-4的Linux计算机的更多信息通过uname调用返回。注意,uname返回的字符串的格式是与具体实现相关的,在本例中,版本字符串包含内核编译的日期。
使用uname函数的另外一个例子请参看uname命令的Linux源代码。
每台主机的唯一标识符可以通过gethostid函数获得:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0154_0003.jpg?sign=1738975260-ZYMqwJE4lT0WFglgYVYkqazlk2x8WH3B-0-8aff5aff84ef8a0642e41cc684344d6b)
gethostid函数返回与主机对应的一个唯一值。许可证管理者利用它来确保软件程序只能在拥有合法许可证的机器上运行。在Sun工作站上,该函数返回计算机生产时设置在非易失性存储器中的一个数字,它对系统硬件来说是唯一的。其他系统,如Linux,返回一个基于该机器因特网地址的值,但这对许可证管理来说还不够安全。