【问题标题】:C how to use the function unameC如何使用函数uname
【发布时间】:2011-04-05 12:13:09
【问题描述】:

我应该编写一个函数来获取有关系统的一些信息(最重要的信息是架构)。我找到了可以使用的函数uname,包括sys/utsname.h。好吧,虽然我用谷歌搜索并阅读了文档,但我找不到该函数的任何示例,而且我不明白如何使用 uname。任何人都可以解释我如何使用它?如果你也能写一个例子那就太好了。提前致谢。

【问题讨论】:

  • 当你说平台时,你是什么意思? x86 与 x64? Linux 与 BSD? AMD 与英特尔?
  • 对不起,我没有指定,我的意思是 i686、x86、x64...

标签: c function uname


【解决方案1】:

一个完整的例子值一千字。 ;-)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/utsname.h>

int main(void) {

   struct utsname buffer;

   errno = 0;
   if (uname(&buffer) < 0) {
      perror("uname");
      exit(EXIT_FAILURE);
   }

   printf("system name = %s\n", buffer.sysname);
   printf("node name   = %s\n", buffer.nodename);
   printf("release     = %s\n", buffer.release);
   printf("version     = %s\n", buffer.version);
   printf("machine     = %s\n", buffer.machine);

   #ifdef _GNU_SOURCE
      printf("domain name = %s\n", buffer.domainname);
   #endif

   return EXIT_SUCCESS;
}

【讨论】:

  • 在失败时应该使用perror。无需专门处理EFAULT(它不会在您的代码中发生,因为buffer 是局部变量的有效地址)
  • 谢谢巴西尔。事实上perror 比switch (errno) 更好,我已经编辑了帖子以反映这一点。该代码明确地处理了EFAULT,因为我在编写它时考虑到了教学,但实际上这个特定的示例永远不会到达那里。
  • uname() 成功时可能返回0,代码必须更改为uname(&amp;buffer) &lt; 0
【解决方案2】:

从文档看来,您会像这样使用它:

struct utsname my_uname;
if(uname(&my_uname) == -1)
   printf("uname call failed!");
else
   printf("System name: %s\nNodename:%s\nRelease:%s\nVersion:%s\nMachine:%s\n",
       my_uname.sysname, my_uname.nodename, my_uname.release,my_uname.version,my_uname.machine);

【讨论】:

    【解决方案3】:

    首先,包含标题:

    #include <sys/utsname.h>
    

    然后,定义一个utsname结构:

    struct utsname unameData;
    

    然后,使用指向结构的指针调用 uname():

    uname(&unameData); // Might check return value here (non-0 = failure)
    

    在此之后,结构将包含您想要的信息:

    printf("%s", unameData.sysname);
    

    http://opengroup.org/onlinepubs/007908775/xsh/sysutsname.h.html

    【讨论】:

      【解决方案4】:

      uname() 函数采用指向 utsname 结构的指针,该结构将结果存储为输入。因此,只需做一个临时的utsname实例,将它的地址传给uname,在函数成功后读取这个struct的内容。

      struct utsname retval;
      if(uname(&retval) < 0) {     // <----
        perror("Failed to uname");
        // error handling...
      } else {
        printf("System name = %s\n", retval.sysname);
        // print other info....
        // see http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/utsname.h.html
        //   for other members...
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2015-02-02
        • 2021-05-15
        • 2018-06-20
        • 2015-02-25
        • 2014-04-20
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        相关资源
        最近更新 更多