在 C 语言中查找系统主机名

Jinku Hu 2023年10月12日
  1. 使用 gethostname 函数在 C 语言中查找系统主机名
  2. 在 C 语言中使用 uname 函数查找系统主机名
在 C 语言中查找系统主机名

本文将介绍几种在 C 语言中查找系统主机名的方法。

使用 gethostname 函数在 C 语言中查找系统主机名

gethostname 函数是 POSIX 规范的一部分,用于访问系统主机名。该函数有两个参数:char*指向存储主机名的缓冲区。char*指向存储主机名的缓冲区和表示缓冲区长度的字节数。成功时函数返回 0,错误时返回-1。注意 POSIX 系统可能对 hostname 的长度有一个最大的字节数定义,所以用户应该分配足够大的缓冲区来存储检索到的值。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

enum { MAX_SIZE = 256 };

int main(void) {
  int ret;
  char hostname[MAX_SIZE];

  ret = gethostname(&hostname[0], MAX_SIZE);
  if (ret == -1) {
    perror("gethostname");
    exit(EXIT_FAILURE);
  }
  printf("Hostname:    %s\n", hostname);

  exit(EXIT_SUCCESS);
}

输出:

Hostname:    lenovo-pc

前面的例子演示了对 gethostname 函数的基本调用,但人们应该始终实现错误报告例程,以确保故障安全代码和信息丰富的日志信息。由于 gethostname 设置了 errno 值,我们可以在 switch 语句中对其进行评估,并将相应的信息打印到 stderr 流中。

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

enum { MAX_SIZE = 256 };

int main(void) {
  int ret;
  char hostname[MAX_SIZE];

  errno = 0;
  ret = gethostname(&hostname[0], MAX_SIZE);
  if (ret == -1) {
    switch (errno) {
      case EFAULT:
        fprintf(stderr, "'name' argument is an invalid address");
        break;
      case EINVAL:
        fprintf(stderr, "'len' argument is negative");
        break;
      default:
        perror("gethostname");
    }
    exit(EXIT_FAILURE);
  }
  printf("Hostname:    %s\n", hostname);

  exit(EXIT_SUCCESS);
}

输出:

Hostname:    lenovo-pc

在 C 语言中使用 uname 函数查找系统主机名

另外,还可以利用 uname 函数调用来查找系统主机名。uname 一般可以检索到系统的几个数据点,即操作系统名称、操作系统发布日期和版本、硬件标识符和主机名。但注意,uname 将上述信息存储在 <sys/utsname.h> 头文件中定义的 utsntheame 结构中。该函数接收指向 utsname 结构的指针,并在调用成功后返回零值。uname 也会在失败时设置 errno,当传递给 utsname 结构的指针无效时,定义 EFAULT 值作为指示。

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

enum { MAX_SIZE = 256 };

int main(void) {
  struct utsname uts;

  if (uname(&uts) == -1) perror("uname");

  printf("Node name:   %s\n", uts.nodename);
  printf("System name: %s\n", uts.sysname);
  printf("Release:     %s\n", uts.release);
  printf("Version:     %s\n", uts.version);
  printf("Machine:     %s\n", uts.machine);

  exit(EXIT_SUCCESS);
}

输出:

Hostname:    lenovo-pc
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C Networking