当前位置:   article > 正文

Linux下uname命令详解及C/C++代码实现_uname()

uname()

uname 命令适用于所有类似 Linux 和 Unix 的操作系统。uname 是一个命令行实用程序,用于打印有关操作系统名称和系统硬件的基本信息。下面我们来学习了如何使用uname命令获取内核、系统、硬件和处理器信息等。

Linux uname 命令的基本示例

首先,只需在 bash 窗口的命令行中键入 uname 命令即可查看默认结果。

在这里插入图片描述

uname 命令报告有关计算机软件和硬件的基本信息。

它的语法是

在这里插入图片描述
在不带任何选项的情况下使用时,uname 报告内核(即操作系统的核心)的名称,但不报告版本号。因此,在运行某些 Linux 发行版(即版本)的系统上,它会在监视器屏幕上显示 Linux 一词。

显示内核名称

要显示内核名称,您可以使用 -s 参数。

在这里插入图片描述

输出将与不带参数的 uname 相同。

显示内核发布信息

如果您需要知道您使用的是哪个内核版本,只需使用 -r 参数

在这里插入图片描述
显示内核版本

除了内核信息,uname 还可以获取内核版本。 为此使用 -v 参数

在这里插入图片描述
显示机器的网络节点主机名

选项 -n(节点名称)将为您提供系统的主机名。 例如,如果您的主机名为“localhost.localdomain”,则 -n 选项将打印“localhost.localdomain”作为 -n 参数的输出 :
在这里插入图片描述

显示机器(硬件)类型

如果你想知道你使用的是什么类型的机器,你可以试试 -m 参数。 它会显示有关它的信息

在这里插入图片描述

输出 x86_64 表示您的系统是 64 位操作系统。如果uname -m 返回i686,表示您的系统是 32 位操作系统

显示硬件平台

与机器(硬件)类型类似,-i 选项将显示硬件平台信息。在这里插入图片描述

显示主机处理器(CPU)类型

要查看处理器类型(架构),您可以使用 -p 选项。 如果 uname 无法向您显示该信息,它将在输出中显示“未知”。

在这里插入图片描述

显示操作系统

uname 还可用于显示您正在运行的操作系统。 使用 -o 选项来实现此目的。

在这里插入图片描述
但是为了找到分发名称及其版本,您需要查看以下文件。对于 RedHat 和 CentOS,您还可以使用“/etc/redhat-release”文件。

在这里插入图片描述

在其他 Linux 发行版上,您可以使用“/etc/issue”。

cat /etc/issue

所有信息

-a(即所有)选项告诉 uname 提供以下信息:内核名称、网络节点主机名(例如,localhost.localdomain)、内核版本号和发行级别(例如,3.10.0-862.el7.x86_64) 、内核发布日期、机器硬件名称、CPU(中央处理器)类型、硬件平台和操作系统名称(例如,GNU/Linux)。

在这里插入图片描述
编码获取有关系统信息

编写一个程序来获取有关系统的一些信息(最重要的信息是体系结构)。uname() 在 buf 指向的结构中返回系统信息。 utsname 结构是

