1

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

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

这是通过-a等效于使用这些参数的参数来实现的(有6个)-snrvmo

我正在尝试使用uname()C 中的系统调用来复制它。联机帮助页对我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

有没有办法像我可以使用的那样在我的 C 程序中获取操作系统名称(在本例中为“GNU/Linux”)uname -o
我的源代码本质上是这样的

4

1 回答 1

2

你可以在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系统调用”。

操作系统稍后打印:

  if (toprint & PRINT_OPERATING_SYSTEM)
    print_element (HOST_OPERATING_SYSTEM);

HOST_OPERATING_SYSTEM定义在gnulib

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

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

于 2021-10-20T08:56:40.080 回答