曲径通幽论坛

标题: 主机信息(Host Information) [打印本页]

作者: beyes    时间: 2009-2-22 23:25
标题: 主机信息(Host Information)
uname 命令可以打印出系统的相关信息。
uname 也作为系统调用而存在,它在 C 程序里提供了同样的信息(同uname命令一样),详情见 man 2 uname .

如果系统已经安装了网络组件,你可以通过 gethostname() 函数很容易就获得了网络名:

#include <unistd.h>
int gethostname(char *name, size_t namelen);

gethostname() 函数把机器的网络名写到参数 name 中。这个网络名字符串假设至少 namelen 个字符长度。
gethostname() 函数如果执行成功就返回 0;否则就返回 -1 。

从 uname 系统调用中可以获得更多的主机详细信息:
#include <sys/utsname.h>
int uname(struct utsname *name);

uname() 函数把主机信息向到由 name 参数指向的结构体中。utsname 结构体定义在 sys/utsname.h 里,必须包含至少以下所示成员:

utsname Member                 Description
char sysname[]                    操作系统名
char nodename[]                   主机名
char release[]                      系统的释放版本号release level(如CentOS的一个内核版本号:2.6.18-92.1.22.el5xen)
char version[]                      系统版本号
char machine[]                     硬件类型

uname 成功执行则返回一个非负整数数,否则返回 -1 并且还设置 errno 以示有错误。

示例代码
01 #include <sys/utsname.h>
02 #include <unistd.h>
03 #include <stdio.h>
04 #include <stdlib.h>
05
06 int main()
07 {
08         char computer[256];
09         struct utsname uts;
10
11         if(gethostname(computer, 255) != 0 || uname(&uts) < 0) {
12                 fprintf(stderr, "Could not get host information\n");
13                 exit(1);
14         }
15
16         printf("Computer host name is %s\n", computer);
17
18         printf("System is %s on %s hardware\n", uts.sysname, uts.machine);
19         printf("Nodename is %s\n", uts.nodename);
20         printf("Version is %s, %s\n", uts.release, uts.version);
21         exit(0);
22 }
运行输出
[root@localhost C]# ./hostget.exe
Computer host name is localhost.localdomain
System is Linux on i686 hardware
Nodename is localhost.localdomain
Version is 2.6.18-92.1.22.el5xen, #1 SMP Tue Dec 16 13:08:49 EST 2008

说明
注意,由 uname 返回的字符串格式是“实现相关的”(implementation-dependent),版本字符串包含内核编译的日期。

对于每一个主机,从 gethostid() 函数里可能得到一个可用的特定标识符:
#include <unistd.h>
long gethostid(void);

gethostid() 函数倾向于返回一个主机的特定值。证书管理员使用这来确保软件仅可以在这台持有有效授权(证书)的机器上运行。在Sun 工作站上,它返回一个当计算机建好时就被存储在非易失存储器中的一个数字,这个数字是这个系统硬件所特有的。其它系统,如 Linux,返回一个基于机器互联网地址的值,这个通常对于用来做授权是没有足够安全性的。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2