|
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,返回一个基于机器互联网地址的值,这个通常对于用来做授权是没有足够安全性的。 |
|