Unix/Linux编程:系统标识---uname()

uname()系统调用返回了一系列关于主机系统的标识信息,存储于utsbuf所指向的结构中:

PROLOG
       This  manual  page is part of the POSIX Programmer's Manual.  The Linux implementation of this interface may differ (consult the corresponding Linux manual page for details of Linux behavior), or the interface may not be imple‐
       mented on Linux.

NAME
       uname - 获取当前系统的名称

SYNOPSIS
       #include <sys/utsname.h>

       int uname(struct utsname *name);

DESCRIPTION
       uname()函数应将标识当前系统的信息存储在按名称指向的结构中。

	   uname()函数使用<sys/utsname.h>中定义的utsname结构。

		函数的作用是:返回一个字符串,在字符数组sysname中命名当前系统。类似地,nodename应包含实现定义的通信网络中该节点的名称。阵列发行版和版本应进一步标识操作系统。阵列机应包含一个名称,用于标识系统运行的硬件。

		每个成员的格式都是实现定义的。

RETURN VALUE
	   成功完成后,应返回非负值。否则,应返回-1并设置errno以指示错误。

ERRORS
       No errors are defined.

RATIONALE
		 结构成员的值不限于与在操作系统中实现的IEEE Std 1003.1-2001的此版本的版本有任何关系。
		 相反,应用程序应依赖_POSIX_VERSION和<unistd.h>中定义的相关常量。

       IEEE Std 1003.1-2001的这一卷没有定义结构成员的大小,并允许它们具有不同的大小,尽管大多数
       实现都将它们定义为相同的大小:八个字节加一个字符串终止符。节点名的大小不足以用于许多网络。

       uname()函数起源于System III,System V和相关的实现,并且在版本74.3 BSD中不存在。它返回的
       值是在这些历史实现中的系统编译时设置的。

       4.3 BSD具有gethostname()gethostid(),它们分别返回符号名和数字值。有相关的sethostname()sethostid()函数,用于设置其他两个函数返回的值。前者功能包含在本规范中,后者则不包含在内。

SUSv3 规范了 uname(),但对 utsname 结构中各种字段的长度未加定义,仅要求字符串以空字节终止。在 Linux 中,这些字段长度均为 65 个字节,其中包括了空字节终止符所占用的空间。而在一些 UNIX 实现中,这些字段更短,但在其他操作系统(如 Solaris)中,这些字段的长度长达 257 个字节。

struct utsname
  {

    char sysname[_UTSNAME_SYSNAME_LENGTH];
    char nodename[_UTSNAME_NODENAME_LENGTH];
    char release[_UTSNAME_RELEASE_LENGTH];
    char version[_UTSNAME_VERSION_LENGTH];
    char machine[_UTSNAME_MACHINE_LENGTH];

#if _UTSNAME_DOMAIN_LENGTH - 0
# ifdef __USE_GNU
    char domainname[_UTSNAME_DOMAIN_LENGTH];
# else
    char __domainname[_UTSNAME_DOMAIN_LENGTH];
# endif
#endif
  };
  • utsname 结构中的 sysname、release、version 和 machine 字段由内核自动设置
  • odename 字段的返回值由 sethostname()系统调用设置。通常,该值类似于系统 DNS 域名中的前缀主机名。
  • domainname 字段的返回值由 setdomainname()系统调用设置。该值是主机的网络信息服务(NIS)域名(与主机域名不同)。
  • 在 Linux 中,/proc/sys/kernel 目录下的 3 个文件提供了与 utsname 结构的 sysname、release和 version 字段返回值相同的信息,这些只读文件分别为 ostype、osrelease 和 version。另外一个文件/proc/version,也包含了这些信息,并且还包含了有关内核编译的步骤信息(即执行编译的用户名、用于编译的主机名,以及使用的 gcc 版本)。
  • gethostname()系统调用(是 sethostname()函数的反向操作)用于获取系统主机名,也可利用hostname(1)命令和 Linux 特有的/proc/hostname 文件来查看和设置系统主机名
  • getdomainname()系统调用(setdomainname()函数的反向操作)用于获取 NIS 域名,也可利用 domainname(1)命令和 Linux 特有的/proc/domainname 文件来查看和设置 NIS 域名。
  • sethostname()和 setdomainname()系统调用在应用程序中鲜有使用。通常,会在系统启动时运行启动脚本来确立主机名和 NIS 域名

使用 uname()系统调用,能够获取 UNIX 的实现信息以及应用程序所运行的机器类型。


#include <zconf.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef __linux__
#define _GNU_SOURCE
#endif
#include <sys/utsname.h>

#define MAX_LINE 100
int
main(int argc, char *argv[])
{
    struct utsname uts;

    if (uname(&uts) == -1){
        perror("uname");
        exit(EXIT_FAILURE);
    }
        

    printf("Node name:   %s\n", uts.nodename);
    printf("System name: %s\n", uts.sysname);
    printf("Release:     %s\n", uts.release);
    printf("Version:     %s\n", uts.version);
    printf("Machine:     %s\n", uts.machine);
#ifdef _GNU_SOURCE
    printf("Domain name: %s\n", uts.domainname);
#endif
    exit(EXIT_SUCCESS);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值