uname

主机信息

正如我们可以确定用户信息一样,程序也可以确定其运行的计算机的信息。uname命令提供了这些信息。uname同时也作为一个系统调用来在一个C程序中提供同样的信息,我们可以使用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/ustname.h中,大多数至少包含下列成员:

成员 描述
char sysname[] 操作系统名
char nodename[] 主机名
char release[] 系统发行级别
char version[] 系统版本号
char machine[] 硬件类型

如果成功,uname函数会返回一个非负数,否则返回-1,同时设置errno来指示错误。

这里写图片描述

试验--主机信息

下面是一个程序,hostget.c,来得到主机信息:

#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
    char computer[256];
    struct utsname uts;
    if(gethostname(computer, 255) != 0 || uname(&uts) < 0) {
        fprintf(stderr, “Could not get host information/n”);
        exit(1);
    }
    printf(“Computer host name is %s/n”, computer);
    printf(“System is %s on %s hardware/n”, uts.sysname, uts.machine);
    printf(“Nodename is %s/n”, uts.nodename);
    printf(“Version is %s, %s/n”, uts.release, uts.version);
    exit(0);
}

程序会产生如下的Linux特定的输出。如果我们的机器处在网络中,我们就会发现一个包含网络的扩展主机名:

$ ./hostget
Computer host name is beast
System is Linux on i686 hardware
Nodename is beast
Version is 2.4.19-4GB, #1 Wed Nov 27 00:56:40 UTC 2002

工作原理

这个程序会调用gethostname函数来得到主机的网络名。在前面的例子中,其得到的名字为tilde。更为详细的信息是由unmae函数调用得到的。注意,函数uname所返回的字符串是依赖于实现的;在这个例子中,版本号包含所编译的内核的数据。

由gethostid函数可以得到一个唯一的主机号:

#include <unistd.h>
long gethostid(void);

gethostid函数会返回一个唯一的主机号。授权管理通常使用这个函数来确保软件程序只可以运行一个具有合法授权的机器上。在Sun工作站上,他会返回一个机器在制造时在不可变内存中设置的一个数,所以,对于系统硬件,这是唯一的。

其他的系统,例如Linux,会返回一个基于机器网络地址的值,通常对于授权是足够安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值