如何使用C语言中的函数uname

16

我应该写一个函数来获取一些关于系统的信息(最重要的信息是架构)。我找到了可以使用的函数uname,包括sys/utsname.h。虽然我谷歌了并阅读了文档,但我没有找到任何函数示例,并且我不知道如何使用uname。有人可以解释一下怎么使用吗?如果您能提供一个示例就更好了。提前感谢。


当你说平台时,你指的是什么?x86 vs x64?Linux vs BSD?AMD vs Intel? - Billy ONeal
抱歉,我没有明确说明。我的意思是例如i686、x86、x64等。 - En_t8
4个回答

29

首先,包含头文件:

#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


请记得使用 struct utsname 而不是 struct ustname,否则会出现 error: storage size of ‘myVar’ isn’t known 的错误。 - vesperto

26

一个完全工作的例子胜过千言万语。;-)

#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;
}

2
在失败时应使用 perror。无需特别处理 EFAULT(在您的代码中不会发生,因为 buffer 是本地变量的有效地址)。 - Basile Starynkevitch
1
谢谢Basile。实际上,perrorswitch(errno)更好,我已经编辑了帖子以反映这一点。代码明确处理EFAULT是因为我写它是为了教学,但事实上这个特定的例子永远不会到达那里。 - tupiniquim
2
uname() 在成功的情况下可能返回0,代码必须更改为 uname(&buffer) < 0 - Étienne
看到在各种机器/发行版上的输出会更有价值。奇怪的是,即使他们费尽心思地创建了代码,也没有人这样做。 - Andrew Robinson

9

从文档上看,您可以这样使用它:

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);

6

uname() 函数需要一个指向 utsname 结构的指针作为输入,用于存储结果。因此,只需创建一个临时的 utsname 实例,将其地址传递给 uname,并在函数成功后读取该结构的内容。

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...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接