首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >uname -a输出中出现的uname Syscall缺少操作系统字符串

uname -a输出中出现的uname Syscall缺少操作系统字符串
EN

Stack Overflow用户
提问于 2021-10-20 04:00:31
回答 1查看 170关注 0票数 1

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

5.10.63-v7l+ #1459 SMP Wed Oct 6:41:57英国夏令2021 armv7l GNU/Linux

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

我试图使用C中的uname() syscall来复制它,命令页对返回的uname()结构表示如下:

代码语言:javascript
运行
复制
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选项的操作系统字符串。无名--救命显示有一个-o参数来显示操作系统,这在uname() syscall返回的结构中似乎不可用。

代码语言:javascript
运行
复制
-o, --operating-system  
       print the operating system

所以,我能做的最好的事情就是使用syscall获取以下信息,注意到"GNU/Linux“并不像uname -a给出的那样。

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

我是否可以像使用uname -o**?**那样在C程序中获得操作系统名称(在本例中是“/Linux”)

我的源代码实质上是

EN

回答 1

Stack Overflow用户

发布于 2021-10-20 08:56:40

您可以在这里读取uname代码:https://github.com/MaiZure/coreutils-8.3/blob/master/src/uname.c

在该代码中,写着:

代码语言:javascript
运行
复制
  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”。

操作系统打印为后一种:

代码语言:javascript
运行
复制
  if (toprint & PRINT_OPERATING_SYSTEM)
    print_element (HOST_OPERATING_SYSTEM);

HOST_OPERATING_SYSTEM是用gnulib定义的

我是否可以像使用uname -o那样在我的C程序中获得操作系统名称(在本例中是"GNU/Linux")?

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69640161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档