C 言語でのシステムホスト名を検索する
この記事では、C 言語でシステムのホスト名を検索する方法をいくつか説明します。
C 言語でシステムホスト名を見つけるには gethostname
関数を使用する
関数 gethostname
は POSIX 仕様の一部であり、システムのホスト名にアクセスするために用いられます。この関数は 2つの引数をとります。char*
は取得したホスト名が格納されるバッファを指し、char*
はバッファの長さを示すバイト数を指定します。この関数は成功した場合は 0 を返し、エラーの場合は-1 を返します。POSIX システムではホスト名の長さの最大バイト数が定義されている可能性が高いので、ユーザは取得した値を格納するのに十分な大きさのバッファを割り当てるべきであることに注意してください。
cCopy#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);
}
出力:
textCopyHostname: lenovo-pc
前の例では gethostname
関数の基本的な呼び出しを示しましたが、フェイルセーフコードと有益なロギングメッセージを確実にするために、常にエラー報告ルーチンを実装すべきです。gethostname
は errno
値を設定するので、switch
文で評価し、対応するメッセージを stderr
ストリームに出力することができます。
cCopy#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);
}
出力:
textCopyHostname: lenovo-pc
関数 uname
を用いて C 言語でシステムホスト名を検索する
あるいは、システムのホスト名を見つけるために uname
関数呼び出しを利用することもできます。uname
は一般的にシステムに関するいくつかのデータポイント、すなわちオペレーティングシステム名、オペレーティングシステムのリリース日とバージョン、ハードウェア識別子、ホスト名を取得することができます。しかし、uname
は上記の情報を <sys/utsname.h>
ヘッダファイルで定義された utsntheame
構造体に格納していることに注意してほしい。この関数は utsname
構造体へのポインタを受け取り、呼び出しに成功した場合は 0 を返します。また、uname
は失敗時に errno
を設定し、utsname
構造体へのポインタが無効な場合の表示として EFAULT
を定義します。
cCopy#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);
}
出力:
textCopyHostname: lenovo-pc