struct utsname {
    char sysname[];    /* Operating system name (e.g., "Linux") */
    char nodename[];   /* Name within "some implementation-defined
                          network" */
    char release[];    /* Operating system release (e.g., "2.6.28") */
    char version[];    /* Operating system version */
    char machine[];    /* Hardware identifier */
#ifdef _GNU_SOURCE
    char domainname[]; /* NIS or YP domain name */
#endif
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

struct utsname字符数组的大小未指定,但存储在其中的数据以空字节 (’\0’)结尾。

#include <sys/utsname.h>
int uname(struct utsname *buf);
  • 1
  • 2

uname一个系统调用,操作系统大概知道它的名字、版本和版本, 它还知道它在什么硬件上运行等等。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/utsname.h>

int main(void) 
{

   struct utsname buffer;

   errno = 0;
   if (uname(&buffer) < 0) {
      perror("uname");
      exit(EXIT_FAILURE);
   }

   printf("system name = %s\n", buffer.sysname);
   printf("node name   = %s\n", buffer.nodename);
   printf("release     = %s\n", buffer.release);
   printf("version     = %s\n", buffer.version);
   printf("machine     = %s\n", buffer.machine);

   #ifdef _GNU_SOURCE
      printf("domain name = %s\n", buffer.domainname);
   #endif

   return EXIT_SUCCESS;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

结果显示:
在这里插入图片描述

uname() 函数接受一个指向 utsname 结构的指针,该结构将存储结果作为输入。 因此,只需要创建一个临时的utsname实例,将它的地址传递给uname,在函数成功后读取这个struct的内容。

uname命令代码实现


int main(int argc, char **argv)
{
	struct utsname u;
	char machine_arch[SYS_NMLN];
	int c;
	int space = 0;
	int print_mask = 0;

	(void)setlocale(LC_ALL, "");

	while ((c = getopt(argc,argv,"amnprsv")) != -1) 
	{
		switch (c) 
		{
		case 'a':
			print_mask |= PRINT_ALL;
			break;
		case 'm':
			print_mask |= PRINT_MACHINE;
			break;
		case 'n':
			print_mask |= PRINT_NODENAME;
			break;
		case 'p':
			print_mask |= PRINT_MACHINE_ARCH;
			break;
		case 'r': 
			print_mask |= PRINT_RELEASE;
			break;
		case 's': 
			print_mask |= PRINT_SYSNAME;
			break;
		case 'v':
			print_mask |= PRINT_VERSION;
			break;
		default:
			usage();
		}
	}
	
	if (optind != argc) 
	{
		usage();
	}

	if (!print_mask) 
	{
		print_mask = PRINT_SYSNAME;
	}

	if (uname(&u) != 0) 
	{
		err(EXIT_FAILURE, "uname");

	}
	if (print_mask & PRINT_MACHINE_ARCH) 
	{
		//int mib[2] = { CTL_HW, HW_MACHINE_ARCH };
		int mib[2] = { CTL_KERN, KERN_OSTYPE };
		size_t len = sizeof (machine_arch);

		if (sysctl(mib, sizeof (mib) / sizeof (mib[0]), machine_arch,&len, NULL, 0) < 0)
			err(EXIT_FAILURE, "sysctl");
	}

	if (print_mask & PRINT_SYSNAME) 
	{
		space++;
		fputs(u.sysname, stdout);
	}
	if (print_mask & PRINT_NODENAME) 
	{
		if (space++) 
			putchar(' ');
		fputs(u.nodename, stdout);
	}
	if (print_mask & PRINT_RELEASE) 
	{
		if (space++) 
			putchar(' ');
		fputs(u.release, stdout);
	}
	if (print_mask & PRINT_VERSION) 
	{
		if (space++) 
			putchar(' ');
		fputs(u.version, stdout);
	}
	if (print_mask & PRINT_MACHINE) 
	{
		if (space++) 
			putchar(' ');
		fputs(u.machine, stdout);
	}
	if (print_mask & PRINT_MACHINE_ARCH) 
	{
		if (space++) 
			putchar(' ');
		fputs(machine_arch, stdout);
	}
	putchar('\n');

	exit(EXIT_SUCCESS);

}

static void usage(void)
{
	fprintf(stderr, "usage: uname [-amnprsv]\n");
	exit(EXIT_FAILURE);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113

编译运行:

在这里插入图片描述

总结

uname 是一个命令行实用程序,当您在没有任何选项的情况下运行 uname 命令时,它只会打印核心操作系统名称。

uname 命令用于打印基本系统信息。 它通常与 -a 选项一起调用以显示所有可用信息。

欢迎关注微信公众号【程序猿编码】,需要uname命令完整源码的添加本人微信号(c17865354792)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/80843
推荐阅读
相关标签
  

闽ICP备14008679号