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)