【问题标题】:uname Syscall Missing Operating System String Present in uname -a Outputuname Syscall 缺少操作系统字符串存在于 uname -a 输出中
【发布时间】: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

【问题讨论】:

    标签: c linux uname


    【解决方案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”)?

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

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 2021-05-11
      • 2016-06-24
      • 2012-09-20
      • 1970-01-01
      • 2022-01-23
      • 2015-04-01
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多