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

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
};

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

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

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;
}

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

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);
}

编译运行:

在这里插入图片描述

总结

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值