在 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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.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
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn