C 言語でのシステムホスト名を検索する
 
この記事では、C 言語でシステムのホスト名を検索する方法をいくつか説明します。
C 言語でシステムホスト名を見つけるには gethostname 関数を使用する
    
関数 gethostname は POSIX 仕様の一部であり、システムのホスト名にアクセスするために用いられます。この関数は 2つの引数をとります。char* は取得したホスト名が格納されるバッファを指し、char* はバッファの長さを示すバイト数を指定します。この関数は成功した場合は 0 を返し、エラーの場合は-1 を返します。POSIX システムではホスト名の長さの最大バイト数が定義されている可能性が高いので、ユーザは取得した値を格納するのに十分な大きさのバッファを割り当てるべきであることに注意してください。
#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
関数 uname を用いて C 言語でシステムホスト名を検索する
あるいは、システムのホスト名を見つけるために uname 関数呼び出しを利用することもできます。uname は一般的にシステムに関するいくつかのデータポイント、すなわちオペレーティングシステム名、オペレーティングシステムのリリース日とバージョン、ハードウェア識別子、ホスト名を取得することができます。しかし、uname は上記の情報を <sys/utsname.h> ヘッダファイルで定義された utsntheame 構造体に格納していることに注意してほしい。この関数は utsname 構造体へのポインタを受け取り、呼び出しに成功した場合は 0 を返します。また、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
