uname Syscall 缺少操作系统字符串存在于 uname -a 输出中

Posted

技术标签:

【中文标题】uname Syscall 缺少操作系统字符串存在于 uname -a 输出中【英文标题】:uname Syscall Missing Operating System String Present in uname -a Output 【发布时间】:2021-12-06 22:20:29 【问题描述】:

当我在命令行上运行uname -a 时,我得到以下输出:

Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux

这是通过-a参数实现的,相当于使用这些参数(有6个)-snrvmo

我正在尝试使用 C 中的 uname() 系统调用来复制它。manpage 对我返回的 uname() 结构表示以下内容:

DESCRIPTION
       uname()  returns system information in the structure pointed to by buf.  The utsname struct is de‐
       fined in <sys/utsname.h>:

           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
           ;

您会注意到没有与命令行uname -o 选项对应的操作系统字符串。 uname --help 显示有一个 -o 参数来显示操作系统,并且在 uname() 系统调用返回的结构中似乎不可用。

-o, --operating-system  
       print the operating system

所以我似乎能做的最好的事情是使用系统调用获取以下信息,指出“GNU/Linux”并不像uname -a 给出的那样结束:

Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l

有没有办法像使用 uname -o 一样在我的 C 程序中获取操作系统名称(在本例中为“GNU/Linux”)?My source code is essentially this

【问题讨论】:

【参考方案1】:

您可以在此处阅读uname 代码:https://github.com/MaiZure/coreutils-8.3/blob/master/src/uname.c

在那段代码中,写着:

  if (toprint
       & (PRINT_KERNEL_NAME | PRINT_NODENAME | PRINT_KERNEL_RELEASE
          | PRINT_KERNEL_VERSION | PRINT_MACHINE))
    
      struct utsname name;

      if (uname (&name) == -1)
        die (EXIT_FAILURE, errno, _("cannot get system name"));

      if (toprint & PRINT_KERNEL_NAME)
        print_element (name.sysname);
      if (toprint & PRINT_NODENAME)
        print_element (name.nodename);
      if (toprint & PRINT_KERNEL_RELEASE)
        print_element (name.release);
      if (toprint & PRINT_KERNEL_VERSION)
        print_element (name.version);
      if (toprint & PRINT_MACHINE)
        print_element (name.machine);
    

我们可以理解为:“如果必须打印内核信息、节点或机器,请使用uname syscall”。

操作系统稍后打印:

  if (toprint & PRINT_OPERATING_SYSTEM)
    print_element (HOST_OPERATING_SYSTEM);

HOST_OPERATING_SYSTEMgnulib 中定义

有没有办法像使用 uname -o 一样在我的 C 程序中获取操作系统名称(在本例中为“GNU/Linux”)?

由于一个编译好的软件只能被一个操作系统使用,你可以想象在构建时设置它。

【讨论】:

以上是关于uname Syscall 缺少操作系统字符串存在于 uname -a 输出中的主要内容,如果未能解决你的问题,请参考以下文章

在macOS上用Linux syscall实现虚拟机管理

指令篇: 查看系统版本信息___uname

[二进制安全学习]ret2syscall

CentOS 7 查看系统版本信息

STM32 Cubemx Printf重定向

32位系统调用表入口点如何映射到x86_64中的SYSCALL_DEFINE