strace 跟踪 uname 命令执行

strace 跟踪得到下面这些关键信息:

uname({sysname="Linux", nodename="debian-10", ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x1), ...}) = 0
write(1, "Linux debian-10 4.19.0-16-amd64 "..., 87Linux debian-10 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 GNU/Linux

关键的过程是调用 uname 系统调用,然后输出获取到的信息。

uname 命令示例代码

#include <sys/utsname.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>int main(int argc, char *argv[])
{struct utsname buf;if (uname(&buf) < 0) {perror("uname failed\n");return errno;}printf("nodename is %s, release is %s, version is %s, machine is %s\n",buf.nodename, buf.release, buf.version, buf.machine);return 0;
}

运行示例如下:

$ ./uname
nodename is kali, release is 4.19.0-kali4-amd64, version is #1 SMP Debian 4.19.28-2kali1 (2019-03-18), machine is x86_64

uname 函数

示例代码通过调用 uname 函数来获取信息,uname 函数部分 manual 信息摘录如下:

       #include <sys/utsname.h>int uname(struct utsname *buf);DESCRIPTIONuname() returns system information in the structure pointed to by buf.  The utsname struct is defined in <sys/utsname.h>:struct utsname {char sysname[];    /* Operating system name (e.g., "Linux") */char nodename[];   /* Name within "some implementation-definednetwork" */char release[];    /* Operating system release (e.g., "2.6.28") */char version[];    /* Operating system version */char machine[];    /* Hardware identifier */#ifdef _GNU_SOURCEchar domainname[]; /* NIS or YP domain name */#endif};The length of the arrays in a struct utsname is unspecified (see NOTES); the fields are terminated by a null byte ('\0').

manual 中没有指定 utsname 结构体不同字段的大小,但 c 语言的数组定义必须确定大小。manual 中提到了历史原因,相关信息摘录如下:

   C library/kernel differencesOver time, increases in the size of the utsname structure have led to three successive versions of uname(): sys_olduname() (slot __NR_oldolduname), sys_uname() (slot  __NR_olduname),  and  sys_newu‐name()  (slot  __NR_uname).  The first one used length 9 for all fields; the second used 65; the third also uses 65 but adds the domainname field.  The glibc uname() wrapper function hides these de‐tails from applications, invoking the most recent version of the system call provided by the kernel.

libc 库的 utsname.h 头文件示例

我的虚拟机中,sys/utsname.h 文件路径为 /usr/include/x86_64-linux-gnu/bits/utsname.h,utsname 结构体定义如下:

/* Structure describing the system and machine.  */
struct utsname{/* Name of the implementation of the operating system.  */char sysname[_UTSNAME_SYSNAME_LENGTH];/* Name of this node on the network.  */char nodename[_UTSNAME_NODENAME_LENGTH];/* Current release level of this implementation.  */char release[_UTSNAME_RELEASE_LENGTH];/* Current version level of this release.  */char version[_UTSNAME_VERSION_LENGTH];/* Name of the hardware type the system is running on.  */char machine[_UTSNAME_MACHINE_LENGTH];#if _UTSNAME_DOMAIN_LENGTH - 0/* Name of the domain of this node on the network.  */
# ifdef __USE_GNUchar domainname[_UTSNAME_DOMAIN_LENGTH];
# elsechar __domainname[_UTSNAME_DOMAIN_LENGTH];
# endif
#endif};

_UTSNAME_DOMAIN_LENGTH/usr/include/x86_64-linux-gnu/bits/utsname.h 中被定义为 65。

uname 命令如何实现?相关推荐

  1. linux uname 命令

    2019独角兽企业重金招聘Python工程师标准>>> uname 命令可用于大多数 UNIX 和类 UNIX 系统以及 Linux. 功能说明:uname用来获取电脑和操作系统的相 ...

  2. linux uname 命令详解

    linux uname 命令详解 功能说明:显示系统信息. 语 法:uname [-amnrsv][--help][--version] 补充说明:uname可显示电脑以及操作系统的相关信息. 参 数 ...

  3. 【Linux】一步一步学Linux——uname命令(72)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 uname命令的英文全称即"Unix name& ...

  4. linux uname命令参数及用法详解--linux查看系统信息命令

    uname 命令可用于大多数 UNIX 和类 UNIX 系统以及 Linux. 功能说明:uname用来获取电脑和操作系统的相关信息. 语 法:uname [-amnrsvpio][--help][- ...

  5. Linux 命令(33)—— uname 命令

    1.命令简介 uname 命令用于打印当前系统相关信息(内核版本号.硬件架构.主机名称和操作系统类型等). 2.命令格式 uname [OPTION]... uname 未指定任何选项时,默认选项为 ...

  6. Linux uname命令

    一.简介 uname 命令将正在使用的操作系统名写到标准输出中. 二.语法 -a 显示 -m. -n. -r. -s 和 -v 标志指定的所有信息.不能与 -x 或 -SName 标志连用.如果 -x ...

  7. 嵌入式设备查看系统的版本、编译时间、架构等信息(uname命令)

    前言 拿到一台嵌入式设备,有时候我们需要知道设备运行的Liunx系统的版本信息,但是查看Linux源码又很麻烦,或者说没有kernel的源码.此时我们进入到设备的命令行,可以通过uname命令进行查看 ...

  8. uname命令使用和uname系统调用

    前言 使用uname命令的好处: 1 使用uname命令可以写出可移植的shell 2 使用uname命令可以写出可移植的Makefile 使用uname系统调用的好处: 使用uname系统调用可以写 ...

  9. Linux常用命令——uname命令

    在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) uname 显示Linux系统信息 补充说明 uname命令用于打印当前系统相关信息(内核版本号. ...

最新文章

  1. 机器学习实践:了解数据核心的通用方法!
  2. python 描述器_python 描述器
  3. 需求分析师的工作重点
  4. JZOJ 3852. 【NOIP2014八校联考第2场第2试9.28】单词接龙(words)
  5. 大数据分析要学习什么_为什么要学习数据分析
  6. MyBatis映射文件1(增删改、insert获取自增主键值)
  7. (hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)
  8. 经典同步问题二——哲学家进餐问题
  9. 安装pangolin
  10. springboot不会运行gc_SpringBoot 深度调优,让你的项目飞起来!
  11. c4d导出obj格式有破面_c4d导出obj格式错误怎么办 c4d导出obj格式教程
  12. 数字转换成金额大写的小程序
  13. 音视频开发(四十四):M3U8边缓存边播放
  14. 大恒相机连续采集并保存图片
  15. 作为iOS开发者,你不可错过的资源
  16. 上海职业学校计算机证书查询,证书查询
  17. 华为认证云服务架构专家正式发布!
  18. Flink 入门教程
  19. 后端编译与优化(JIT,即时编译器)
  20. 货币政策市场化协同与大数据机制研究

热门文章

  1. 一张图看明白电信云解决方案架构
  2. 面试:自我问题反思总结
  3. mysql数据库巡检工作内容_数据库巡检
  4. 最受java程序员欢迎的极佳性能测试工具
  5. 浅析手机网页制作流程
  6. Revit API 开发 (10): ExtensibleStorage 外部存储
  7. sass、scss、css、less
  8. 基础理论—需求定律与供给定律分析…
  9. 支付宝小程序服务器要求,支付宝小程序:支付宝服务端SDK
  10. Svchost.exe占用内存过大解决