C как использовать функцию uname - PullRequest
14 голосов
/ 29 августа 2010

Я должен написать функцию, чтобы получить некоторую информацию о системе (самая важная информация - это архитектура).Я нашел функцию uname , которую можно использовать, включая sys / utsname.h .Ну, хотя я гуглил и читал документацию, я не смог найти ни одного примера функции и не понимаю, как использовать uname.Кто-нибудь может объяснить мне, как его использовать?было бы здорово, если бы вы тоже могли написать пример.Заранее спасибо.

Ответы [ 4 ]

25 голосов
/ 29 августа 2010

Сначала включите заголовок:

#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

15 голосов
/ 24 декабря 2014

Полностью рабочий пример стоит тысячи слов. ; -)

#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;
}
9 голосов
/ 29 августа 2010

Из документации видно, что вы использовали бы ее так:

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 голосов
/ 29 августа 2010

Функция 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...
}
...